Voici la documentation : https://geoplateforme.pages.gpf-tech.ign.fr/documentation

Skip to content
Extraits de code Groupes Projets

Refactor/get gpf extent

Tous les fils de conversation ont été résolus !
Fusionnées Quy Thy Truong a demandé de fusionner refactor/get-gpf-extent vers main
Tous les fils de conversation ont été résolus !
Fichiers
4
@@ -3,6 +3,7 @@
import logging
from pathlib import Path
from gpf_entrepot_toolbelt.orchestrator.models.extent import GpfExtent
from gpf_entrepot_toolbelt.orchestrator.status import Status
from osgeo import gdal, ogr, osr
@@ -120,7 +121,41 @@ def read_vector_file(filepath: Path) -> ogr.DataSource | gdal.Dataset | None:
return dataSource
def check_vector_file(filepath: Path, crs: str, global_extent: ogr.Geometry) -> Status:
def get_gpf_extent(layer: ogr.Layer, crs: str) -> GpfExtent:
"""Calule l'extent d'une couche.
Args:
layer (ogr.Layer): couche lue par GDAL
crs (str): Système de projection de la livraison
Returns:
GpfExtent: Extent de la couche
"""
xmin, xmax, ymin, ymax = layer.GetExtent()
# Reprojection of the extent to 4326 if need
if crs != "EPSG:4326":
try:
source = osr.SpatialReference()
source.SetFromUserInput(crs)
target = osr.SpatialReference()
target.SetFromUserInput("EPSG:4326")
transform = osr.CoordinateTransformation(source, target)
xmin, ymin, _ = transform.TransformPoint(xmin, ymin)
xmax, ymax, _ = transform.TransformPoint(xmax, ymax)
except Exception as err:
logger.user_error(
f"Erreur de reprojection de {layer.GetDescription()} dans le système "
f"EPSG:4326. Trace : {err}",
stack_info=True,
)
return Status.FAILURE
extent = (xmax, xmin, ymax, ymin) # East, West, North, South
return GpfExtent(extent)
def check_vector_file(filepath: Path, crs: str) -> tuple[Status, GpfExtent]:
"""Vérification de la validité d'un fichier vecteur, et ajout de l'extent du fichier
à l'extent globale de la livraison.
@@ -134,10 +169,12 @@ def check_vector_file(filepath: Path, crs: str, global_extent: ogr.Geometry) ->
Status: Etat de la vérification
"""
try:
datasource_extent = GpfExtent()
logger.user_info(f"Ouverture du fichier {str(filepath)}")
dataSource = read_vector_file(filepath=filepath)
if dataSource is None:
return Status.FAILURE
return Status.FAILURE, datasource_extent
# Pour chaque layer dans la datasource
layerCount = dataSource.GetLayerCount()
@@ -172,23 +209,22 @@ def check_vector_file(filepath: Path, crs: str, global_extent: ogr.Geometry) ->
)
logger.user_error(f"SRS de {layer.GetName()} : {layer_srs}")
logger.user_error(f"SRS déclaré : {defined_srs}")
return Status.FAILURE
return Status.FAILURE, datasource_extent
else:
logger.user_info(f"Layer SRS : {layer_srs}")
# Analyse de la geometrie
logger.user_info("Analyse de la géométrie")
if is_geom_layer(layer):
get_geom_type(layer)
extent = get_layer_extent(layer, crs)
global_extent.AddGeometry(extent)
layer_extent = get_gpf_extent(layer, crs)
datasource_extent.add_extent(layer_extent)
logger.user_info("-" * 40)
return Status.SUCCESS
return Status.SUCCESS, datasource_extent
except Exception as e:
logger.user_error(f"TECHNICAL ERROR: {e}")
return Status.TECHNICAL_ERROR
return Status.TECHNICAL_ERROR, datasource_extent
def input_crs_is_valid(crs: str) -> bool:
@@ -207,9 +243,7 @@ def input_crs_is_valid(crs: str) -> bool:
return True
def check_vector_generic(
filepath: Path, crs: str = None, global_extent: ogr.Geometry = None
) -> Status:
def check_vector_generic(filepath: Path, crs: str = None) -> tuple[Status, GpfExtent]:
"""Vérifie un fichier vecteur.
Args:
@@ -221,9 +255,13 @@ def check_vector_generic(
Status: Statut de la vérification
"""
global_extent = GpfExtent()
logger.user_info(f"Analyse du fichier : {filepath.resolve()}")
if filepath.suffix.lower() == ".sql":
ret = check_sql(filepath)
else:
ret = check_vector_file(filepath, crs, global_extent)
return ret
ret, extent = check_vector_file(filepath, crs)
if ret == Status.SUCCESS:
logger.user_info("Ajoute l'extent calculée à l'extent globale")
global_extent.add_extent(extent)
return ret, global_extent
Chargement en cours