我正在尝试比较两个单独的要素类,以识别它们之间的差异(某种diff函数)。我的基本工作流程:
- 我使用SearchCursor提取几何
- 使用修改后的两个要素类的几何形状另存为GeoJSON
__geo_interface__
(从valveLondon获取return {'type': 'Polygon', 'coordinates': [[((pt.X, pt.Y) if pt else None) for pt in part] for part in self]}
)。这是为了避免ESRI与游标一起使用的共享几何对象以及无法进行深拷贝的操作(有关gis.stackexchange的某些讨论在此进行了讨论)。 - 根据唯一标识符检查两个要素类的几何。例如,将FC1 OID1几何与FC2 OID1几何进行比较。为了获得几何形状作为ESRI对象实例,呼叫
arcpy.AsShape()
(改性具有孔(见上面第2点)与读取的多边形return cls(Array([map(lambda p: Point(*p) if p is not None else Point(), part) for part in coordinates]))
。该比较简单地geom1.equals(geom2)
为在所指示的Geometry类。
我期望找到约140个几何形状的变化,但是我的脚本坚持认为有430个变化。我试图检查那些GeoJSON表示形式,它们是相同的,但是Geometry类equals()拒绝这么说。
下面是一个示例:
>>> 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
这里的预期行为应为True(不是False)。
在将所有内容迁移到几何图形之前,有人对它有任何建议吗?(我很犹豫,因为ogr.CreateGeometryFromGeoJSON()需要一个字符串,而arcpy的__geo_interface__
返回了一个字典,我觉得我正在增加额外的复杂性)。
发现以下资源很有帮助,即使它们没有回答问题:
- gis.stackexchange.com上的arcpy.Geometry问题在我的文字中上面已链接。
- 来自arcgis.com论坛的arcpy的Polygon类中的错误(显然,ArcGIS 10.0中存在许多精度错误,理论上在10.1中已解决此问题,但我无法验证,在10.0 SP5中您仍然会收到错误)。