Tengo una tabla de postgis de isolinas que se define así:
CREATE TABLE myisolines
(
gid serial NOT NULL,
isotime timestamp without timezone,
val numeric(10,4),
geom geometry(LineString,4326)
);
Visualmente, estos objetos de cadena lineal se ven así:
Sé la extensión espacial de mis datos, por lo que puedo agregar un Bbox, para que LineStrings se pueda cerrar.
Quiero crear una tabla de isopolígonos a myisopolygons
partir de una myisolines
tabla, con polígonos, que no se superpongan, sino que creen una superficie continua y tengan una columna val
con las val
isolinas más bajas , a partir de las cuales se formó el polígono. Entiendo que se puede formar a partir de isolina (isla) cerrada automáticamente, o isolina cerrada con bbox, en ese caso se val
debe tomar de esa isolina en particular. Visualmente debería verse así:
Pensé que podía crear una topología de alguna manera y luego transformar caras en polígonos, pero no entiendo cómo hacerlo correctamente. ¿Cómo se puede hacer esto?
Otra opción sería usar recursivamente una función de diferencia entre bbox y cada polígono creado, pero supongo que esa no es la forma correcta de hacerlo, y definitivamente no es rápido en absoluto.
fuente
Respuestas:
Aquí hay una solución usando
ST_Polygonize
. Genera un polígono para cada límite y proporciona la elevación mínima y máxima cubierta por el polígono. El algoritmo no puede distinguir entre un pico y una depresión y devolverá la misma elevación tanto para el mínimo como para el máximo en estos casos.La
WITH
cláusula de la consulta "cierra" los contornos abiertos al unirlos con la extensión ligeramente contraída de los contornos existentes. (Se contrata la extensión para eliminar cualquier error de redondeo resultante del uso deST_Extent
, que produce una caja de precisión única, conST_Polygonize
, que requiere entradas perfectamente cerradas y nodadas en precisión doulbe). Si sus contornos ya están cerrados (es decir, está trabajando con una isla), entonces este paso puede omitirse.fuente
No tengo mucha experiencia, pero probaría la función geometría ST_MakePolygon (geometry outsidelinestring, geometry [] interiorlinestrings);
fuente
Usando su bbox e iterando sobre cada línea de contorno, puede usar
ST_ConcaveHull
para convertir cada región en un polígono.fuente