Kopiujesz atrybuty z jednej warstwy wielokąta na drugą?

11

Mam problem, który wydaje mi się, że nie mogę sobie poradzić. Mam dwie warstwy wielokątów:

  • Wielokąt A - jest podzbiorem wielokąta B o tych samych polach i ma identyczne wielokąty jak wielokąt B
  • Wielokąt B - ma dane atrybutu, które chcę znaleźć w wielokącie A.

Jak można to zrobić? Wypróbowałem narzędzie QGIS „Połącz atrybuty według lokalizacji”, ale ponieważ niektóre wielokąty znajdują się w innych, zwykle łączy się z pierwszym znalezionym przecięciem (wielokątem zewnętrznym).

Diego R.
źródło
utwórz centroidy (punkty) wielokąta A i połącz atrybuty z B i wyeksportuj do nowego pliku, aby zachować atrybuty z A.
Mapperz
3
@Mapperz Jest to niebezpieczne podejście, ponieważ może powodować błędy, mimo że zwykle generuje prawdopodobnie wyglądającą odpowiedź. Jeśli wielokąty nachodzą na siebie, wszystkie zakłady są wyłączone. Nawet gdy nie ma zakładek, centroid wielokąta może leżeć w innym wielokącie (nie nakładającym się). Prawidłowość można ogólnie zapewnić tylko wtedy, gdy wszystkie wielokąty w A nie zachodzą na siebie i są wypukłe.
whuber
+1 @ Diego - twoje pytanie prowadzi do całkiem interesującej dyskusji / debaty; w tym interesujący!
Dano,

Odpowiedzi:

9

@Dano słusznie podnosi pewne problemy, które najlepiej rozwiązać w pełnej odpowiedzi.

Jedną z trudności , zauważoną już przez @Celeniusa, jest to, że połączenie między B i A (w obu kierunkach) powiela wszystkie pola; poprawienie tego może być uciążliwe. Zasugerowałem w komentarzach, że oczywisty łatwy sposób (eksport do arkusza kalkulacyjnego) rodzi pytania o integralność danych. Inna trudność , rozwiązana już w propozycji Celeniusa, dotyczy rozwiązania tego problemu, gdy żadna kombinacja atrybutów nie może służyć jako klucz dla A i B, ponieważ wyklucza to przyłączenie do bazy danych. Połączenie przestrzenne omija ten problem.

Co zatem jest dobrym rozwiązaniem? Jedno podejście wykorzystuje A do identyfikacji odpowiednich zapisów B zawierających pożądane dane. W zależności od założeń dotyczących konfiguracji wielokątów - czy się pokrywają, czy niektóre mogą zawierać inne itp. - można to zrobić na różne sposoby: używając jednej warstwy do wybierania obiektów w drugiej, lub poprzez połączenia. Chodzi o to, że wszystko, co chcemy zrobić na tym etapie, to wybrać podzbiór B odpowiadający A.

Po osiągnięciu tego wyboru wyeksportuj zaznaczenie i pozwól mu zastąpić A. Gotowe .

To rozwiązanie zakłada, że wszystkie pola w B mają zastąpić ich odpowiedniki w A. Jeśli nie, to naprawdę konieczne jest wykonanie łączenia 1-1 z B (źródło) z A (miejsce docelowe). Łączenie na podstawie identyfikatorów jest najlepsze, ale połączenie na podstawie tożsamości wielokąta (Celenius) działa dobrze, jeśli identyfikatory nie są dostępne i nie ma szans, że odpowiadające kształty wielokątów w A i B mogą się nieznacznie różnić . (Jest to subtelna kwestia i potencjalna przyczyna podstępnych błędów, ponieważ poprzednie zmiany w B wielokątów, które nie odpowiadają A, mogłyby nadal niewidocznie modyfikować inne wielokąty w B, jeśli GIS „przyciąga” lub „utrzymuje topologię” lub w inny sposób automatycznie wprowadzać zmiany globalne podczas lokalnych edycji).

W tym momencie są dwie kopie każdego pola: jeśli [Foo] jest wspólnym polem dla A i B, to złączenie zawiera A. [Foo] i B. [Foo]. Korzystając z obliczenia pola , skopiuj B. [Foo] do A. [Foo]. Powtórz dla wszystkich potrzebnych pól. Po zakończeniu usuń złączenie.

Chociaż ta procedura może być nieco uciążliwa, gdy zaangażowanych jest wiele dziedzin, jej zalety obejmują

  • Jest prosty i szybki do napisania.
  • Skryptowanie pozostawia ślad audytu dokumentujący przetwarzanie danych. Ma to kluczowe znaczenie dla ochrony integralności danych.
  • Chroni przed niektórymi rodzajami błędów hurtowych, takimi jak zachowanie niewłaściwego pola po złączeniu (w ten sposób zachowując stare dane zamiast nowych danych dla tego pola) lub usuwając kluczowe pole.
  • Wykorzystuje wbudowane zabezpieczenia oferowane przez system zarządzania bazą danych, takie jak wymuszanie typu danych i wymuszanie reguł biznesowych, które działają w celu zapobiegania błędom i ich identyfikowania oraz w celu zachowania spójności między wszystkimi tabelami i warstwami w bazie danych.

Oto niektóre z zasad przewodnich związanych z tą sugestią

  1. Użyj systemu zarządzania bazą danych do przetwarzania danych zamiast używać oprogramowania, które nie zostało zaprojektowane lub jest nieodpowiednie do tego zadania.
  2. Unikaj zmieniania struktur bazy danych (takich jak usuwanie lub dodawanie pól), gdy operacje absolutnie tego nie wymagają.
  3. Wykorzystaj możliwości oprogramowania do automatyzacji, aby uprościć pracę, udokumentować ją i zapewnić powtarzalność operacji.

Można sprzeciwić się, że w wielu przypadkach istnieją szybsze i łatwiejsze sposoby osiągnięcia tego samego rezultatu. Tak, mogą być, i mogą być skuteczne i zwykle działają ostrożnie. Jednak rozwiązania, które ryzykują dane, są trudne do rekomendowania i obrony jako odpowiedzi ogólnego przeznaczenia. Najlepiej je stosować w sytuacjach jednorazowych z małymi zestawami danych, w których uszkodzenie danych powinno szybko stać się oczywiste, a konsekwencje takich błędów są nieistotne.

Whuber
źródło
+1 @ whuber - Oczywiste jest, że próbowałeś tutaj zważyć wszystkie zmienne; dobrze przemyślana odpowiedź. Proszę zobaczyć dodatek do mojej oryginalnej odpowiedzi, ponieważ zabraknie mi miejsca w polu komentarza.
Dano
1
dla osób zastanawiających się, co się stało z „Celeniusem”, wspomniano o różnych miejscach w tym wątku: teraz znany jako @djq, a jego / jej odpowiedź jest tutaj . Uznanie dla maszyny powrotnej: web.archive.org/web/20120127210858/http://gis.stackexchange.com/…
matt wilkie
5

W Arcmap mogłeś przestrzennie dołączyć do Wieloboku B do Wieloboku A; wiązałoby się to z atrybutami. Ponieważ nazwy pól są takie same, utworzy to nową kombinację nazwy.

djq
źródło
Tak bym powiedział. Moim zdaniem ta krótka odpowiedź jest właściwa.
Simon
4

Wyeksportuj tabelę Shapefile „B” do Excela i usuń zbędne kolumny oraz wszelkie kolumny zawierające informacje, których nie potrzebujesz. Upewnij się, że zachowujesz kolumnę z udostępnionym identyfikatorem, a następnie zapisz ją w odpowiednim folderze. Wejdź do ArcMap, dodaj tabelę, a następnie Prawy przycisk myszy na Shapefile „A” i wykonaj połączenie tabeli . Link powinien prowadzić do filmu o tym, jak to zrobić.


@ whuber - Całe podejście jest solidne i zapewnia integralność danych. Jedyne, co mogę powiedzieć, aby obalić tę odpowiedź, to to, że pewne sytuacje / projekty nie dają nam czasu ani budżetu, aby być tak metodycznym w naszym podejściu.

Prawdziwy przykład:

Junior Mining Company siedzi na dużej rudzie z setkami milionów dolarów w gotówce, zależnej od ich zdolności do „udowodnienia” zasobów. Przegląd publikacji i map / danych geologicznych prowadzi do bardzo ukierunkowanego i bardzo kosztownego programu ćwiczeń. Gdy testy powracają od pierwszego uruchomienia, wartości te są oznaczane w odpowiednich punktach za pomocą łączenia tabel i wypompowywane z powrotem w formacie Excel, w którym dane są starannie przygotowywane do importu do DataMine (do interpolacji orebody 3D).

Z mojego doświadczenia wynika , że geolodzy projektu wymagali, aby te dane były przygotowane w programie Excel, aby były zgodne z KAŻDĄ regułą / konwencją formatowania litery (bez spacji, bez znaków specjalnych itp.) Oraz aby plik importu DataMine został dostarczony w formacie .csv (w każdym razie wtedy). Doprowadziłoby to do większych inwestycji w ukierunkowane wiercenie i wielokrotnie powtarzalibyśmy ten proces (w niektórych przypadkach). Wszystko to na ogół miało miejsce w wyjątkowo napiętym i krytycznym terminie.

Każdy z nas ma swoją własną historię i własny wachlarz doświadczeń, które wykorzystaliśmy w naszym podejściu do tego, jak to robimy. Powiedziawszy to, z mojego doświadczenia wynika, że ​​Excel jest absolutną koniecznością i niezbędnym narzędziem w moich przepływach pracy; to co wiem. Podczas przygotowywania tych danych podejmowaliśmy wszelkie środki ostrożności w zakresie kontroli jakości / kontroli jakości. Tam, gdzie uciekacie od Excela, nie miałem wyboru, musiałem go użyć.

Dano
źródło
(-1) Użycie programu Excel do wykonania złączenia jest nie tylko trudniejsze niż wykonanie go za pomocą GIS lub RDBMS, ale również powoduje poważne błędy.
whuber
8
Excel jest prosty, działa i dlatego prawdopodobnie odpowiada za więcej niewykrytych błędów hurtowych niż jakiekolwiek oprogramowanie, jakie kiedykolwiek wyprodukowano. Jest to sprzeczne z podstawowymi zasadami DBMS, które zostały opracowane w celu ochrony przed błędami, które Excel zbyt łatwo popełnia, takich jak (1) sortowanie niektórych kolumn, ale nie innych; (2) błędy typograficzne zmieniające typy danych; (3) zbłąkane naciśnięcia klawiszy, które usuwają dane; (4) przypadkowe usunięcie wierszy lub kolumn; (5) ukryta konwersja danych, takich jak tekst na daty; (6) ukryte obcięcie danych; (7) ukryte zaokrąglanie wartości liczbowych; i wiele więcej.
whuber
2
ta odpowiedź i wynikowy komentarz jest wspaniałą ilustracją tego, jak „zła” odpowiedź może wywoływać dobre wyniki, ujawniając informacje, które w innym przypadku nie mogłyby wyjść na jaw. Nie należy usuwać go, aby uniknąć „trafienia”.
matt wilkie
3
... i aby zrekompensować trafienie, WIELKIE PYTANIE byłoby zapytać, dlaczego użycie Excela do przetwarzania danych może prowadzić do bardzo poważnych problemów. I jak go bezpiecznie używać.
matt wilkie
1
(+1) Za przemyślaną i dobrze opisaną edycję. @matt Sprawdź dyskusje na stats.stackexchange.com dotyczące Jaki byłby dobry sposób pracy z dużym zestawem danych w programie Excel? i Excel jako stół roboczy statystyk .
whuber
1

Pod koniec lat 90. otrzymaliśmy aktualizację na dużą skalę do wszystkich naszych zbiorników wodnych i cieków wodnych, obejmującą około 55 arkuszy map NTS i niezapomnianą liczbę tysięcy obiektów. Musieliśmy zachować atrybuty wartości dodanej naszej starej hydrologii (nazwy jezior, rzędna powierzchni itp.) I zastąpić geometrię. Geometria starego i nowego była wystarczająco blisko, abyśmy mogli zagwarantować, że centroidy każdego wielokąta będą nadal ograniczone nowymi granicami wielokąta - jest to ważny punkt, bez tej podstawowej pewności, poniższe podejście nie jest dobrym pomysłem.

Rozwiązaniem w tym konkretnym przypadku było zamiast przynieść atrybuty do geometrii, przynieść geometrię do atrybutów. Więc koncepcyjnie:

  1. z * Layer_with_attributes *, usuń wielokąty, ale zachowaj rekordy tabeli,
  2. z * Layer_with_polys * skopiuj i wklej geometrię do * Layer_with_attributes *
  3. scal i ocal.

Zobacz tutaj, aby uzyskać bardziej szczegółowy opis i przepis na . Nie jestem pewien, czy w nowoczesnym Arcgis lub Qgis jest nawet możliwe usunięcie geometrii bez jednoczesnego usunięcia jej rekordu atrybutu, ale hej, na wszelki wypadek, oto pomysł.

matowe wilkie
źródło
1

Nie jestem pewien, ale być może niektóre DBMS wykonują operacje równości na polach Shape w SQL (?). Wydaje mi się, że jeśli dwie geometrie są identyczne, =operator SQL powinien zwrócić true ( WHERE A.Shape = B.Shape).

Jeśli jest to prawdą w przypadku używanej bazy danych, powinieneś być w stanie wykonać sprzężenie przestrzenne przy użyciu tej samej składni, co w przypadku łączenia nieprzestrzennego.


Wygląda na to, że można do tego użyć metody ST_Equals (standard OGC).

Kirk Kuykendall
źródło
0

Jak zwykle whuber ma rację. Musisz dokładnie przemyśleć swój proces. Zwłaszcza jeśli są to duże zbiory danych, a operacja ta zostanie podjęta wiele razy lub dane będą miały kluczowe znaczenie.

Rozważ swoje dane i obowiązki:

Co ty zrobiłeś?

Co robisz?

Co zamierzasz zrobić?

I zawsze pytaj: dlaczego?


Teraz jedna prosta odpowiedź skierowana bezpośrednio na zadane pytanie. Pamiętając o tym, zawsze jest co najmniej 5 sposobów, ale zazwyczaj tylko jeden najlepszy sposób.

Zakładając, że pełny zestaw ma wszystkie atrybuty, które mają znajdować się w tym podzbiorze, a w tym podzbiorze nie ma niczego, co nie jest jeszcze w pełnym zestawie, oprócz nieaktualnych informacji.

Zgadywanie, czy topologia podzbioru pasuje do pełnego zestawu (w tym Origin / Projekcja i Tolerancja XY).

1) Użyj Feature to Point z zaznaczonym polem wyboru „Inside” i utwórz klasę obiektów point lub plik kształtu z podzestawu.

2) Użyj opcji Wybierz według łączenia przestrzennego, aby znaleźć wszystkie wielokąty w pełnym zestawie, które odpowiadają podzestawowi na podstawie nowo utworzonej klasy elementów Point lub pliku kształtu.

3) Wyeksportuj zaznaczenie z pełnego zestawu, który może być Twoim nowym podzbiorem.

użytkownik23715
źródło
0

Z pewnością, jeśli wielokąt A jest podzbiorem wielokąta B, najłatwiejszym sposobem byłoby zapętlenie wielokąta A, użycie identyfikatora, który byłby w wielokącie A (i B, gdyby A był podzbiorem lub B), aby wyszukać dane wiersza w Wielokąt B, a następnie zaktualizuj wiersz w Wielokącie A.

Włochaty
źródło