Este ejemplo crea dos polígonos en cualquiera de los lados de un linestring. Se requiere PostGIS 1.5 o superior. No estoy seguro de lo bien que va a hacer frente a las líneas que se cruzan a sí mismas.
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
));
Se emite:
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:
- El búfer de la cadena de línea utilizando ST_Buffer. Tomamos ventaja de la PostGIS 1.5 cuentan con el apoyo personalizado de tapones con el fin de no especificar la tapa de extremo. Vea el ejemplo de abajo.
- Dividir el búfer polígono en dos, utilizando la línea original, utilizando el método documentado en la wiki.
Esto podría ser mejorado para hacer frente con el auto-cruce de líneas en el futuro.