Esta muestra crea dos polígonos a cada lado de una cadena lineal. Requiere PostGIS 1.5 o superior. No estoy seguro de qué tan bien hará frente a las líneas que se cruzan.
SELECT ST_AsText(geom)
FROM ST_Dump ((
SELECT
ST_Polygonize(GEOMUNION(ST_Boundary(ST_Buffer(the_geom, 0.5, 'endcap=flat join=round')), the_geom)) AS buffer_sides
FROM
(SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') AS the_geom) AS table1
));
Produce:
st_astext
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------
POLYGON((0.5 5,0.509607359798385 5.09754516100806,0.538060233744357 5.19134171618254,0.584265193848727 5.2777851165098,
0.646446609406726 5.35355339059327,0.722214883490199 5.41573480615127,0.808658283817455 5.46193976625564,0.9024548389919
36 5.49039264020162,1 5.5,5 5.5,5 5,1 5,1 1,0.5 1,0.5 5))
POLYGON((5 5,5 4.5,1.5 4.5,1.5 1,1 1,1 5,5 5))
(2 rows)
El código funciona de la siguiente manera:
- Buffer la cadena de líneas usando ST_Buffer Aprovechamos la función PostGIS 1.5 que admite tapas finales personalizadas para no especificar ninguna tapa final. Ver ejemplo a continuación.
- Divida el polígono protegido en dos, usando la línea original, usando el método documentado en la wiki .
Esto podría mejorarse para hacer frente a las líneas de cruce automático en el futuro.