Я пытаюсь сравнить два отдельных класса пространственных объектов, чтобы определить различия между ними (своего рода функция сравнения). Мой основной рабочий процесс:
- Я извлекаю геометрию с помощью SearchCursor
- Сохраните геометрию двух классов пространственных объектов как GeoJSON, используя модифицированный
__geo_interface__
(полученный из valveLondonreturn {'type': 'Polygon', 'coordinates': [[((pt.X, pt.Y) if pt else None) for pt in part] for part in self]}
). Это делается для того, чтобы избежать использования объекта общей геометрии, который ESRI использует с курсорами, и невозможности делать глубокие копии (об этом говорят некоторые обсуждения здесь на gis.stackexchange). - Проверьте геометрию двух классов объектов на основе уникального идентификатора. Например, сравните геометрию OID1 FC1 с геометрией OID1 FC2. Чтобы получить геометрию как экземпляр объекта 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)
как указано в классе геометрии .
Я ожидаю найти ~ 140 изменений в геометрии, но мой сценарий настаивает на том, что их 430. Я пытался проверить эти представления GeoJSON, и они идентичны, но класс геометрии 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 геометрии? (Я сомневаюсь, так как ogr.CreateGeometryFromGeoJSON () ожидает строку, а arcpy __geo_interface__
возвращает словарь, и я чувствую, что добавляю дополнительную сложность).
Нашли следующие полезные ресурсы, хотя они не отвечают на вопрос:
- arcpy.Geometry вопрос здесь на gis.stackexchange.com, который был связан выше в моем тексте.
- Ошибки в классе Polygon в Arcpy с форумов arcgis.com (очевидно, существует множество ошибок точности в ArcGIS 10.0, которые теоретически были исправлены в 10.1, но я не могу проверить это, в 10.0 SP5 вы все еще получаете ошибку).