Eu tenho uma tabela uma tabela postgis de isolines que é definida assim:
CREATE TABLE myisolines
(
gid serial NOT NULL,
isotime timestamp without timezone,
val numeric(10,4),
geom geometry(LineString,4326)
);
Visualmente, esses objetos de cadeia de linhas são assim:
Conheço a extensão espacial dos meus dados, para adicionar uma Bbox, para que os LineStrings possam ser fechados.
Quero criar uma tabela de isopolígonos a myisopolygons
partir da myisolines
tabela, com polígonos, que não se sobreponham, mas criem uma superfície contínua e tenham uma coluna val
com o menor número val
de isolinhas, a partir da qual o polígono foi formado. Eu entendo que ele pode ser formado a partir de isolina auto-fechada (ilha) ou isolina fechada com bbox, nesse caso, val
deve-se extrair dessa isolina específica. Visualmente, deve ficar assim:
Pensei que pudesse criar topologia de alguma forma e depois transformar faces em polígonos, mas não entendo como fazê-lo corretamente. Como isso pode ser feito?
Outra opção seria usar recursivamente uma função de diferença entre bbox e cada polígono criado, mas acho que não é o caminho certo para fazê-lo, e definitivamente não é rápido.
fonte
Respostas:
Aqui está uma solução usando
ST_Polygonize
. Ele gera um polígono para cada limite e fornece a elevação mínima e máxima cobertas pelo polígono. O algoritmo não pode distinguir entre um pico e uma depressão e retornará a mesma elevação para o mínimo e o máximo nesses casos.A
WITH
cláusula da consulta "fecha" todos os contornos abertos, unindo-os à extensão levemente contraída dos contornos existentes. (A extensão é contratada para eliminar os erros de arredondamento resultantes do uso deST_Extent
, que produz uma caixa de precisão única comST_Polygonize
, que requer entradas perfeitamente fechadas e acenadas na precisão de doulbe). Se seus contornos já estiverem fechados (ou seja, você estiver trabalhando com uma ilha), essa etapa poderá ser omitida.fonte
Não sou muito experiente, mas tentaria a função geometria ST_MakePolygon (geometry outerlinestring, geometry [] interiorlinestrings);
fonte
Usando sua bbox e iterando sobre cada linha de contorno, você pode usar
ST_ConcaveHull
para converter cada região em um polígono.fonte