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).
numpy.allclose()
rtol
parameter ke 0. Secara default itu 1e-05 dan itu dapat menyebabkan toleransi yang besar jika nilai array besar lihat: stackoverflow.com/a/57063678/1914034Ketepatan koordinat akan menjadi pertimbangan penting di sini. Nomor titik apung tidak dapat disimpan dengan tepat.
Jika Anda menggunakan alat Bandingkan Fitur , apakah muncul dengan hasil yang diharapkan menggunakan toleransi XY default?
sumber
di samping @ blah328 jawaban, Anda harus memilih untuk membandingkan dua tabel untuk melaporkan perbedaan dan persamaan dengan nilai tabular dan definisi bidang dengan Tabel Bandingkan .
Contoh:
sumber
Jika
.equals()
fungsi tidak berfungsi seperti yang diharapkan dan / atau koordinat sedikit diubah di ArcGIS, Anda dapat memijat koordinat XY, lalu membandingkan setara String dari Geometri. Perhatikan,truncateCoordinates()
matikan semua nilai di luar angka desimal ke-4.sumber
Anda dapat menggunakan alat Select Layer By Location (Data Management) dengan parameter overlap_type "ARE_IDENTICAL_TO", alihkan pilihan , periksa jumlah baris dan kemudian lewati baris untuk mengumpulkan objekid atau informasi terkait lainnya.
sumber