[postgis-users] Points from Polygon

tommy408 tommytomorow at msn.com
Sun Jul 5 01:49:29 PDT 2009


thank you Mike and Kevin


Mike Toews wrote:
> 
> tommy408 wrote:
>> How can I extract points from all the vertex of a polygon?
>>
>> I see there are ST_NPoints and ST_PointN for linestring.  But nothing for
>> polygons.  Maybe convert polygon to linestring then linestring to points?
>>   
> I had the same requirement a few weeks ago, and it turns out there is 
> not built-in function (yet), so you need to write your own function. 
> Here is what I came up with. It returns a geometry_dump data type, which 
> has members 'part' and 'geom'. It is similar to ST_Dump(), but returns 
> points. I have Postgres 8.3, which means that I need to wrap one 
> set-returning function in another so I can use the function on the 
> left-side of the FROM in an SQL statement. (This is a non-issue with 
> 8.4). It works with POLYGON and MULTIPOLYGON geometry types. Also, my 
> solution only returns points for boundary polygons (not inner 
> rings/islands, etc.):
> 
> CREATE OR REPLACE FUNCTION st_dumppoints_plpgsql(geometry)
>   RETURNS SETOF geometry_dump AS
> $BODY$DECLARE
>  m integer;
>  g geometry;
>  n integer;
>  p geometry_dump%ROWTYPE;
> BEGIN
>   IF GeometryType($1) LIKE 'MULTI%' THEN
>     FOR m IN SELECT generate_series(1, ST_NumGeometries($1)) LOOP
>       p.path[1] := m; -- use to store Multipolygon number
>       g := ST_Boundary(ST_GeometryN($1, m));
>       FOR n IN SELECT generate_series(1, ST_NumPoints(g) - 1) LOOP
>         p.path[2] := n; -- use to store Point number
>         p.geom := ST_PointN(g, n);
>         RETURN NEXT p;
>       END LOOP;
>     END LOOP;
>   ELSE -- It is not a MULTI- geometry
>     g := ST_Boundary($1);
>     FOR n IN SELECT generate_series(1, ST_NumPoints(g) - 1) LOOP
>       p.path[1] := n; -- use to store Point number
>       p.geom := ST_PointN(g, n);
>       RETURN NEXT p;
>     END LOOP;
>   END IF;
>   RETURN;
> END;$BODY$
>   LANGUAGE 'plpgsql' IMMUTABLE STRICT
>   COST 100
>   ROWS 1000;
> 
> 
> CREATE OR REPLACE FUNCTION st_dumppoints(geometry)
>   RETURNS SETOF geometry_dump AS
> 'SELECT * FROM ST_DumpPoints_plpgsql($1);'
>   LANGUAGE 'sql' IMMUTABLE STRICT
>   COST 100
>   ROWS 1000;
> 
> 
> 
> --Mike
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
> 
> 

-- 
View this message in context: http://www.nabble.com/Points-from-Polygon-tp24236882p24341183.html
Sent from the PostGIS - User mailing list archive at Nabble.com.




More information about the postgis-users mailing list