Simplificando polígonos adjacentes usando o PostGIS?

24

Encontrei um problema ao simplificar o conjunto de polígonos adjacentes. Se eu simplificar cada polígono separadamente com o algoritmo Douglas – Peucker (que é usado por muitas ferramentas de código aberto), os polígonos resultantes geralmente não são mais adjacentes. Esse problema existe, por exemplo, ao simplificar as fronteiras de países / províncias.

Alguém tem uma solução para isso usando o PostGIS?

stachu
fonte

Respostas:

19

Um modelo vetorial de topologia fornecerá o que você precisa. Em um armazenamento não topológico (como um arquivo de forma), uma única aresta entre geometrias é armazenada duas vezes. Em um vetor topológico, as áreas são armazenadas separadamente das linhas, para que ajustes possam ser feitos sem afetar a topologia. Como não consegui encontrar um bom diagrama, criei este exemplo simples, onde as áreas A, B e C são calculadas a partir das interseções das linhas (conectando 1-4) que as separam. exemplo de um vetor topológico

Este modelo é usado pelo ArcInfo como coberturas, no GRASS como seu modelo vetorial padrão , e pode ser usado no PostGIS com a ferramenta experimental Topologia do PostGIS . Talvez uma solução mais simples seja converter seus dados em trabalho de linha, remover os segmentos redundantes e depois recriar seus polígonos após a simplificação.

scw
fonte
15

Você deseja transformar seus polígonos em linhas, transformar essas linhas em arestas de cobertura simples, simplificá-las e construí-las novamente em polígonos e, finalmente, usar o point-in-polygon para reunir novamente os atributos dos polígonos antigos com o método novos.

CREATE TABLE rings AS SELECT (ST_DumpRings(polys)).geom AS rings FROM polytable;
CREATE TABLE simplerings AS SELECT ST_Union(rings) AS simplerings FROM rings;
CREATE TABLE newpolycollection AS SELECT ST_Polygonize(ST_Simplify(simplerings, 10.0)) AS geom FROM simplerings;
CREATE TABLE newpolysnoattributes AS SELECT (ST_Dump(geom)).geom FROM newpolycollection;
CREATE TABLE newpolytable AS SELECT new.geom, old.attr FROM newpolysnoattributes new, polytable old WHERE ST_Contains(new.geom, ST_PointOnSurface(old.polys));

Existem erros acima, mas o conceito principal está lá. Você pode fazer tudo em uma consulta, se quiser.

Paul Ramsey
fonte
2

Para evitar esse problema, você deve modelar seus dados usando restrições topológicas. http://mapshaper.org/ faz isso.

julien
fonte
-1

Você precisa fazer mosaico. Na antiga teoria do ARC / INFO de criação de geometria, duas geometrias adjacentes são criadas por uma polilinha e compartilhadas. Portanto, quando você generalizou, generalizou as duas bordas porque fez referência à mesma polilinha.

CrazyEnigma
fonte