Saya mencoba membandingkan dua kelas fitur terpisah untuk mengidentifikasi perbedaan di antara mereka (semacam fungsi diff). Alur kerja dasar saya:
- Saya mengekstrak geometri menggunakan SearchCursor
- Simpan geometri dari dua kelas fitur sebagai GeoJSON menggunakan modifikasi
__geo_interface__
(mendapatkannya dari valveLondonreturn {'type': 'Polygon', 'coordinates': [[((pt.X, pt.Y) if pt else None) for pt in part] for part in self]}
). Ini untuk menghindari objek geometri bersama yang digunakan ESRI dengan kursor dan ketidakmampuan untuk membuat salinan yang dalam (beberapa diskusi di sini di gis.stackexchange membicarakannya). - Periksa geometri dari dua kelas fitur berdasarkan pengidentifikasi unik. Misalnya, bandingkan geometri FC1 OID1 dengan geometri FC2 OID1. Untuk mendapatkan geometri sebagai instance objek ESRI, panggil
arcpy.AsShape()
(dimodifikasi untuk membaca poligon berlubang (lihat poin 2 di atas) denganreturn cls(Array([map(lambda p: Point(*p) if p is not None else Point(), part) for part in coordinates]))
. Perbandingannya hanyageom1.equals(geom2)
seperti yang ditunjukkan dalam Kelas Geometri .
Saya berharap menemukan ~ 140 perubahan dalam geometri, tetapi skrip saya bersikeras ada 430. Saya mencoba memeriksa representasi GeoJSON dan mereka identik, namun Kelas Geometri sama dengan () menolak untuk mengatakan demikian.
Contohnya di bawah ini:
>>> 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
Perilaku yang diharapkan di sini harus Benar (bukan Salah).
Adakah yang punya saran sebelum saya memindahkan semuanya ke geometri? (Saya ragu karena ogr.CreateGeometryFromGeoJSON () mengharapkan string, dan arcpy __geo_interface__
mengembalikan kamus dan saya merasa seperti saya menambah kompleksitas tambahan).
Menemukan sumber daya berikut bermanfaat, meskipun mereka tidak menjawab pertanyaan:
- arcpy.Geometry pertanyaan di sini di gis.stackexchange.com yang ditautkan di atas dalam teks saya.
- Kesalahan di kelas Polygon arcpy dari forum arcgis.com (ternyata ada banyak kesalahan presisi di ArcGIS 10.0 yang secara teoritis diperbaiki pada 10.1 tapi saya tidak dapat memverifikasi bahwa, dalam 10.0 SP5 Anda masih mendapatkan kesalahan).