Criar polígono a partir de linhas no PostGIS


13

Estou tentando dividir um polígono em polígonos menores de uma linha, mas acho que não posso usar a função st_split. O que eu preciso é criar pequenos polígonos dentro de um grande, usando a grade de cadeia de linhas.

Eu tentei algumas maneiras, mas não consigo obter o resultado. O que eu tentei:

Divida um polígono de um LineString usando st_split ()

De um polígono de limite.

insira a descrição da imagem aqui

E tabela de cadeia de linhas:

insira a descrição da imagem aqui

Eu precisaria dos seguintes polígonos:

insira a descrição da imagem aqui

Problema : Não consigo dividir um polígono de várias linhas, nem um polígono de uma cadeia de linhas múltiplas.

O outro método que estou tentando é criar polígonos a partir das linhas com st_polygonize () O SQL que estava tentando é:

SELECT 
   g.path[1] as gid, 
   g.geom::geometry(polygon, 22033) as geom 
FROM
   (SELECT 
     (ST_Dump(ST_Polygonize(geom))).* 
   FROM linestable
) as g;

Extraído de Criando polígonos a partir de segmentos de linha usando PostgreSQL e PostGIS

Problema : só consigo obter um polígono (o limite).

Alguém pode me dizer qual seria a melhor maneira de obter os polígonos da cadeia de linhas ou se estou perdendo alguma coisa?

Nota: As tabelas estão no mesmo SRID e as geometrias são ajustadas em uma grade. No QGIS, eu posso executar o processo de poligonização de linhas para polígono perfeitamente.

Conforme a demanda de John, aqui está a tabela de cadeia de linhas. https://drive.google.com/file/d/0B603y_m735jfS014S0EyVnpMUEU/view?usp=sharing


1
Você pode postar as geometrias da cadeia de linhas em algum lugar? ST_Polygonize junto com ST_Dump deve funcionar.
John Powell

Certo. Eu editei a postagem com o link para a tabela.
Pablo Pardo

@ JohnPowellakaBarça você pode olhar para isso. Esta pergunta é ótima. ST_Polygonize em seu conjunto de amostras retorna um único polígono. Nós precisamos essencialmente decompor sua bagunça de LINESTRINGS abertos e encontrar todos eles que possam formar retângulos?
Evan Carroll

1
@EvanCarroll. Certo. Estou atm loucamente ocupado, então provavelmente não por alguns dias.
John Powell

1
@ppardoz. Espero que você esteja lá. Notei que seus defs mesa estavam todos em espanhol :-)
John Powell

Respostas:


4

Comecei esse trabalho usando ST_Node primeiro, em conjunto com ST_Collect , para converter as linhas em um conjunto de cadeias de linhas nodeadas dentro de uma MultiLinestring .

Como diz a documentação para ST_Node :

Faça um nó completo em um conjunto de cadeias de linhas usando o menor número possível de nós, preservando todos os de entrada.

O que isso significa é que todas as cadeias de linhas são combinadas em todas as combinações possíveis, de modo a formar o equivalente ao anel externo de um polígono. Considerando que, se você tentar ST_Polygonize um conjunto de LineStrings, nenhum dos quais por si só descreve um polígono, basta recuperar os LineStrings. Então, isso funciona:

WITH multi(geom) AS (
  SELECT ST_Node(ST_Collect(geom))
  FROM leyenda_digitalizar00
)
SELECT ST_AsText( (ST_Dump(ST_Polygonize(geom))).geom )
FROM multi;

Se você acabou de executar a primeira parte disso, ou seja, o CTE multi, a saída será semelhante a:

MULTILINESTRING ((204.5 69.9000000000004.204.5 69.9000000000004), (204.5 68.9.205.4 68.9), (204.5 68.9.204.5 69.204.5 69.1.204.5 69.2.204.5 69.3.204.5 69.4.204.5 69.5.204.5 69.6.204.5 69.7.204.5 69.9.204.5 204,5 69,9000000000004), (209,5 68,9,209,5 68,8,209,5 68,7,209,5 68,6,209,5 68,5,209,5 68,4,209,5 68,3,209,5 68,2,209,5 68,1,209,5 68,209,5 67,9,209,5 67,8,209,5 67,7,209,5 67,6,209,5 67,5,209,5 67,4 , 209,5 .......

Agora, quando você alimentar este MultiLinestring para ST_Polygonize, ele funcionará conforme o esperado, por exemplo,

POLYGON ((205.4 68.9.204.5 68.9.204.5 69.204.5 69.1.204.5 69.2.204.5 69.3.204.5 69.4.204.5 69.5.204.5 69.6.204.5 69.7.204.5 69.8.204.5 69.9.204.5 69.9000000000004.205.4 69.9.205.4 69.3.205.4 68.9))

POLYGON ((204.5 69.9000000000004.204.5 70.204.5 70.1.204.5 70.2.204.5 70.3.204.5 70.4.206.8 70.4.209.5 70.4.209.5 70.3.209.5 70.2.209.5 70.1.209.5 70.209.5 69.9.205.4 69.9.204.5 69.9000000000004))

POLYGON ((206.8 70.4.204.5 70.4.204.5 70.5.204.5 70.6.204.5 70.7.204.5 70.8.204.5 70.9.204.5 71.204.5 71.1.204.5 71.2.204.5 71.3.204.5 71.4.206.8 71.4.206.8 70.4))

Obviamente, o ST_AsText é apenas para ilustração, e você precisará ajustar, se quiser o ID do caminho também.

O principal argumento é que ST_Polygonize espera cadeias de linhas que já descrevem o contorno de um polígono , que é o que ST_Node (ST_Collect (.... faz acima).


Isso é muito legal, posso confirmar que esta solução funciona! Por outro lado, eu me pergunto por que ST_Polygonize()diz que leva cordas de linha, ou o que o caso de uso é para isso sem chamar ST_Node()primeiro
Evan Carroll

1
@EvanCarroll. Penso que a resposta é que ST_Polygonize pega Linestrings que já estão em um conjunto que representa um polígono, enquanto as cadeias de linhas nesta pergunta formam vários polígonos possíveis. Meu entendimento é que é isso que o ST_Node faz. Tentarei investigar mais e atualizar a resposta.
John Powell
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.