Цей зразок створює два полігони по обидві сторони від рядкової лінії. Для нього потрібен PostGIS 1.5 або вище. Я не впевнений, наскільки добре він впорається з лініями, що перетинаються між собою.
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
));
Він виводить:
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)
Код працює наступним чином:
- Буферуйте рядок за допомогою ST_Buffer. Ми скористаємося функцією PostGIS 1.5, яка підтримує спеціальні кінцеві шафи, щоб взагалі не вказати кінцеву кришку. Дивіться приклад нижче.
- Розбийте буферизований багатокутник на два, використовуючи оригінальну лінію, використовуючи метод, зафіксований у вікі .
Це може бути вдосконалено для того, щоб в майбутньому впоратися із самопересічними лініями.