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).
numpy.allclose()
rtol
parametru na 0. Domyślnie jest to 1e-05 i może prowadzić do dużej tolerancji, jeśli wartości tablic są duże, patrz: stackoverflow.com/a/57063678/1914034Ważna będzie tutaj dokładność współrzędnych. Liczb zmiennoprzecinkowych nie można dokładnie zapisać.
Jeśli korzystasz z narzędzia Porównanie funkcji , czy przyniesie on oczekiwany wynik przy użyciu domyślnej tolerancji XY?
źródło
oprócz odpowiedzi @ blah328 masz możliwość porównania dwóch tabel pod kątem zgłaszania różnic i podobieństw z wartościami tabelarycznymi i definicjami pól za pomocą Tabeli porównania .
Przykład:
źródło
Jeśli
.equals()
funkcja nie działa zgodnie z oczekiwaniami i / lub współrzędne są nieco zmienione w ArcGIS, możesz masować współrzędne XY, a następnie porównać ciąg znaków w geometrii. Zauważ, żetruncateCoordinates()
wycina wszystkie wartości poza czwartym miejscem po przecinku.źródło
Możesz użyć narzędzia Wybierz warstwę według lokalizacji (zarządzanie danymi) z parametrem „ARE_IDENTICAL_TO” parametru „overlap_type”, przełączać zaznaczenie , sprawdzać liczbę wierszy, a następnie zapętlać rzędy w celu zebrania obiektów objectid lub innych istotnych informacji.
źródło