Como generalizar linhas costeiras?

12

Eu tenho um grande conjunto de pontos de dados que representam essencialmente a costa do mundo. Não sei a resolução exata, mas diria que é de 5 a 10m.

Imagine um conjunto de pontos que representam um litoral irregular. Em uma resolução de 1 metro, vemos todos os detalhes e precisamos de 50 pontos de dados para representar corretamente a costa, no entanto, com 10 km de resolução, a costa se parece com uma linha reta e precisaríamos apenas de 2 pontos.

Estou escrevendo um aplicativo de mapeamento que exigirá que os dados sejam dimensionados de resoluções "de todo o planeta" para resoluções "de rua". Preciso de ajuda para reduzir a resolução dos meus pontos de dados e, posteriormente, a quantidade de dados para resoluções maiores.

Eu tenho lido sobre Vector-Tiling e acho que essa será a melhor solução (já estou fazendo algo assim). No entanto, em baixas resoluções, meu conjunto de dados ainda é enorme, o que significa que a renderização demora um pouco [relativamente] tempo, onde as altas resoluções são rápidas porque o conjunto de dados 'efetivo' é pequeno (subconjunto do todo).

Estou tentando determinar como pegar meu grande conjunto de dados e reduzir a escala dele para que os dados do bloco da visualização do meu 'planeta inteiro' tenham um tamanho gerenciável. Como crio os subconjuntos de dados do bloco a partir do conjunto de dados completo maior?

Fico feliz em usar uma ferramenta, mas prefiro fazê-lo em um esforço para aprender como é feito.

Stephan
fonte
1
Você verificou as respostas para gis.stackexchange.com/questions/6585/… ? Elabore se você acha que sua pergunta é diferente.
underdark
1
Parece que a pergunta deve ser sobre costas em vez de "pontos". À medida que a resolução diminui, as pequenas ilhas devem desaparecer? está tudo bem cruzar as costas em torno das ilhas serpentinas magras?
precisa saber é o seguinte
Se você quer apenas fazer um trabalho aceitável e seguir em frente, a resposta de @R Thiede é provavelmente o melhor lugar para começar. Se você deseja trabalhar no desafio real, simplificando o trabalho de linha sem perder o significado das formas, consulte as perguntas relacionadas gis.stackexchange.com/questions/38/… e gis.stackexchange.com/questions/440/… .
mate Wilkie

Respostas:

7

Como você resolverá esse problema realmente depende do caso e da importância da topologia real para você (versus apenas o tempo visual / de renderização). Como seu objetivo final é generalizar linhas costeiras, algumas idéias sobre generalização podem ser úteis.

Uma abordagem usa buffer, como visto aqui . Eu também tive um problema semelhante há um tempo e detalhei minha solução aqui .

Em resumo, você pode fazer uso de conjuntos de dados vetoriais separados (ou pelo menos geometrias separadas), generalizados em diferentes níveis. Isso soluciona seu problema básico, embora não faça uso de blocos, mas é claro que você ainda pode usá-los, se quiser. Obviamente, se você deseja dividir seu conjunto de dados em blocos com base em uma grade, generalize primeiro, ou você terá lacunas entre os blocos.

R Thiede
fonte
+1 para uma resposta cuidadosa. Bem-vindo ao nosso site, Rüdiger!
whuber
5

Você deve preparar diferentes versões generalizadas do seu conjunto de dados para os níveis de zoom de "planeta inteiro" até o zoom aproximado.

Um algoritmo de generalização clássico é o algoritmo de Douglas-Peucker . Você precisará conectar os pontos às linhas costeiras primeiro, se ainda não o fez.

submundo
fonte
2
A biblioteca GEOS possui algoritmos Douglas-Peucker integrados que você pode usar, se quiser codificar isso sozinho. Você pode considerar a topologia, nesse caso, a ferramenta GRASS v.generalize também pode ajudar.
Lagerratrobe
Oi @lagerratrobe. Eu criei esta resposta como wiki da comunidade, para que você possa editá-lo diretamente e adicionar soluções GEOS e GRASS.
Underdark