Я намагаюся порівняти два окремі класи функцій, щоб визначити відмінності між ними (на зразок функції diff). Мій основний робочий процес:
- Я витягую геометрії за допомогою 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 говорять про це). - Перевірте геометрію двох класів функцій на основі унікального ідентифікатора. Наприклад, порівняйте геометрію 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)
як зазначено в класі Геометрії .
Я очікую знайти 140 змін у геометріях, але мій сценарій наполягає на тому, що їх існує 430. Я намагався перевірити ці представлення GeoJSON, і вони однакові, але клас геометрії дорівнює () відмовлятись від цього.
Приклад нижче:
>>> 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
Очікувана поведінка тут повинна бути правдою (не помилковою).
Хтось має якісь пропозиції, перш ніж перенести все на географічну географію? (Я вагаюся, як ogr.CreateGeometryFromGeoJSON () очікує рядок, а arcpy __geo_interface__
повертає словник, і я відчуваю, що додаю додаткову складність).
Наступні ресурси виявилися корисними, хоча вони не відповідають на питання:
- arcpy.Geometry питання тут на gis.stackexchange.com, яке було пов'язано вище в моєму тексті.
- Помилки в класі Polygon arcpy з форумів arcgis.com (мабуть, в ArcGIS 10.0 є багато помилок точності, які теоретично виправлені в 10.1, але я не можу перевірити, що в 10.0 SP5 ви все одно отримуєте помилку).