Ta próbka tworzy dwa wielokąty po obu stronach linii. Wymaga PostGIS 1.5 lub nowszego. Nie jestem pewien, jak dobrze poradzi sobie z przecinającymi się liniami.
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
));
Wyprowadza:
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)
Kod działa w następujący sposób:
- Buforuj oznaczenie linii za pomocą ST_Buffer. Korzystamy z funkcji PostGIS 1.5 obsługującej niestandardowe zaślepki, aby w ogóle nie określać zaślepek. Zobacz przykład poniżej.
- Podziel zbuforowany wielokąt na dwa, używając oryginalnej linii, używając metody udokumentowanej na wiki .
Można to poprawić w przyszłości, aby poradzić sobie z samobrzeżnymi liniami.