Próbuję użyć QGIS 2.14 do przyciągnięcia sieci drogowej do sześciokątnej siatki, ale otrzymuję dziwne artefakty.
Utworzyłem siatkę heksadecymalną z MMQGIS , komórki mają około 20 x 23 m. Buforowałem sieć dróg o 1 m i zagęszcziłem ją, aby węzeł pojawiał się co kilka metrów. Poniżej możesz zobaczyć, co próbuję osiągnąć. Jak widać, w niektórych przypadkach mogę go uruchomić: -
- niebieski to zagęszczona droga (linia buforowana)
- czerwony to wersja „szesnastkowa” - to właśnie chcę znaleźć
- szary to siatka heksadecymalna
Następnie użyłem nowej funkcji Snap geometrii, aby przyciągnąć węzły do najbliższego rogu sześciokąta. Wyniki są obiecujące, ale wydaje się, że istnieją przypadki, w których linia rozszerza się, wypełniając sześciokąt (lub jego część):
Powodem tego bufora jest to, że przyciąganie geometrii nie pozwala na przyciąganie do warstwy, której geometria jest inna. Na przykład nie można przyciągać węzłów na warstwie LINE do punktów na warstwie POINT). Najszczęśliwsze wydaje się przyciąganie POLYGONA do POLYGONA.
Podejrzewam, że drogi rozszerzają się, gdy jedna strona buforowanej linii drogi przeskakuje na jedną stronę komórki heksadecymalnej, a druga strona przeskakuje na drugą stronę komórki heksadecymalnej. W moim przykładzie najgorsze wydają się drogi, które przecinają zachód-wschód pod ostrym kątem.
Rzeczy, których próbowałem, bez powodzenia: -
- buforując sieć dróg o niewielką ilość, więc pozostaje wielokątem, ale jest bardzo cienki.
- zagęszczanie komórek szesnastkowych (więc na krawędziach znajdują się węzły, nie tylko w rogach)
- zmienianie maksymalnej odległości przyciągania (ma to największy efekt, ale nie wydaje mi się, aby znaleźć idealną wartość)
- używając warstw LINE, a nie POLYGONÓW
Uważam, że jeśli przejdę na używanie tylko warstw LINE, to działa przez chwilę, a następnie ulega awarii. Wydaje się, że zapisuje swoją pracę na bieżąco - niektóre linie zostały częściowo przetworzone.
Czy ktoś zna inny sposób przyciągania punktów na linii do najbliższego punktu na innej warstwie linii / wielokąta, idealnie bez potrzeby korzystania z postgres / postgis (chociaż rozwiązanie z postgis również byłoby mile widziane)?
EDYTOWAĆ
Dla każdego, kto chciałby spróbować, umieściłem tutaj na Dropbox startowy projekt QGIS . Obejmuje to warstwę siatki heksadecymalnej i warstwy linii zagęszczonych. (Sieć drogowa pochodzi z OSM, więc można ją pobrać za pomocą QuickOSM, np. Jeśli potrzebujesz uzyskać oryginał, aby nie zagęścić dróg).
Pamiętaj, że jest to OSGB (epsg: 27700), który jest zlokalizowanym UTM dla Wielkiej Brytanii, z jednostkami w metrach.
Odpowiedzi:
Moje rozwiązanie dotyczy skryptu PyQGIS, który jest szybszy i bardziej efektywny niż przepływ pracy obejmujący przyciąganie (próbowałem też). Korzystając z mojego algorytmu uzyskałem następujące wyniki:
Możesz uruchomić następujące fragmenty kodu w sekwencji z poziomu QGIS (w konsoli QGIS Python). Na koniec dostajesz warstwę pamięci z przyciąganymi trasami załadowanymi do QGIS.
Jedynym warunkiem jest utworzenie wieloczęściowego pliku Shapefile (użyj
Processing->Singleparts to multipart
, użyłem polafictitiuos
jakoUnique ID field
parametru). To da namroads_multipart.shp
plik z jedną funkcją.Oto wyjaśniony algorytm:
Zdobądź najbliższe boki sześciokąta, w którym krzyżują się trasy Dla każdego sześciokąta tworzymy 6 trójkątów między każdą parą sąsiednich wierzchołków i odpowiadającą centroidem. Jeśli jakakolwiek droga przecina trójkąt, fragment dzielony przez sześciokąt i trójkąt jest dodawany do końcowej zatrzasniętej trasy. Jest to cięższa część całego algorytmu, zajmuje 35 sekund na mojej maszynie. W pierwszych dwóch wierszach znajdują się 2 ścieżki Shapefile, należy je dopasować, aby pasowały do własnych ścieżek plików.
Pozbądź się odłączonych (lub „otwartych”) segmentów, używając list, krotek i słowników w języku Python . W tym momencie pozostały niektóre odłączone segmenty, tj. Segmenty, które mają jeden odłączony wierzchołek, ale drugi jest połączony z co najmniej innymi 2 segmentami (patrz czerwone segmenty na następnym rysunku). Musimy się ich pozbyć.
Teraz możemy utworzyć warstwę wektorową z listy współrzędnych i załadować ją na mapę QGIS :
Kolejna część wyniku:
Jeśli potrzebujesz atrybutów w przyciąganych trasach, moglibyśmy skorzystać z indeksu przestrzennego, aby szybko ocenić skrzyżowania (takie jak na /gis//a/130440/4972 ), ale to już inna historia.
Mam nadzieję że to pomoże!
źródło
Zrobiłem to w ArcGIS, na pewno można go zaimplementować za pomocą QGIS lub po prostu python z pakietem zdolnym do odczytu geometrii. Upewnij się, że drogi reprezentują sieć, tzn. Przecinają się tylko na końcach. Masz do czynienia z OSM, tak przypuszczam.
Jeśli nie chcesz tego widzieć:
Nie próbuj używać punktów pikowania na liniach Voronoi. Obawiam się, że tylko pogorszy to sytuację. Zatem twoją jedyną opcją jest tworzenie sieci z linii Voronoi i znajdowanie tras między punktami końcowymi dróg, to też nie jest wielka sprawa
źródło
Zdaję sobie sprawę, że prosisz o metodę QGIS, ale proszę o zwięzłą odpowiedź:
Uwagi:
źródło
Jeśli podzielisz linię drogi na segmenty, w których każdy segment był całkowicie zawarty w sześciokącie, twoją decyzją, które segmenty linii sześciokąta zastosować, będzie to, czy odległość od środka ciężkości podzielonego odcinka drogi do punktu środkowego każdej strony sześciokąta będzie mniejsza niż połowa średnica sześciokąta (lub mniejsza niż promień koła pasującego do sześciokąta).
Tak więc, jeśli (jeden segment na raz) wybierzesz segmenty linii sześciokąta (gdzie każdy segment jest bokiem sześciokąta), które znajdują się w odległości od promienia sześciokąta, możesz skopiować te geometrie linii i scalić je niezależnie od unikalnego identyfikatora używanego w zbiorze danych o drogach.
Jeśli masz problemy z scaleniem unikalnego identyfikatora, możesz zastosować bufor i wybrać według lokalizacji tylko w tych segmentach, aby zastosować atrybuty zestawu danych o drodze; w ten sposób nie będziesz musiał się martwić o tworzenie fałszywych dopasowań przy zbyt dużym buforze.
Problem z narzędziem przyciągania polega na tym, że przyciąga punkty bez rozróżnienia; trudno jest znaleźć idealną tolerancję w użyciu. Dzięki tej metodologii poprawnie identyfikujesz, które segmenty linii sześciokąta mają być używane, a następnie zastępujesz geometrię danych o drodze (lub wstawiasz geometrie do innego zestawu danych).
Ponadto, jeśli nadal masz problem z segmentami linii, które przeskakują z jednej strony sześciokąta na drugą, możesz podzielić linię na segmenty według wierzchołków, obliczyć długość każdej linii, a następnie usunąć wszelkie segmenty linii, które są większe niż średnia długość jednego boku sześciokąta.
źródło
Snapper geometrii w qgis 3.0 został przerobiony i umożliwia teraz przyciąganie między różnymi typami geometrii. Ma również wiele poprawek. Możesz wypróbować wersję „codziennej migawki”, aby uzyskać dostęp do ulepszonej wersji migawki przed oficjalnym wydaniem wersji 3.0.
źródło