Estoy tratando de comparar dos clases de características separadas para identificar las diferencias entre ellas (una especie de función diff). Mi flujo de trabajo básico:
- Extraigo las geometrías utilizando un BuscarCursor
- Guarde las geometrías de las dos clases de características como GeoJSON utilizando un
__geo_interface__
(lo obtuve de válvulaLondresreturn {'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 utiliza con los cursores y la incapacidad de hacer copias profundas (algunas discusiones aquí en gis.stackexchange hablan de ello). - Compruebe las geometrías de las dos clases de características basándose en 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 a
arcpy.AsShape()
(modificado para leer los polígonos con agujeros (véase 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 el Clase de geometría .
Espero encontrar ~140 cambios en las geometrías, pero mi script insiste en que hay 430. Intenté comprobar esas representaciones GeoJSON y son idénticas, pero la clase Geometry equals() se niega a decirlo.
Un ejemplo es el siguiente:
>>> 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í debe ser True (no False).
¿Alguien tiene alguna sugerencia antes de pasar todo a geometrías ogr? (Estoy dudando, ya que ogr.CreateGeometryFromGeoJSON() espera una cadena, y arcpy __geo_interface__
devuelve un diccionario y siento que estoy añadiendo complejidad extra).
Los siguientes recursos son útiles, aunque no responden a la pregunta:
- Pregunta sobre arcpy.Geometry aquí en gis.stackexchange.com que estaba enlazado arriba 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 teóricamente se solucionaron en 10.1 pero no puedo verificarlo, en 10.0 SP5 todavía se produce el error).