Jak uogólnić linie brzegowe?

12

Mam duży zestaw punktów danych, które zasadniczo reprezentują linię brzegową świata. Nie znam dokładnej rozdzielczości, ale powiedziałbym, że jest w okolicach 5-10m.

Wyobraź sobie zestaw punktów reprezentujących poszarpane wybrzeże. Przy rozdzielczości 1 m widzimy wszystkie szczegóły i potrzebujemy 50 punktów danych, aby poprawnie reprezentować wybrzeże, jednak przy rozdzielczości 10 km wybrzeże wygląda jak linia prosta i potrzebowalibyśmy tylko 2 punktów.

Piszę aplikację do mapowania, która będzie wymagała skalowania danych z rozdzielczości „pełnej planety” do rozdzielczości „ulicznych”. Potrzebuję pomocy w zmniejszeniu rozdzielczości moich punktów danych, a następnie ilości danych w przypadku szerszych rozdzielczości.

Czytałem o Vector-Tiling i myślę, że będzie to najlepsze rozwiązanie (już coś takiego robię), jednak przy niskich rozdzielczościach mój zestaw danych wciąż ma ogromne znaczenie, ponieważ renderowanie zajmuje [stosunkowo] długi czas czas, w którym wysokie rozdzielczości są szybkie, ponieważ „skuteczny” zestaw danych jest mały (podzbiór całości).

Próbuję ustalić, jak pobrać mój duży zestaw danych i zmniejszyć jego skalę, aby dane kafelków widoku „pełnej planety” były w zarządzaniu. Jak utworzyć sub-zestawy kafelków z większego kompletnego zestawu danych?

Z przyjemnością korzystam z narzędzia, ale wolę zrobić to sam, próbując dowiedzieć się, jak to zrobić.

Stephan
źródło
1
Czy sprawdziłeś odpowiedzi na gis.stackexchange.com/questions/6585/... ? Proszę opracować, jeśli uważasz, że twoje pytanie jest inne.
podmroku
1
Wydaje się, że pytanie powinno dotyczyć linii brzegowych zamiast „punktów”. Czy wraz ze spadkiem rozdzielczości małe wyspy powinny zniknąć? czy można przekraczać linie brzegowe wokół wąskich, serpentynowych wysp?
Kirk Kuykendall
Jeśli chcesz po prostu wykonać zadowalającą pracę i przejść dalej, odpowiedź @R Thiede jest prawdopodobnie najlepszym miejscem na rozpoczęcie. Jeśli chcesz pracować nad prawdziwym wyzwaniem, upraszczając rysowanie linii bez utraty znaczenia kształtów, zobacz powiązane pytania gis.stackexchange.com/questions/38/... i gis.stackexchange.com/questions/440/… .
matt wilkie

Odpowiedzi:

7

To, jak poradzisz sobie z rozwiązaniem tego problemu, tak naprawdę zależy od przypadku i od tego, jak ważna jest dla Ciebie aktualna topologia (w porównaniu do samego wyglądu / czasu renderowania). Ponieważ twoim ostatecznym celem jest uogólnienie linii brzegowych, przydatne mogą być pewne pomysły dotyczące uogólnienia.

Jedno podejście wykorzystuje buforowanie, jak pokazano tutaj . Miałem też podobny problem jakiś czas temu i szczegółowo opisałem tutaj moje rozwiązanie .

Krótko mówiąc, możesz korzystać z oddzielnych zestawów danych wektorowych (lub przynajmniej oddzielnych geometrii), uogólnionych na różne poziomy. To rozwiązuje twój podstawowy problem, chociaż nie korzysta z kafelków, ale oczywiście możesz nadal z nich korzystać, jeśli chcesz. Oczywiście, jeśli zamierzasz podzielić swój zestaw danych na kafelki oparte na siatce, najpierw uogólnij, w przeciwnym razie powstanie przerwa między kafelkami.

R Thiede
źródło
+1 za przemyślaną odpowiedź. Witamy na naszej stronie, Rüdiger!
whuber
5

Powinieneś przygotować różne uogólnione wersje swojego zestawu danych dla poziomów powiększenia „pełnej planety” aż do zbliżenia.

Klasycznym algorytmem uogólniającym jest algorytm Douglasa-Peuckera . Najpierw musisz połączyć punkty z liniami wybrzeża, jeśli jeszcze tego nie zrobiłeś.

podmrok
źródło
2
Biblioteka GEOS ma wbudowane algorytmy Douglasa-Peuckera, których możesz użyć, jeśli chcesz sam to kodować. Możesz jednak rozważyć topologię, w którym to przypadku narzędzie GRASS v.generalize może również pomóc.
lagerratrobe
Cześć @lagerratrobe. Stworzyłem tę wiki wiki społeczności, więc powinieneś być w stanie ją edytować bezpośrednio i dodawać do niej rozwiązania GEOS i GRASS.
podmroku