Jak podłączyć linie w sieci?

15

Mam plik kształtów linii i inny wielokątów. Gdy dwie lub więcej linii przecina wielokąt, należy je połączyć (przyciągnąć), ale czasami podczas ręcznej digitalizacji tak się nie dzieje. Muszę znaleźć i poprawić wszystkie te błędy. Użyłem v.cleanz GRASS GIS i to automatycznie pstryknęło wiele wierzchołków, co było dobre, ale niektóre z tych odłączonych linii są dalej od tolerancji, którą podałem, a jeśli zbyt mocno zwiększę tolerancję, zacznie generować inne rodzaje błędów.

wprowadź opis zdjęcia tutaj

Jakieś pomysły?

vascobnunes
źródło
1
Połącz przestrzennie punkty końcowe polilinii z wielobokami i podsumuj liczby według wielokąta. Dla każdego wielokąta zawierającego więcej niż jeden połączony punkt końcowy utwórz polilinię składającą się z segmentów promieniujących od środka ciężkości tych punktów końcowych do samych punktów końcowych („gwiazda”). Połącz gwiazdy z oryginalnymi poliliniami. Wyczyść wynik, aby usunąć wszelkie pojawiające się skrzyżowania. Każdy z tych kroków jest obsługiwany (i może być zautomatyzowany) przez w pełni sprawne systemy GIS. Ponieważ nie znam szczegółów QGIS ani GRASS, proponuję to rozwiązanie jedynie jako komentarz.
whuber
ale czasami wszystkie linie kończą się poza wielokątem ...
vascobnunes,
1
Co oznaczają te linie? Jeśli są rzekami, czy są one kodowane dodatkowymi informacjami, takimi jak nazwa lub porządek transmisji? Czy sieć jest ukierunkowana (np. Sieć rzeczna), jak powiedzmy, dwa strumienie pierwszego rzędu muszą przepływać do strumienia drugiego rzędu. Myślę, że próbuję powiedzieć, że możesz chcieć umieścić trochę inteligencji za procesem przyciągania, aby rozwiązać problem z podejrzanym przyciąganiem ze wzrostem tolerancji wyszukiwania.
Hornbydd
1
Twój komentarz wydaje się być sprzeczny z pytaniem. Pytanie wydaje się mówić, że chcesz przyciągać wierzchołki, które mieszczą się we wspólnym wielokącie. Jeśli wierzchołek wypada poza wielokąt, nie podajesz żadnych kryteriów, jak należy go traktować! Więc jaki dokładnie jest związek między wielokątami i poliliniami?
whuber
1
Zgadzam się z jacuzzi; może powinieneś wyjaśnić pytanie. Wygląda na to, że chcesz linii, które są „w” wielokącie, a także „blisko”, ale wykluczając te, które są „w”, ale są odpowiednio połączone?
Darren Cope

Odpowiedzi:

7

Rozumiem problem w następujący sposób:

Jeśli punkt końcowy polilinii przecina wielokąt, wówczas polilinię należy połączyć (przez dodanie lub dostosowanie wierzchołków) do wszystkich dodatkowych punktów końcowych polilinii, które przecinają ten sam wielokąt.

Niektóre punkty końcowe polilinii nie przecinają wielokąta, ponieważ są niedokończone, ale należy je połączyć jak wyżej.

Ta odpowiedź opiera się na niektórych już podanych, ale nie jest kompletna, ponieważ nie znam wszystkich poleceń QGIS - może ktoś inny może do tego dodać?

  1. Dla każdej polilinii wyodrębnij współrzędne punktu końcowego ( Wektor> Narzędzia geometrii> Wyodrębnij węzły, a następnie posprzątaj) i oblicz, czy znajdują się w obrębie wielokąta ( Wektor> Narzędzia badawcze> Wybierz według lokalizacji ).

  2. W przypadku punktów końcowych polilinii, które znajdują się w obrębie wielokąta, przedłuż ten koniec polilinii do środka wielokąta (Wyodrębnij środek wielokąta za pomocą opcji Wektor> Narzędzia geometryczne> Środek wielokąta , nie jestem pewien co do modyfikacji linii, chociaż możesz pracować z wierzchołki polilinii jako punkty i dodaj kolejne z odpowiednią numeracją przed zrekonstruowaniem zmodyfikowanej polilinii za pomocą wtyczki Punkty do ścieżek)

    Wspominasz, że mogą zdarzyć się sytuacje, w których niektóre lub wszystkie linie zostały poprawnie połączone, w takich sytuacjach (identyfikowalne przez zbieżne punkty końcowe polilinii) możesz wybrać położenie punktu końcowego zbieżnego zamiast środka ciężkości wielokąta jako punktu przedłużenia wszelkie dodatkowe niepołączone polilinie dla tego wielokąta.

  3. W przypadku punktów końcowych polilinii wychodzących poza wielokąt, przedłuż ten koniec polilinii do środka najbliższego wielokąta. Ponownie nie jestem pewien, czy policzymy najbliższy wielokąt, chociaż moduł GRASS v.distance wygląda na załatwienie sprawy.

Andy Harfoot
źródło
to dobre uzasadnienie rozwiązania problemu. Doszłam też do czegoś takiego z odpowiedzią Alexgleith. Ale utknąłem w operacji „przedłużenia tego końca polilinii do centrum najbliższego wielokąta”. Pytanie brzmi: jak to zrobić? Jeśli użyję v.clean.snap do centroidów wielokątów, nadal przesunie ona wszystkie wierzchołki, które nie są punktami końcowymi ...
vascobnunes
Jednym podejściem byłoby przekonwertowanie polilinii na punkty zgodnie z opisem i, jeśli to konieczne, dodanie dodatkowego punktu na początku lub na końcu danej linii, zgodnie z lokalizacją istniejącego punktu początkowego lub końcowego. Lokalizacją dodanego punktu byłby środek ciężkości wielokąta, a punktowi przypisano by numer sekwencji wierzchołków -1 lub 1000000, aby umieścić go na początku lub na końcu polilinii. Umożliwiłoby to następnie odtworzenie polilinii za pomocą narzędzia Punkty do ścieżki
Andy Harfoot
2

Myślę, że mógłbym to zrobić za pomocą niestandardowego algorytmu ... Zwróć uwagę, jak chcesz go zaimplementować, ale myślę, że zadziałałoby.

Dla każdej linii, dla każdego punktu końcowego, wykonaj punkt w wielokącie dla wierzchołka w punkcie końcowym i połącz go z wielokątem.

Następnie dla każdego wielokąta, jeśli jest połączony więcej niż jeden punkt końcowy linii, scaliłbym (przesunął) je wszystkie ze średnią współrzędną lub być może środkiem ciężkości wielokąta.

To całkiem proste. Ale niedostępne u standardowych operatorów. Myślę, że można to zrobić w ArcGIS z czasem kodowania dni.

Kolejna uwaga, na opublikowanym obrazie, jedna z linii znajduje się poza wielokątem ... Możesz sobie z tym poradzić w prostszy sposób, po prostu znajdując najbliższy wierzchołek do każdego z końcowych wierzchołków, upewniając się, że bliskość jest wzajemna (myślę, że to jest konieczne, aby wierzchołki były przyciągane tylko w jeden sposób), możesz przenieść je do średniej pozycji wierzchołków.

Alex Leith
źródło
1

Ciekawy problem! Nie mogę wymyślić sposobu na automatyczne wykonanie przyciągania, ale oto krok w identyfikowaniu obszarów, w których należy przynajmniej szukać ręcznej korekty:

  • Dodaj nową kolumnę do warstwy linii i ustaw ją na „1” dla wszystkich obiektów.
  • W obszarze Wektor> Połącz atrybuty według lokalizacji ustaw warstwę docelową na warstwę wielokąta, a warstwę jako warstwę łączenia. Następnie wybierz „Zrób podsumowanie przecinających się funkcji” i kliknij „Suma”. Podaj lokalizację pliku wyjściowego i „OK”.
  • Powstały plik wielokąta będzie oryginalną warstwą wielokąta, ale z kilkoma dodatkowymi polami. Pole SUM jest tym, czego chcesz; gdy jest 2, oznacza to, że możesz wtedy powiększyć i ręcznie przyciągnąć funkcje.

W zależności od sytuacji (liczba funkcji, liczba znajdujących się w tej sytuacji w porównaniu z tymi, które nie są itp.) Może to zaoszczędzić trochę czasu.

EDYCJA: Możesz również użyć wielokątów z sumą 2, aby utworzyć podzestaw warstw linii, a następnie uruchomić czyszczenie na tych z większą tolerancją, aby nie zmieniać innych funkcji.

Darren Cope
źródło
Zrobiłem już coś takiego. Użyłem nawet v.net do pobrania węzłów dla linii i dokonałem przestrzennego wyboru wielokątów pasujących do węzłów. Znalazłem wiele błędów do poprawienia za pomocą tego, ale nadal mam 3 duże problemy: 1) tysiące błędów można naprawić ręcznie, co zajmuje dużo czasu; 2) Nie dostaję wszystkich błędów, ponieważ w niektórych przypadkach linie lub węzły nawet nie „dotykają” wielokątów; 3) dostaję błędy, które nie są błędami, ponieważ gdy dwie linie łączą się prawidłowo, są one również zaznaczone.
vascobnunes
0

kiedy już masz punkty końcowe, zrobiłbym schemat pająka, biorąc centroidy wielokątów jako obiekty i punkty końcowe pobliskich linii jako cele. Wykonujesz analizę diagramu pająka, w wyniku czego miałbyś segment dla każdej polilinii.

Działałoby to nawet dla osób kończących się poza wielokątami. Jak to zrobić w QGIS, nie wiem, przepraszam, ale zrobiłbym to w produktach ESRI, które dobrze znam. Właśnie to zrozumiałem, gdy whuber w pierwszej odpowiedzi zaproponował zbudowanie „gwiazdy”.

Jestem prawie pewien, że są tu ludzie, którzy wiedzą, jak przeprowadzić taką analizę w QGIS

ankilosado
źródło
4
Witamy w GIS Stack Exchange! Zauważyłem, że twoja odpowiedź wzbudziła pewne negatywne opinie i podejrzewasz, że zasugerowałeś alternatywę dla technologii używanej przez pytającego (GRASS / QGIS). Moją rekomendacją byłoby przekazywanie takich sugestii jak komentarzy zamiast odpowiedzi, a jeśli pytający wydaje się zainteresowany, przekaż informacje do odpowiedzi.
PolyGeo