wiki:UsersWikiBuildPolygonsWithLines

Version 4 (modified by Mike Taves, 10 years ago) ( diff )

also consider closed LINESTRINGS

Building areas from lines

Built-in PostGIS functions ST_BuildArea and ST_Polygonize can be used to construct Polygons from linework. However the start/end points of all lines must touch each other to form the polygons. Also the linework needs to be properly noded at intersections, rather than just crossing each other.

A user-submitted function takes a collection of LINESTRING or a MULTILINESTRING geometry and returns a geometry:

CREATE OR REPLACE FUNCTION ST_BuildAreaLinework(linework geometry) RETURNS geometry AS
'WITH data AS (SELECT * FROM ST_Dump(ST_UnaryUnion($1)))
SELECT ST_SetSRID(ST_BuildArea(ST_Collect(geom)), ST_SRID($1))
FROM
(
  SELECT (ST_Dump(ST_Union(geom))).geom FROM data
) t1,
(
  SELECT ST_Union(geom) AS pt
  FROM (
    SELECT ST_Intersection(A.geom, B.geom) AS geom
    FROM data A, data B
    WHERE A.path[1] < B.path[1] AND ST_Intersects(A.geom, B.geom)
    UNION SELECT ST_StartPoint(geom) FROM data WHERE ST_IsClosed(geom)
  ) s
) t2
WHERE ST_Intersects(ST_StartPoint(geom), pt) AND ST_Intersects(ST_EndPoint(geom), pt);' LANGUAGE sql IMMUTABLE;

For example:

SELECT ST_BuildAreaLinework('MULTILINESTRING((36 35,45 307),(30 290,390 280),(320 60,300 310),(20 60,320 60),(120 140,168 225),(140 220,220 150,120 170))');

Where the yellow lines are the input linework, and the yellow polygon with a hole is the result.

example for ST_BuildAreaLinework

Attachments (2)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.