PostGIS
Description
Returns a POINT
which is guaranteed to lie in the interior of a
surface (POLYGON, MULTIPOLYGON, and CURVED POLYGON). In PostGIS this
function also works on line and point geometries.
This method
implements the OGC Simple
Features Implementation Specification for SQL 1.1. s3.2.14.2 //
s3.2.18.2
This method
implements the SQL/MM specification. SQL-MM 3: 8.1.5, 9.5.6. The
specifications define ST_PointOnSurface for surface geometries only.
PostGIS extends the function to support all common geometry types. Other
databases (Oracle, DB2, ArcSDE) seem to support this function only for
surfaces. SQL Server 2008 supports all common geometry types.
This function
supports 3d and will not drop the z-index.
Examples
PointOnSurface of a |
PointOnSurface of a |
PointOnSurface of a |
PointOnSurface of a |
SELECT ST_AsText(ST_PointOnSurface('POINT(0 5)'::geometry));
------------
POINT(0 5)
SELECT ST_AsText(ST_PointOnSurface('LINESTRING(0 5, 0 10)'::geometry));
------------
POINT(0 5)
SELECT ST_AsText(ST_PointOnSurface('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'::geometry));
----------------
POINT(2.5 2.5)
SELECT ST_AsEWKT(ST_PointOnSurface(ST_GeomFromEWKT('LINESTRING(0 5 1, 0 0 1, 0 10 2)')));
----------------
POINT(0 0 1)
Example: The result of ST_PointOnSurface is guaranteed to lie within polygons, whereas the point computed by ST_Centroid may be outside.
Red: point on surface; Green: centroid
SELECT ST_AsText(ST_PointOnSurface(geom)) AS pt_on_surf,
ST_AsText(ST_Centroid(geom)) AS centroid
FROM (SELECT 'POLYGON ((130 120, 120 190, 30 140, 50 20, 190 20,
170 100, 90 60, 90 130, 130 120))'::geometry AS geom) AS t;
pt_on_surf | centroid
-----------------+---------------------------------------------
POINT(62.5 110) | POINT(100.18264840182648 85.11415525114155)