Sto cercando di confrontare due classi di caratteristiche separate per identificare le differenze tra loro (una specie di funzione diff). Il mio flusso di lavoro di base:
- Estraggo le geometrie usando un SearchCursor
- Salvare le geometrie delle due classi
__geo_interface__
di entità geografiche come GeoJSON usando un modificato (ottenuto da valveLondonreturn {'type': 'Polygon', 'coordinates': [[((pt.X, pt.Y) if pt else None) for pt in part] for part in self]}
). Questo per evitare l'oggetto della geometria condivisa che ESRI usa con i cursori e l'impossibilità di fare copie profonde (alcune discussioni qui su gis.stackexchange ne parlano). - Controlla le geometrie delle due classi di feature in base a un identificatore univoco. Ad esempio, confrontare la geometria OID1 FC1 con la geometria OID1 FC2. Per ottenere la geometria come istanza di un oggetto ESRI, chiamare
arcpy.AsShape()
(modificato per leggere poligoni con buchi (vedere il punto 2 sopra) conreturn cls(Array([map(lambda p: Point(*p) if p is not None else Point(), part) for part in coordinates]))
. Il confronto è semplicementegeom1.equals(geom2)
come indicato nella Classe Geometria .
Mi aspetto di trovare ~ 140 cambiamenti nelle geometrie, ma il mio script insiste sul fatto che ci sono 430. Ho provato a controllare quelle rappresentazioni GeoJSON e sono identiche, eppure la Geometry Class equals () si rifiuta di dirlo.
Un esempio è di seguito:
>>> geom1geoJSON
{'type': 'Polygon', 'coordinates': [[(-122.8423481559999, 47.060497293000083), (-122.84239755599992, 47.059262423000064), (-122.84416913599989, 47.059309693000046), (-122.84416913599989, 47.060497293000083), (-122.8423481559999, 47.060497293000083)]]}
>>> geom2geoJSON
{'type': 'Polygon', 'coordinates': [[(-122.8423481559999, 47.060497293000083), (-122.84239755599992, 47.059262423000064), (-122.84416913599989, 47.059309693000046), (-122.84416913599989, 47.060497293000083), (-122.8423481559999, 47.060497293000083)]]}
>>> geom1 = arcpy.AsShape(geom1geoJSON)
>>> geom2 = arcpy.AsShape(geom2geoJSON)
>>> geom1.equals(geom2)
False
>>> geom2.equals(geom1)
False
Il comportamento previsto qui dovrebbe essere True (non False).
Qualcuno ha qualche suggerimento prima di spostare tutto in geometrie ogr? (Sono titubante perché ogr.CreateGeometryFromGeoJSON () si aspetta una stringa, e arcpy __geo_interface__
restituisce un dizionario e mi sembra di aggiungere ulteriore complessità).
Trovate utili le seguenti risorse, anche se non rispondono alla domanda:
- domanda di arcpy.Geometry qui su gis.stackexchange.com che era collegata sopra nel mio testo.
- Errori nella classe Polygon di arcpy dai forum arcgis.com (apparentemente ci sono molti errori di precisione in ArcGIS 10.0 che teoricamente sono stati corretti in 10.1 ma non posso verificare che, in 10.0 SP5 si ottenga ancora l'errore).