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?
DODATKOWE INFORMACJE:
Po wykonaniu sugerowanych instrukcji
- Konwertuj wielokąty na linie
- Uprość linie
- 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.
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.
- Najpierw przekształciłem wielokąty w linie
- 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.
- 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.
- 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:
v.generalize
to kolejna świetna opcja. Mam nadzieję że to pomoże.Odpowiedzi:
Mam całkiem niezły wynik, używając GRASS v.generalize z Processing Toolbox przy użyciu wartości domyślnych:
Niektóre linie pozostają nietknięte.
źródło
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!
źródło
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)
źródło
Możesz rozwiązać problem za pomocą modelu przetwarzania (ex SEXTANTE) w następujący sposób:
Wersja skryptu:
Uwaga: jedynym ograniczeniem jest to, że wspólne pole ma być
ID
wJoin attributes table
, bo to jedyna dziedzina wyjściuLines to polygons
. Dlatego wspólne pole nie jest zmiennym wejściem modelu. DlategoID
pole wejściowe musi być dostępne w warstwie wielokąta.źródło