Estoy tratando de comparar dos clases de entidad separadas para identificar las diferencias entre ellas (una especie de función diff). Mi flujo de trabajo básico:
- Extraigo las geometrías usando un cursor de búsqueda
- Guarde las geometrías de las dos clases de entidad como GeoJSON usando un modificado
__geo_interface__
(lo obtuvo de valveLondonreturn {'type': 'Polygon', 'coordinates': [[((pt.X, pt.Y) if pt else None) for pt in part] for part in self]}
). Esto es para evitar el objeto de geometría compartida que ESRI usa con los cursores y la imposibilidad de hacer copias profundas (algunas discusiones aquí en gis.stackexchange hablan de ello). - Verifique las geometrías de las dos clases de entidad en función de un identificador único. Por ejemplo, compare la geometría FC1 OID1 con la geometría FC2 OID1. Para obtener la geometría como una instancia de objeto ESRI, llame
arcpy.AsShape()
(modificado para leer polígonos con agujeros (consulte el punto 2 anterior) conreturn cls(Array([map(lambda p: Point(*p) if p is not None else Point(), part) for part in coordinates]))
. La comparación es simplementegeom1.equals(geom2)
como se indica en la Clase de Geometría .
Espero encontrar ~ 140 cambios en las geometrías, pero mi script insiste en que hay 430. Intenté verificar esas representaciones de GeoJSON y son idénticas, pero la Clase de Geometría igual () se niega a decirlo.
Un ejemplo está abajo:
>>> 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
El comportamiento esperado aquí debería ser Verdadero (no Falso).
¿Alguien tiene alguna sugerencia antes de mover todo a geometrías ogr? (Dudo porque ogr.CreateGeometryFromGeoJSON () espera una cadena, y arcpy's __geo_interface__
devuelve un diccionario y siento que estoy agregando complejidad adicional).
Encontraron útiles los siguientes recursos, a pesar de que no responden la pregunta:
- arcpy. Pregunta de geometría aquí en gis.stackexchange.com que estaba vinculada anteriormente en mi texto.
- Errores en la clase Polygon de arcpy de los foros de arcgis.com (aparentemente hay muchos errores de precisión en ArcGIS 10.0 que en teoría se arreglaron en 10.1, pero no puedo verificar que, en 10.0 SP5 todavía se obtenga el error).