Juntando muitos polígonos pequenos para formar polígonos maiores usando o PostGIS?

47

Eu tenho a seguinte camada usando SRID 27700 no postgis:

insira a descrição da imagem aqui

É todas as regiões administrativas do Reino Unido e (como você pode ver no agrupamento de cores) cada uma delas possui um campo de texto especificando o município em que se encontram.

O que eu gostaria de fazer é criar polígonos maiores do condado dos menores em um determinado condado, de modo que, na figura acima, todos os polígonos de cor verde-azulado formariam um polígono grande a partir do anel externo que contém todos os polis do cor, como todos os roxos, marrons, rosa, cinza etc, todos devem formar um polígono.

Eu já tentei o seguinte:

insert into parishesmerged (geometry)
select astext(multi(ST_Union(the_geom))) as the_geom from parishes
group by county_name

Mas ele continua gerando geometrias quebradas, que então eu tenho grandes problemas para processar ainda mais.

Estou tentando fazer um mapa mais simples no nível do condado com as principais áreas de produção de.

Quaisquer soluções não precisam estar no Postgis também, eu tenho a pilha OS4Geo completa instalada, a versão mais recente do QGis e mais utilitários do que posso usar.

As únicas coisas que não tenho são os meninos grandes como ArcGis (embora eu possa ter um Old Mapinfo por aí em algum lugar)


Para o registro, o conjunto de dados que estou tentando criar é acompanhar um livro GIS que estou escrevendo, destinado a programadores .NET que desejam escrever aplicativos GIS usando .NET


Depois de tentar as sugestões abaixo, a que melhor funcionou foi a solução 'Paul Ramseys'.

Agora tenho um bom arquivo simplificado de municípios e distritos, que é simples o suficiente para o meu livro, mas complexo o suficiente para permitir que eu demonstre algumas SQL geoespaciais interessantes.

Embora a solução de Paul tenha sido a que funcionou para mim, eu também recorri às outras respostas para simplificar o mapa de polígonos e reduzir ainda mais a complexidade.

Porém, quando observei isso, enquanto ST_Collect é realmente mais rápido que ST_Union, corrida por corrida também foi a principal responsável por geometrias quebradas. Meu palpite é que o aumento de velocidade é obtido à custa de menos precisão na função principal.

shawty
fonte
Este processo é conhecido como "dissolver". Não tenho experiência com o PostGIS, mas acredito que você pode usar o comando ST_Union para executar a dissolução.
dmahr
Oi dmahr, obrigado pelo esclarecimento, não tinha certeza o que foi chamado, no entanto, se você ler a minha pergunta que você vai ver que eu já tentei isso :-)
shawty
Opa, desculpe ... não vi isso. Você já tentou a instrução select sem a astext(multi())peça? Estou saindo do que vejo em outros exemplos de dissolução do PostGIS.
dmahr 21/08/2012
Ainda não, tentarei isso agora. Tks. Você tem um link para exemplos de dissolução?
quer
Por favor, edite para express se você deseja "o único anel externo" ou não. (ver minha resposta)
Peter Krauss

Respostas:

43

ST_Union funcionaria, mas seu trabalho de linha quase certamente não está limpo. Portanto, os limites de suas coisinhas não se encaixam perfeitamente. Você pode encaixá-los suavemente em uma grade para tentar aumentar as chances de os vértices se alinharem, mas aposto que você ainda terá alguns casos que não funcionam. Eles estarão além da tolerância ou, mais provavelmente, haverá lugares onde os vértices não estão emparelhados, portanto, há uma linha de um lado e um vértice do outro.

 CREATE TABLE merged AS
 SELECT ST_Union(ST_SnapToGrid(the_geom,0.0001)) 
 FROM parishes
 GROUP BY county_name;

Se você possui o PostGIS 2.0, construir uma estrutura de topologia com tolerância pode levá-lo à resposta que está procurando, se tiver alguma sorte.

Paul Ramsey
fonte
Boa pista para a correção de geometrias, mas sobre "... um polígono grande do anel externo único que contém todas as polis ..."?
Peter Krauss
Eu não sabia sobre 'SnapTo', vou tentar :-) Tks. Infelizmente, não, ainda não usando o PG 2, a atualização está em andamento.
22612 shawty
Não tenho certeza se sua sintaxe está correta. Por postgis.net/docs/ST_Union.html , não há assinatura que aceite um número no segundo parâmetro.
Aren Cambre
Você está certo, o parêntese estava no lugar errado. Editado.
Paul Ramsey
existe um mysql equivalente a isso? eu continuo recebendo Incorrect parameter count in the call to native function 'ST_Union'e não sei se é uma limitação do mysql.
21416 Jayen
7

Você diz que precisa "... formar um polígono grande a partir do anel externo único que contém todos os polígonos ...". O ST_ExteriorRing faz isso,

SELECT ST_MakePolygon(ST_ExteriorRing(ST_Union(GEOM)))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

Você pode usar ST_Union (), como sugerido, ou testar com ST_Collection ().


OBSERVAÇÕES: para evitar pequenos saltos ou "geometrias quebradas", você pode usar st_convexhull e / ou ST_Simplify para cada geom,

SELECT ST_MakePolygon(ST_ExteriorRing(ST_union(ST_Simplify(GEOM,0.5))))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

e verifique suas geometrias,

SELECT * FROM (
   SELECT gid, ST_IsValid(geom) as valid, ST_IsSimple(geom) as simple 
   FROM GEOMTABLE) AS t  
WHERE NOT(valid AND simple); 
Peter Krauss
fonte
Desculpe a confusão: o que eu quis dizer com minha descrição foi um polígono maior criado a partir dos menores, e percebo que dependendo do contexto 'Anel Externo' pode significar coisas diferentes para pessoas diferentes, minha intenção era descrever um único polígono criado a partir do limite presente em torno de cada grupo de polígonos.
quer
7

A função ST_Collect é uma função "agregada" na terminologia do PostgreSQL

" SELECT ST_Collect(GEOM) FROM GEOMTABLE GROUP BY ATTRCOLUMN" retornará uma GEOMETRYCOLLECTION separada para cada valor distinto de ATTRCOLUM

http://postgis.net/docs/ST_Collect.html

Nota: ST_Collect é muito mais rápido que ST_Union

Mapperz
fonte
3
Eu tentei isso e obtive resultados ligeiramente diferentes, no entanto, é uma coleção de geometria que eu preciso? Estou essencialmente tentando fazer um polígono grande, opcionalmente com buracos (Especificamente em Derbyshire e Nottinghamshire, onde Derby e Nottingham formam distritos separados bem no centro. Observei a diferença de velocidade, portanto, isso é algo demais
shawty
2

Estou supondo, com base na sua pergunta, que você está usando o produto Boundary-Line da Ordnance Survey. Se for esse o caso, ele já inclui um conjunto de dados no nível do condado, portanto não há necessidade de tentar gerá-lo você mesmo a partir de áreas paroquiais de nível inferior.

Se você não estiver usando a Linha de Fronteira, recomendo que faça isso de graça sob a licença OS OpenData e tenha um nível de Condado como um arquivo de forma que você pode carregar diretamente no PostGIS.

CHenderson
fonte
2
Que tal fornecer um link para quem não o conhece? obrigado.
jonatr
1
Olá CHEnderson, você está realmente correto, sim, eu estou usando o conjunto de dados da camada de limite do OS Opendata, infelizmente os limites do condado não estão completos, o arquivo de formas do condado real inclui apenas aqueles que são nomeados condados, os bairros de Londres contêm as áreas ao redor Londres e outros arquivos têm algumas partes, alguns níveis mais baixos e menores que os outros. O único arquivo que contém todo o esboço do Reino Unido e, posteriormente, qualquer chance de extrair todos os municípios de nível superior e limites municipais em uma camada é a camada de paróquias, por isso estou tentando fazê-lo.
shawty
Para aqueles que estão interessados você pode baixar os limites do condado e mais, aqui: ordnancesurvey.co.uk/oswebsite/products/os-opendata.html
shawty