Porównaj podobne linie i zaktualizuj warstwy


16

Tutaj są dwie warstwy z reprezentacją ulic, a idea jest taka: Chcemy zaktualizować najnowszą warstwę (czerwoną linią) o niektóre dane przechowywane w drugiej (jasnoniebieskie), ale te warstwy są podobnie w pozycji geograficznej, która może być bardzo blisko i nieco dalej w zależności od miejsca na mapie i tylko jeden atrybut pasuje, w przypadku gdy linia jest taka sama w drugim (codlog x codlog5).

Warstwy Qgis.

Na przykład: na środku obrazu znajduje się kwadrat w obu warstwach, ale jak mam zrobić na mapie, aby rozpoznać, że niebieski jest taki sam jak zielony i zaktualizować ostatnią warstwę?

Jak mogę to zrobić? Czy jest jakaś wtyczka lub narzędzie, które może w tym pomóc?


Chcesz zaktualizować czerwoną warstwę o atrybuty z niebieskiej warstwy lub o dodatkowe funkcje z niebieskiej warstwy?
dmh126

Atrybuty Sytuacja: Czerwona warstwa zawiera kolumny (a, b, c, d), a niebieska - kolumny (d, e, f). Chcę dodać w czerwonej warstwie kolumny (e, f) z drugiej warstwy i jej pasujące wyniki.
Jhonatan Oliveira,

Dostępna jest tutaj dokumentacja wtyczki do konfuzji. Nie jestem pewien, czy rozwój został zakończony.
Barbarossa,

1
próbowałeś Jump?
radouxju,

Ale kolumna „d” linii blu i „d” czerwonej linii to unikalny wspólny identyfikator? Co zawierają?
Sergio,

Odpowiedzi:


6

To świetne pytanie, musiałem ostatnio zrobić coś podobnego, ale ze znacznie mniejszym zestawem danych, więc mogłem użyć prostego skrzyżowania z dodatkowym sprawdzeniem jakości wizualnej i było dobrze.

Ale oto pomysł na to, chociaż nie mam kodu, i jest to dość duży proces. Zdecydowanie najpierw przetestuj próbkę z pełnego zestawu danych. Prawdopodobnie możesz tu znaleźć jakiś użyteczny kod. (Wcięcie stało się trochę dziwne poniżej.):

  1. weź dobry zestaw geometrii (gdzie chcesz, aby atrybuty się skończyły) i utwórz jego bufor *

  2. iteruj przez każdą z funkcji bufora:

    2a. obliczyć ogólną orientację funkcji (max_y - min_y / max_x - min_x lub coś takiego)

    2b. wybierz zapytanie według lokalizacji na drugiej warstwie przy użyciu tej pojedynczej funkcji

    1. będziesz mieć więcej niż jedną funkcję, która odpowiada wybranemu zapytaniu o lokalizację, więc iteruj te wybrane funkcje i oblicz orientację każdej z nich

    2. pobierz atrybuty z dowolnej funkcji, która ma orientację najbliższą funkcji bufora.

* Zaczynam od bardzo małej odległości (jedna jednostka mapy lub coś takiego), a następnie uruchamiam ten proces ze zwiększającymi się odległościami, uważając, aby nie zastąpić żadnych atrybutów, które już przesłałeś.

** Prawdopodobnie mógłbyś zrezygnować z tworzenia funkcji bufora i po prostu wykonać zapytanie wyboru według lokalizacji z odległością bufora. Nie znam się dobrze na QGIS, ale jestem pewien, że będziesz w stanie to zrobić.

Nie ma sposobu, aby działało to idealnie dla wszystkich twoich funkcji, ale to dopiero początek, a następnie sprowadza się do opracowania dobrej strategii kontroli jakości / kontroli jakości w celu sprawdzenia i zakończenia transferu.

EDYTUJ Rozmyślając o tym więcej, oto podstawowy przykład, który całkowicie zepsułby system, jeśli zaczynasz od bardzo małej odległości bufora i wybrałeś funkcję o najlepszej dopasowanej orientacji, tak jak zalecałem:

wprowadź opis zdjęcia tutaj

Zostaną pobrane atrybuty z niewłaściwej czerwonej linii. Aby tego uniknąć, możesz stworzyć pewien rodzaj tolerancji i brać atrybuty elementu tylko wtedy, gdy jego orientacja (w porównaniu z orientacją oryginalnego niebieskiego elementu) mieści się w tej tolerancji.

EDYCJA 2 Ups, czy to te wielokąty? Chyba właśnie założyłem, że były to linie na szarym tle. Jeśli są to wielokąty, tak naprawdę nie wiem, czy ta koncepcja orientacji jest dobra. Możesz jednak wybrać wszystkie przecinające się obiekty i dowiedzieć się, które najbardziej się pokrywają (uruchom narzędzie typu Unia, a następnie użyj wielokąta o największym obszarze ...).


Ta logika jest zdrowa. Użyłem podobnego podejścia w C # / ArcObjects, aby skopiować atrybuty z niedokładnego zestawu danych z atrybutami do dokładnego zestawu danych bez atrybutów ... 95% poprawności. Ręczne sprawdzanie / mocowanie było konieczne w ciasnych miejscach, ale z pewnością było szybsze niż zrobienie wszystkiego ręcznie.
Michael Stimson,

2

Jeśli chcesz dodać niektóre atrybuty z warstwy czerwonej do niebieskiej, a jeden atrybut jest wspólny na obu warstwach, musisz użyć opcji Dodaj sprzężenie wektorowe .

Pisałem o tym tutaj .

  1. Kliknij prawym przyciskiem myszy czerwoną warstwę pliku kształtu w Panelu warstw i wybierz Właściwości .
  2. Następnie przejdź do zakładki Połączenia .
  3. Naciśnij przycisk + , aby utworzyć nowe połączenie.
  4. Warstwa łączenia to twoja czerwona warstwa pliku kształtu. Pole łączenia to pole ze wspólnymi wartościami w obu. Pole docelowe to pole, do którego chcesz dołączyć z niebieskiej warstwy.
  5. Następnie otrzymasz nowy atrybut w tabeli kształtów.

Otóż ​​to.

Oto przykład ze zrzutami ekranu.


1

Zdecydowanie wolę odpowiedź od @ dmh126, ponieważ jego metoda pozwala dość łatwo aktualizować warstwę red_line .

Aby dodać alternatywę, możesz użyć narzędzia Połącz tabelę atrybutów z Przybornika przetwarzania i wybrać warstwy za pomocą wspólnego pola. Zauważ, że ta metoda tworzy nowy plik kształtu zamiast aktualizowania istniejącego:

Połącz tabelę atrybutów


0

Jeśli masz unikalny identyfikator w obu warstwach, którego możesz użyć do łatwego łączenia wartości z nową warstwą ze starej, to bułka z masłem. Ale to nie wydaje się tak.

Jeśli nie, jest to dość trudny problem. Zastanawiam się, dlaczego komentarz od user30184 sugerujący użycie OpenJUMP i wtyczki http://www.vividsolutions.com/products.asp?catg=spaapp&code=roadmatcher nie został opublikowany jako odpowiedź, ponieważ w tym przypadku wydaje mi się to całkowicie uzasadnione.

W przeciwnym razie nie sądzę, że można to zrobić bez odrobiny kodowania. Z QGIS możesz używać zgrabnie, a łącząc buforowanie i przecinanie, powinieneś być w stanie wykonać kilka istotnych automatycznych kontroli.

Jednym z podejść może być porównanie pewnego rozsądnie dużego bufora czerwonych linii z niebieskimi liniami i uzyskanie pasujących atrybutów i proporcji, ile to pasuje. W pseudokodzie:

for r_line in red_lines:
  r_line_buf = r_line.buffer()
  intersecting_b_lines = []
  for b_line in blue_lines:
    if r_line_buf.intersects(b_line):
      intersect_length = calculateIntersectionLength(r_line_buf,b_line)
      b_line_values = getAttributes(b_line)
      intersecting_b_lines.append((b_line_values,intersect_length))
  b_line_best_fit = findLongestLineWithinIntersected(intersecting_b_lines)
  r_line_length = r_line.length
  b_vs_r_line_ratio = compareLength(r_line_length,b_line_best_fit)
  saveToNewColumns(r_line, b_line_best_fit.Atribute1, b_line_best_fit.Atribute2..., b_vs_r_line_ratio)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.