Próbuję porównać dwie oddzielne klasy funkcji, aby zidentyfikować różnice między nimi (rodzaj funkcji diff). Mój podstawowy obieg pracy:
- Wyodrębniam geometrie za pomocą SearchCursor
- Zapisz geometrie dwóch klas elementów jako GeoJSON, używając zmodyfikowanego
__geo_interface__
( pobranego z ValveLondonreturn {'type': 'Polygon', 'coordinates': [[((pt.X, pt.Y) if pt else None) for pt in part] for part in self]}
). Ma to na celu uniknięcie współdzielonego obiektu geometrii, którego ESRI używa z kursorami, oraz niemożności wykonywania głębokich kopii (niektóre dyskusje na ten temat na gis.stackexchange mówią o tym). - Sprawdź geometrie dwóch klas elementów na podstawie unikalnego identyfikatora. Na przykład porównaj geometrię FC1 OID1 z geometrią FC2 OID1. Aby uzyskać geometrię jako instancję obiektu ESRI, wywołaj
arcpy.AsShape()
(zmodyfikowano tak, aby czytała wielokąty z otworami (patrz punkt 2 powyżej) za pomocąreturn cls(Array([map(lambda p: Point(*p) if p is not None else Point(), part) for part in coordinates]))
. Porównanie jest po prostugeom1.equals(geom2)
wskazane w klasie geometrii .
Spodziewam się znaleźć ~ 140 zmian w geometrii, ale mój skrypt nalega na 430. Próbowałem sprawdzić te reprezentacje GeoJSON i są one identyczne, ale Klasa Geometrii równa się () nie chce tego powiedzieć.
Przykład jest poniżej:
>>> 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
Oczekiwane zachowanie tutaj powinno być prawdziwe (nie fałszywe).
Czy ktoś ma jakieś sugestie, zanim przeniosę wszystko do geometrii ogr? (Waham się, ponieważ ogr.CreateGeometryFromGeoJSON () oczekuje łańcucha, a arcpy __geo_interface__
zwraca słownik i mam wrażenie, że dodam dodatkową złożoność).
Pomocne okazały się następujące zasoby, mimo że nie odpowiadają na pytanie:
- arcpy.Geometry pytanie tutaj na gis.stackexchange.com, które zostało połączone powyżej w moim tekście.
- Błędy w klasie Polygon arcpy z forów arcgis.com (podobno w ArcGIS 10.0 istnieje wiele błędów precyzji, które teoretycznie zostały naprawione w 10.1, ale nie mogę tego zweryfikować, w 10.0 SP5 nadal pojawia się błąd).