Message posté par : Marc
----------------------------------------
Bonjour,
nous avons été confronté au même problème et nous n'avons pas de solution directe avec
les produits Esri.
Suite à nos tests et recherches voici un script python nécessitant ogr et arcpy qui semble
règler le problème des géométries incompatibles Esri/Ogr
-----------------
Code :
import sys
import arcpy
import ogr
import os
#Chemin du repertoire contenant le lot des fichiers shape a analyser et traiter
#pathDirShape= r"d:/......."
#ici le script est parametre pour fonctionner avec un script dans ARCGIS PRO ou Arcgis
Desktop si on installe ogr.
pathDirShape= arcpy.GetParameterAsText(0)
## dev
#recuperation de tous les fichiers shape du repertoire
arcpy.env.workspace = pathDirShape
listShp = arcpy.ListFeatureClasses('*.shp')
#boucle sur les fichiers shape decouverts
for nameShape in listShp:
arcpy.AddMessage(nameShape)
#reconstitution du chemin du fichier shapre en cours d'ananlyse
pathShape = os.path.join(pathDirShape,nameShape)
# creation d'un curseur de mise a jour
cursShp = arcpy.UpdateCursor(pathShape)
#boucle sur chaque les entites du shape en cours d'analyse
for cur in cursShp:
# recuperation de la geometrie
shapeV =cur.getValue("shape")
# recuperation de le geometreie en wkt pour d'interoperabilite avec ogr
wktStr = shapeV.WKT
# creation d'un objet geometrique au sens ogr
objGeom = ogr.CreateGeometryFromWkt(wktStr)
# test de la validite au norme ogr
if not objGeom.IsValid():
# si invalide
arcpy.AddWarning("""
ERREUR DE GEOMETRIE
COUCHE : %s
OBJECTID : %i
"""%(nameShape,cur.getValue("FID")))
# comme indique dans la doc de geoportail on applique un buffer à 0
objGeom =objGeom.Buffer(0)
# si l'objet est alors valide suit au passage du buffer on met a jour
# la geometrie du shape
if objGeom.IsValid():
featwkt = arcpy.FromWKT(objGeom.ExportToWkt())
cur.setValue("shape",featwkt)
cursShp.updateRow(cur)
arcpy.AddWarning(""">>> Reparation effectue
<<<""")
else:
arcpy.AddWarning(""">>><<< Reparation NON
effectuee >>><<<""")
del shapeV
del objGeom
del wktStr
if "cursShp" in globals() :del cursShp
if "cur" in globals() : del cur
-----------------
pour l'instant nous sommes en phase de test mais cela semble passer au detecteur de
mensonge du geoportail ;)
bon courage
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=335524#p335524
Pour y répondre : donnees(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net