Этот образец создает два полигона с каждой стороны строки. Требуется 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, поддерживающую пользовательские концевые заглушки, чтобы вообще не задавать заглушку. Смотрите пример ниже.
- Разделите буферный многоугольник на две части, используя оригинальную линию, используя метод, описанный в вики .
Это может быть улучшено, чтобы справиться с самопересекающимися линиями в будущем.