Я пытаюсь сравнить два отдельных класса пространственных объектов, чтобы определить различия между ними (своего рода функция сравнения). Мой основной рабочий процесс:
- Я извлекаю геометрию с помощью 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 вы все еще получаете ошибку).
numpy.allclose()
rtol
параметр на 0. По умолчанию это 1e-05, и это может привести к большому допуску, если значения массивов большие, см. Stackoverflow.com/a/57063678/1914034Точность координат будет важным фактором здесь. Числа с плавающей точкой не могут быть сохранены точно.
Если вы используете инструмент сравнения функций , он дает ожидаемый результат, используя допуск XY по умолчанию?
источник
Помимо ответа @ blah328, у вас есть выбор - сравнить две таблицы для отчета о различиях и сходствах с табличными значениями и определениями полей с помощью функции « Сравнение таблиц» .
Пример:
источник
Если
.equals()
функция не работает должным образом и / или координаты немного изменены в ArcGIS, вы можете помассировать координаты XY, а затем сравнить строковый эквивалент геометрии. Обратите внимание,truncateCoordinates()
отсекает все значения за пределами 4-го знака после запятой.источник
Вы можете использовать инструмент Выбрать слой по расположению (Управление данными) с параметром overlap_type «ARE_IDENTICAL_TO», переключить выбор , проверить количество строк и затем выполнить цикл по строкам для сбора объектов или любой другой соответствующей информации.
источник