Cet exemple crée deux polygones de chaque côté d'une chaîne de lignes. Il nécessite PostGIS 1.5 ou supérieur. Je ne sais pas dans quelle mesure il se débrouillera avec les lignes qui se croisent.
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
));
Il génère:
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)
Le code fonctionne de la manière suivante:
- Mettez en mémoire tampon la chaîne de caractères à l'aide de ST_Buffer. Nous profitons de la fonctionnalité PostGIS 1.5 prenant en charge les embouts personnalisés afin de ne spécifier aucun embout du tout. Voir l'exemple ci-dessous.
- Divisez le polygone tamponné en deux, en utilisant la ligne d'origine, en utilisant la méthode documentée dans le wiki .
Cela pourrait être amélioré pour faire face aux lignes auto-croisantes à l'avenir.