Suite

Création d'une géométrie de polygone à l'aide d'un tableau de points


J'analyse un fichier gpx OpenStreetMap que j'ai exporté à partir d'ici. J'essaie de placer les données dans des classes d'entités de géodatabase arcgis. Certaines des caractéristiques du gpx sont des points (enregistrés en tant que wpt), tandis que d'autres sont des polygones (enregistrés en tant que trk constitués de trkpt). En utilisant le script ci-dessous, je réussis à copier les points, leur géométrie, les noms et les attributs que je veux. Cependant, la création de la géométrie ne fonctionne pas pour les polygones, bien que les attributs soient copiés sans problème (j'ai laissé le bout de code pour les attributs hors de l'exemple ci-dessous). J'ai trouvé cette question qui m'a incité à essayer de construire les polygones avec les points ordonnés dans l'autre sens. Cependant cela n'a pas fonctionné non plus. J'ai intégré pas mal d'instructions d'impression pour vérifier où cela ne va pas, voir l'impression ci-dessous. Pas non plus que l'impressionpoly.zonerésulte en0.0, impressionpoly.trueCentroidrésulte enRien, etc. Ainsi, le polygone n'est tout simplement pas généré à partir du tableau. Il me semble quepoly = arcpy.Polygon(ar)ne fonctionne tout simplement pas.

Exemple GPX :

 Moteurs Ian Brown name=Ian Brown Motors shop=car_repair   Magasin de clés Brodie's Minimarket building=yes name=Key Store Brodie's Minimarket opening_hours=08:00-18:00 shop=supermarket source=sondage       

Scénario:

de xml.etree import ElementTree as Et import os import arcpy arcpy.env.overwriteOutput = 1 wgs = arcpy.SpatialReference(r'C:Program FilesArcGISDesktop10.0Coordinate ' r'SystemsGeographic Coordinate SystemsWorld WGS ' r'1984.prj') gdb = PATH_TO_GDB f = PATH_TO_GPX all_records = [] p = Et.parse(f) root = p.getroot() arcpy.CreateFeatureclass_management(gdb, 'shops_pt', 'POINT', spatial_reference =wgs) arcpy.CreateFeatureclass_management(gdb, 'shops_pl', 'POLYGON', spatial_reference=wgs) shops_pt = os.path.join(gdb, 'shops_pt') shops_pl = os.path.join(gdb, 'shops_pl') pour fc dans [shops_pt, shops_pl] : arcpy.AddField_management(fc, 'name', 'TEXT', 255) arcpy.AddField_management(fc, 'type', 'TEXT', 50) arcpy.AddField_management(fc, 'opening_hours', 'TEXT', 255) ic_pt = arcpy.InsertCursor(shops_pt) ic_pl = arcpy.InsertCursor(shops_pl) pour mainElement à la racine : if mainElement.tag == 'metadata' : continue si mainElement.tag == 'wpt' : r = ic_pt.newRow() y = float(mainElement.attrib['lat']) x = float(mainElement.attrib['lon']) p = arcpy.Point(x, y) r.shape = p ic_pt.insertRow(r) elif mainElement.tag == 'trk': r = ic_pl.newRow() pour subElement dans mainElement : if subElement.tag == 'trkseg' : ar = arcpy.Array() pour trkpt dans subElement : y = float(trkpt.attrib['lat']) x = float(trkpt.attrib['lon ']) p = arcpy.Point(x, y) print p ar.add(p) print 'array length', len(ar) print 'ar[0]', ar.getObject(0), 'ar[- 1]', ar.getObject(len(ar)-1) poly = arcpy.Polygon(ar) r.shape = poly print 'poly.centroid try 1', poly.centroid si poly.centroid est Aucun : ar2 = arcpy .Array() pour p dans ar : ar2.insert(0, p) pour p dans ar2 : print p poly = arcpy.Polygon(ar2) print 'poly.centroid try 2', poly.centroid ic_pl.insertRow(r)

Exemple d'impression pour 1 polygone :

-4.7134965 56.4387108 NaN NaN -4.7135666 56.4385955 NaN NaN -4.7133971 56.438564 NaN NaN -4.7133269 56.4386793 NaN NaN -4.7134965 56.4387108 NaN NaN longueur de matrice 5 ar[0] -4.7134965 56.4387108 NaN NaN NaN ar[-1. essayer 1 Aucun -4.7134965 56.4387108 NaN NaN -4.7133269 56.4386793 NaN NaN -4.7133971 56.438564 NaN NaN -4.7135666 56.4385955 NaN NaN -4.7134965 56.4387108 NaN NaN poly.centroïde essayer 2 Aucun

Solution : comme suggéré par @Vince ci-dessous dans les commentaires, lors de la miseDéployerdans unPolygone, déclarer explicitement la référence spatiale, de sorte qu'elle deviendraitpoly = arcpy.Polygon(ar, wgs).



Je pense que les commentaires sur cette question valent la peine d'être placés dans une réponse que je ferai Community Wiki :

Essayez d'appliquer la référence spatiale à la forme -- poly = arcpy.Polygon(ar,wgs) - Vince 25 juin à 12:08


Oui, je ferais comme Vince le dit et ajouterais une référence spatiale, sinon le polygone n'a aucune idée de l'endroit où il est censé être. En outre, vous pouvez configurer les wgs en transmettant un ID bien connu (WKID) plutôt que de faire référence à un fichier .prj : wgs = arcpy.SpatialReference(4326) - crmackey 25 juin à 12:17


La référence spatiale par défaut a probablement une résolution de sommet de 0,001 (1 mm), ce qui réduit les sommets, rendant le centroïde indéfini. - Vince 25 juin à 12:22


@crmackey cela me donne une erreur si je l'utilise comme ça, mais si je le fais de la manière au bas de cette page ça marche bien : help.arcgis.com/en/arcgisdesktop/10.0/help/index.html# //… - Menno 25 juin à 12:29


Je dois souligner que ma suggestion ne fonctionne que pour la version 10.1 et au-delà. - crmackey 25 juin à 12:37


Voir la vidéo: Angles des polygones réguliers (Octobre 2021).