ST_BuildArea — Crée une géométrie polygonale formée par le tracé d'une géométrie.
geometry ST_BuildArea(geometry geom);
Crée une géométrie aréolaire formée par les lignes constitutives de la géométrie d'entrée. L'entrée peut être une LineString, MultiLineString, Polygon, MultiPolygon ou une GeometryCollection. Le résultat est un Polygone ou un MultiPolygone, en fonction de l'entrée. Si la ligne d'entrée ne forme pas de polygone, NULL est renvoyé.
Contrairement à ST_MakePolygon, cette fonction accepte les anneaux formés par plusieurs lignes et peut former un nombre quelconque de polygones.
Cette fonction convertit les anneaux intérieurs en trous. Pour transformer les anneaux intérieurs en polygones, utilisez ST_Polygonize.
|
|
|
Les lignes d'entrée doivent être correctement nouées pour que cette fonction fonctionne correctement. ST_Node peut être utilisé pour nouer des lignes. Si le réseau de lignes d'entrée est croisé, cette fonction produira des polygones non valides. ST_MakeValid peut être utilisé pour s'assurer que la sortie est valide. |
Disponibilité : 1.1.0
Building an area from five input lines.
WITH data(geom) AS (VALUES
('LINESTRING (180 40,30 20,20 90)'::geometry),
('LINESTRING (180 40,160 160)'::geometry),
('LINESTRING (160 160,80 190,80 120,20 90)'::geometry),
('LINESTRING (80 60,120 130,150 80)'::geometry),
('LINESTRING (80 60,150 80)'::geometry)
)
SELECT ST_BuildArea(ST_Collect(geom )) AS wkt
FROM data;
POLYGON((180 40,30 20,20 90,80 120,80 190,160 160,180 40),(150 80,120 130,80 60,150 80))
Create a donut from two circular polygons.
WITH input AS (
SELECT 'POINT(100 90)'::geometry AS geom
),
rings AS (
SELECT ST_Buffer(geom, 25, 'quad_segs=1') AS inring,
ST_Buffer(geom, 50, 'quad_segs=1') AS outring
FROM input
)
SELECT inring AS inner_ring,
outring AS outer_ring,
ST_BuildArea(ST_Collect(inring, outring)) AS area
FROM rings;
-[ RECORD 1 ]----- inner_ring | POLYGON((125 90,100 65,75 90,100 115,125 90)) outer_ring | POLYGON((150 90,100 40,50 90,100 140,150 90)) area | POLYGON((150 90,100 40,50 90,100 140,150 90),(125 90,100 115,75 90,100 65,125 90))
Input linework that crosses at non-endpoint intersections must be noded before building areas:
WITH lines(geom) AS (VALUES
('LINESTRING(36 35,45 307)'::geometry),
('LINESTRING(30 290,390 280)'::geometry),
('LINESTRING(320 60,300 310)'::geometry),
('LINESTRING(20 60,320 60)'::geometry),
('LINESTRING(120 140,168 225)'::geometry),
('LINESTRING(140 220,220 150,120 170)'::geometry)
),
noded AS (
SELECT ST_Node(ST_UnaryUnion(ST_Collect(geom))) AS geom FROM lines
)
SELECT ST_BuildArea(geom) AS area
FROM noded;
POLYGON((320 60,36.8 60,44.4 289.6,302.2 282.4,320 60),(156.9 205.3,135.2 167,220 150,156.9 205.3))
ST_Collect, ST_MakePolygon, ST_MakeValid, ST_Node, ST_Polygonize, ST_BdPolyFromText, ST_BdMPolyFromText (wrappers de cette fonction avec l'interface standard de l'OGC)