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).
numpy.allclose()
rtol
parámetro en 0. Por defecto es 1e-05 y puede conducir a una gran tolerancia si los valores de los arrays son grandes, consulte: stackoverflow.com/a/57063678/1914034La precisión de las coordenadas será una consideración importante aquí. Los números de coma flotante no se pueden almacenar exactamente.
Si utiliza la herramienta de comparación de características , ¿se obtiene el resultado esperado con la tolerancia XY predeterminada?
fuente
junto a la respuesta @ blah328, tiene la opción de comparar dos tablas para informar diferencias y similitudes con valores tabulares y definiciones de campo con la Comparación de tablas .
Ejemplo:
fuente
Si la
.equals()
función no funciona como se esperaba y / o las coordenadas están ligeramente alteradas en ArcGIS, puede masajear las coordenadas XY y luego comparar el equivalente de cadena de la geometría. Observe quetruncateCoordinates()
corta todos los valores más allá del cuarto decimal.fuente
Puede usar la herramienta Seleccionar capa por ubicación (gestión de datos) con el parámetro "ARE_IDENTICAL_TO" overlap_type, cambiar la selección , verificar el recuento de filas y luego recorrer las filas para recopilar los objectids o cualquier otra información pertinente.
fuente