Este exemplo cria dois polígonos em ambos os lados de uma cadeia de linhas. Requer PostGIS 1.5 ou superior. Não tenho certeza de como ele irá lidar com as linhas que se cruzam.
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
));
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)
O código funciona da seguinte maneira:
- Buffer a cadeia de linhas usando ST_Buffer. Aproveitamos o recurso PostGIS 1.5 que suporta tampas de extremidade personalizadas para não especificar limite de extremidade. Veja o exemplo abaixo.
- Divida o polígono em buffer em dois, usando a linha original, usando o método documentado no wiki .
Isso poderia ser melhorado para lidar com linhas de auto-cruzamento no futuro.