Como a degradar de forma inteligente ou suavizar dados GIS (polígonos simplificadoras)?

StackOverflow https://stackoverflow.com/questions/1849928

Pergunta

Eu ter detalhado mapas condado norte-americanos, desde o TIGER LINHA conjuntos de dados. Como poder amostra I, suavizar ou degradar os dados para que eu me reto, mais quadradão, menos formas "barulhentos" para representar as características geográficas - neste caso apenas os limites do condado e estado linhas, mas talvez também no caso geral?

A amostragem pode acontecer em tempo de renderização se isso pode ser feito de forma eficiente, ou um conjunto de dados paralela poderia ser gerado e armazenado. Eu estou usando PostGIS , e as linhas são multi-polilinhas gerados por shp2pgsql - mas qualquer solução onde você tomar um linha ondulada e reduzi-lo a uma linha mais suave de aproximadamente o mesmo significado para um intérprete humano seria muito útil.

Foi útil?

Solução

O problema com simplesmente jogando fora pontos é que você pode rapidamente distorcer a forma do polígono originais. Uma abordagem melhor é vir para ele de outra direção; começar com uma aproximação básica do polígono e depois refiná-lo para cima em direção a sua forma complexa.

Um excelente exemplo desta abordagem é o Douglas-Puecker algoritmo . Você começa com dois vértices extraídos do polígono completo. Adicionar um terceiro vértice, seleccionando a que se encontra mais distante uma aresta desenhada entre os dois primeiros vértices. Continue adicionando pontos até que você tenha algo que se assemelha suficientemente seu polígono originais.

Outras dicas

Douglas-Peucker é definitivamente a abordagem correta. Existem algumas maneiras simples para implementações de acesso do que em PostGIS e QGIS que eu pensei que eu gostaria de acrescentar aqui para aqueles que se deparar com este post com uma pergunta semelhante. O objetivo é começar com algo como isto:

text alt

e acabar com algo parecido com isto:

text alt

Em PostGIS Douglas-Peucker é implementado como simplify, a sintaxe, detalhou aqui no bostongis.org , é alguma variante:

SELECT transform(simplify(transform(the_geom, 2249), 500),4326) from the_geo_table

Isso funcionou muito bem, mesmo no conjunto de dados nacional completo, com alguns poucos erros que parecem devido a dados subjacentes ruins. Nota-se também que no QGIS o Tools > Geometry Tools > Simplify Geometries item de menu irá exportar um shapefile simplificado de qualquer geometria e adicioná-lo como uma camada para seu projeto atual.

Este é um conjunto de ferramentas muito fundamental e eu fiz a pergunta a um nível demasiado baixo, embora fosse bom para aprender a matemática subjacente, há uma boa explicação de que aqui: http://www.mappinghacks.com/code/PolyLineReduction/ , juntamente com o código de exemplo que acaba por não ser muito necessário

Em vez de QGIS, eu sugiro usar ogr2ogr porque não polígonos de exclusão !

ogr2ogr output.shp input.shp -simplify 0.0001

Aqui está um algoritmo de suavização iterativo simples:

para cada três pontos sequenciais em qualquer caminho, se o ponto médio não tem cruzamentos e está dentro de algum pequeno ângulo limiar do caminho directo entre os dois pontos externos, removê-lo.

Repita até satisfeito.

Você também pode tentar o algoritmo de Visvalingam, que iteratively remove a parte menos perceptível de uma linha. Aqui está uma grande explicação de que o algoritmo:

Você também pode usar Simplify.js que utiliza uma combinação de Douglas-Peucker e algoritmos radial Distância. Há também links para muitos portos para outros idiomas listados no github projeto

Resposta por @unmounted é correto, mas eu gostaria de acrescentar mais uma sugestão.

Use sempre função ST_SimplifyPreserveTopology vez de ST_Simplify em PostGIS. Ambos usam o mesmo algoritmo subjacente (Douglas-Peucker), mas os antigos evita qualquer simplificações que resultaria em geometrias inválidas. Por exemplo, ST_Simplify pode resultar em geometria que se cruza.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top