Uproszczenie sąsiednich wielokątów za pomocą narzędzia QGIS Simplify Geometries

10

Mam duży plik Shapefile z 200 000 wielokątów, ale plik jest za duży dla aplikacji, która będzie go używać. Chciałbym uogólnić te wielokąty i utworzyć znacznie mniejszy plik.

Próbowałem to zrobić w QGIS za pomocą narzędzia „Uprość geometrię”. Próbowałem tego na bardzo małej części mojego pliku Shapefile i cieszę się z wyników, ale mam mały problem, którego nie umiem rozwiązać. Dołączyłem obraz, aby pokazać problem.

BIAŁE granice są granicami przed uproszczeniem. Granice RED są po uproszczeniu. Obszary problemowe są oznaczone kolorem pomarańczowym. Jak widać „uproszczone granice” zawierają pewne obszary, które po uproszczeniu nie należą do żadnego z poprzednich wielokątów.

Jak uprościć ten plik kształtu i zachować wspólne granice między wielokątami jako jedną linię i wyeliminować obszary utworzone po uproszczeniu?

Uproszczone wielokąty w QGIS

DODATKOWE INFORMACJE:

Po wykonaniu sugerowanych instrukcji

  1. Konwertuj wielokąty na linie
  2. Uprość linie
  3. Konwertuj linie z powrotem na wielokąty

Otrzymuję następujące wyniki. Jest nieco lepszy niż wcześniej, ale wciąż dostaję obszary poza oryginalnymi wielokątami (patrz białe obszary na obrazku poniżej).

@Andrew zasugerował, że skojarzę każdą linię z sąsiadującym wielokątem, ale nie wiem, jak to zrobić w QGIS.

wprowadź opis zdjęcia tutaj

Nadal próbuję ukończyć proces uproszczenia wielokątów. Postępowałem zgodnie z instrukcjami sugerowanymi w tym poście i kiedy pomyślałem, że uzyskałem akceptowalne wyniki, pojawił się jeszcze jeden problem. Poniżej znajduje się podsumowanie tego, co zrobiłem ze zdjęciami wyników. Wszystkie kroki zostały wykonane przy użyciu przybornika PRZETWARZANIE w QGIS.

  1. Najpierw przekształciłem wielokąty w linie
  2. Po drugie, wyczyściłem linie za pomocą v.clean z opcją break. Spowodowało to wyczyszczenie WARSTWY WEKTOROWEJ i WARSTWY BŁĘDÓW. Warstwa błędów (zielone kropki na dostarczonym obrazie) ma zieloną kropkę na każdym przecięciu linii. Nie wiem co to znaczy.
  3. Po trzecie, uprościłem linie za pomocą narzędzia „UPROSZCZENIE GEOMETRII” (dają czerwone linie na obrazach). Porównując uproszczone czerwone linie i oryginalne pomarańczowe linie, jestem zadowolony z rezultatu.
  4. Po czwarte, chciałem przekonwertować linie z powrotem na wielokąty za pomocą narzędzia „Polygonize” w „PRZETWARZANIU” i uzyskałem wyniki, których się nie spodziewałem (drugi obraz z cieniowanymi wielokątami w kolorze ciemnej oliwki). Wygląda to na skrzyżowane z poligonizatorem przecięcia warstw błędów i stworzyło zupełnie inny zestaw wielokątów, ignorując uproszczone linie.

Czy ktoś mógłby wyjaśnić, co tu poszło nie tak?

Dlaczego czerwone uproszczone linie nie zostały poprawnie przekształcone w uproszczone wielokąty?

Jak widać, nie jestem ekspertem od GIS, ale muszę to zrobić sam. Nie wiem, czy jestem zbyt daleko od rozwiązania, ale frustrujące jest to, że widzę uproszczone linie, które uznałem za akceptowalne dla tego, co chciałbym zrobić, ale nie mogę przekonwertować ich na wielokąty.

Oto dwa obrazy z wynikami dwóch ostatnich kroków procesu:

Linie uproszczone i linie oryginalne

Wyniki plygonizowanych linii uproszczonych

David
źródło
@nhopton Na Polygonizer ci stron internetowych plugins.qgis.org/plugins/Polygonizer mówi, że „Tworzy wielokątów z przecinających się linii”. Sugeruje to, że wielokąty będą tworzone za każdym razem, gdy dojdzie do przecięcia linii (ale być może moja interpretacja jest błędna). Muszę pozbyć się luk powstałych podczas korzystania z narzędzia „upraszczaj geometrie”, a jeśli Polygonizer to zrobi, byłbym bardzo szczęśliwy.
David
Myśląc o tym, twoja oryginalna warstwa wielokąta powinna uprościć bez problemów. Jeśli tak się nie dzieje, myślę, że prawdopodobnie oznacza to, że masz złe wielokąty w oryginalnych danych. Wieloboki, które lekko się nakładają lub mają między sobą niewielkie odstępy. Spróbuj powiększyć obszary problemowe, aby sprawdzić, czy możesz znaleźć coś takiego. N.
nhopton
Dobry sposób na zachowanie topologii polega na przepływie pracy sugerowanym przez @radouxju (z wyjątkiem obliczania centroidu, który nie jest konieczny) i przedstawionym w modelu przetwarzania w mojej odpowiedzi. Alternatywnie myślę, że GRASS v.generalizeto kolejna świetna opcja. Mam nadzieję że to pomoże.
Antonio Falciano
Powiązane pytanie: gis.stackexchange.com/questions/20799/…
simon04

Odpowiedzi:

7

Mam całkiem niezły wynik, używając GRASS v.generalize z Processing Toolbox przy użyciu wartości domyślnych:

wprowadź opis zdjęcia tutaj

Niektóre linie pozostają nietknięte.

AndreJ
źródło
Miał dobry sukces z tą metodą po ustawieniu tolerancji przyciągania v.in.ogr od -1 (bez przyciągania) do 0,00001, jak sugeruje @Kantan.
cm1
4

Wpadłem w ten problem z Qgis2.16, ale nie mogłem zmusić GRASS do uzyskania poprawnego topologicznie wyniku, takiego jak @AndreJ.

Dobrym rozwiązaniem jest zmiana tolerancji przyciągania v.in.ogr w zaawansowanych parametrach narzędzia v.generalize.simplify . Domyślnie jest to -1, co zapobiega przyciąganiu w GRASS.

Umieszczając tutaj małą wartość (np. 1e-05 m), przyciąganie jest włączone, a GRASS rozpoznaje wspólne granice wielokątów. Uproszczenie daje wtedy warstwę poprawną topologicznie, bez dziur.

Uwaga: Ustawiając tolerancję przyciągania na wyższe wartości, można nawet zmieniać wielokąty, aby bardzo cienkie mogły zostać usunięte, jeśli chcesz. Wykonaj tę operację za pomocą v.clean przy użyciu rmarea i progu wystarczająco dużego, aby usunąć małe resztki, i gotowe!

Kantan
źródło
3

najpierw przekształć wielokąt w linie

użyj v.clean do wyczyszczenia swojej topologii (z opcją „break”)

wtedy uprościsz swoje linie

Na koniec zamieniasz linie z powrotem w wielokąty. (Używając poligonizuj)

EDYCJA: Aby uzyskać atrybuty swoich wielokątów, najlepszym sposobem, jeśli nie masz wieloczęściowych wielokątów w oryginalnym zestawie danych , jest uzyskanie centroidów starych i uproszczonych wielokątów i połączenie ich w oparciu o najbliższą lokalizację (centroidy powinny nie ruszaj się dużo, jeśli tylko nieznacznie zmodyfikujesz swoje granice)

radouxju
źródło
1
Wygląda mi to na pominięcie kilku kroków, chociaż przepływ pracy może w końcu zadziałać. Podczas przekształcania wielokątów w linie może być konieczne skojarzenie linii ze wszystkimi sąsiadującymi wielokątami. Następnie po uproszczeniu musisz zmienić linie z powrotem w wieloczęściowe wielokąty. Jeśli oryginalne wielokąty są wypukłe, możesz być w stanie dopasować oryginał do uproszczonego za pomocą środka ciężkości (np. Jeśli środek ciężkości oryginału jest zawarty w uproszczonym poli, jest to dopasowanie). Jeśli nie są wypukłe, będzie to znacznie trudniejsze.
Andy W
Cześć. Postępowałem zgodnie z procedurą sugerowaną przez radouxju, ale nadal otrzymuję części oryginalnego wielokąta poza jego pierwotnymi granicami. Jak powiązać linię ze wszystkimi sąsiadującymi wielokątami w QGIS? Planuję używać tych wielokątów w aplikacjach internetowych i muszę zmniejszyć liczbę węzłów, aby przyspieszyć ładowanie. Teraz dostaję dobrą redukcję, ale nie mogę pozbyć się tych małych obszarów, które są tam po uproszczeniu. Wszelkie pomysły na rozwiązanie tego problemu będą bardzo mile widziane.
David
@David. Myślę, że twój problem może dotyczyć kroku 3, linii do wielokątów. W pakiecie Processing Toolkit znajduje się narzędzie o nazwie „Polygonize” i spróbowałbym tego. Myślę, że nadal wymaga to zainstalowania pakietów Shapely i Numpy. To powiedziawszy, nie mogę zmusić „Polygonize” do pracy dla mnie w QGIS-Master tylko w tej chwili. N.
nhopton
2

Możesz rozwiązać problem za pomocą modelu przetwarzania (ex SEXTANTE) w następujący sposób:

wprowadź opis zdjęcia tutaj

Wersja skryptu:

##Simplify polygons=name
##vectorlayer_input=vector
##number_tolerance=number 0.0
##output_layer_alg3=output vector
outputs_0=Processing.runalg("qgis:polygonstolines", vectorlayer_input, None)
outputs_1=Processing.runalg("qgis:simplifygeometries", outputs_0['OUTPUT'], number_tolerance, None)
outputs_2=Processing.runalg("qgis:linestopolygons", outputs_1['OUTPUT'], None)
outputs_3=Processing.runalg("qgis:joinattributestable", outputs_2['OUTPUT'], vectorlayer_input, ID, ID, output_layer_alg3)

Uwaga: jedynym ograniczeniem jest to, że wspólne pole ma być IDw Join attributes table, bo to jedyna dziedzina wyjściu Lines to polygons. Dlatego wspólne pole nie jest zmiennym wejściem modelu. Dlatego IDpole wejściowe musi być dostępne w warstwie wielokąta.

Antonio Falciano
źródło