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).
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?
qgis
layers
latitude-longitude
Jhonatan Oliveira
źródło
źródło
Odpowiedzi:
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.):
weź dobry zestaw geometrii (gdzie chcesz, aby atrybuty się skończyły) i utwórz jego bufor *
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
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
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:
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 ...).
źródło
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 .
Otóż to.
Oto przykład ze zrzutami ekranu.
źródło
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:
źródło
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:
źródło