[postgis-users] ST_Dump-like function for simple (non-multi) geometries ?
Maxime van Noppen
maxime at altribe.org
Sat Aug 1 02:54:38 PDT 2009
On 07/31/09 20:20, Kevin Neufeld wrote:
> Unfortunately, I think your solution is overly simplistic.
Of course, it is a little function dedicated to a specific use case for
my program.
> I think the
> community is after something that mimics the ST_Dump and ST_DumpRings
> functionality.
I agree.
> ie.
> SELECT (ST_Dump('MULTILINESTRING((0 0, 1 1),(2 2, 3 3))'::geometry)).*;
> path | geom
> ------+------------------------------------------------------------------------------------
>
> {1} |
> 01020000000200000000000000000000000000000000000000000000000000F03F000000000000F03F
>
> {2} |
> 0102000000020000000000000000000040000000000000004000000000000008400000000000000840
>
> (2 rows)
>
> In order to extract all the points from every geometry in a table we
> would need to be able to have this example query work that also returns
> a SETOF geometry_dump:
>
> SELECT (ST_DumpPoints(the_geom)).*
> FROM my_spatial_table;
>
> The path portion of the geometry_dump datatype is important because
> users know the index of POINT in the geometry. It'll be possible then,
> for example, to extract all but the endpoints. Additionally, users
> could group the points back together to rebuild the original geometry
> from whence they came.
>
> Also, your function would need to be a lot more robust (ie. ideally,
> able to accept all geometry types, POINT, LINESTRING, MULTIPOLYGON,
> GEOMETRYCOLLECTION, etc).
>
> I agree, the st_dump code does indeed look a little overwhelming. I
> don't think we're tied to having the function written in C (there are
> many plpgsql functions in PostGIS).
The only problem with plpgsql functions is that in versions prior to
PostgreSQL 8.4 you cannot mimic the 'RETURN SETOF' of the C. [1]
This can be solved by adding a sql function wrapper though.
[1]
http://www.depesz.com/index.php/2008/11/03/waiting-for-84-pl-srf-functions-in-selects/
> If you think you can come up with
> something that meets the desired specifications, please, by all means,
> feel free to propose something to the postgis-devel list. We'd love the
> help!
Here is a first draft (code is attached). The function handles any kind
of geometries and path.
- POINT
> # SELECT path,astext(geom) FROM (SELECT (my_ST_DumpPoints('POINT(0 0)')).*) AS foo;
> path | astext
> ------+------------
> {1} | POINT(0 0)
- MULTIPOINT
> # SELECT path,astext(geom) FROM (SELECT (my_ST_DumpPoints('MULTIPOINT((0 0), (1 1), (2 2))')).*) AS foo;
> path | astext
> -------+------------
> {1,1} | POINT(0 0)
> {2,1} | POINT(1 1)
> {3,1} | POINT(2 2)
- LINESTRING
> # SELECT path,astext(geom) FROM (SELECT (my_ST_DumpPoints('LINESTRING(0 3, 1 4, 1 5)')).*) AS foo;
> path | astext
> ------+------------
> {1} | POINT(0 3)
> {2} | POINT(1 4)
> {3} | POINT(1 5)
- CIRCULARSTRING
> # SELECT path,astext(geom) FROM (SELECT (my_ST_DumpPoints('CIRCULARSTRING(0 3, 1 4, 1 5)')).*) AS foo;
> path | astext
> ------+------------
> {1} | POINT(0 3)
> {2} | POINT(1 4)
> {3} | POINT(1 5)
- MULTILINESTRING
> # SELECT path,astext(geom) FROM (SELECT (my_ST_DumpPoints('MULTILINESTRING((0 3, 1 4, 1 5),(10 10, 15 10, 42 42))')).*) AS foo;
> path | astext
> -------+--------------
> {1,1} | POINT(0 3)
> {1,2} | POINT(1 4)
> {1,3} | POINT(1 5)
> {2,1} | POINT(10 10)
> {2,2} | POINT(15 10)
> {2,3} | POINT(42 42)
- POLYGON
> # SELECT path,astext(geom) FROM (SELECT (my_ST_DumpPoints('POLYGON((0 0, 50 50, 42 42, 0 0))')).*) AS foo;
> path | astext
> ------+--------------
> {1} | POINT(0 0)
> {2} | POINT(50 50)
> {3} | POINT(42 42)
> {4} | POINT(0 0)
- MULTIPOLYGON
> # SELECT path,astext(geom) FROM (SELECT (my_ST_DumpPoints('MULTIPOLYGON(((0 0, 1 1, 2 2, 0 0)), ((50 50, 40 40, 30 30, 50 50)))')).*) AS foo;
> path | astext
> -------+--------------
> {1,1} | POINT(0 0)
> {1,2} | POINT(1 1)
> {1,3} | POINT(2 2)
> {1,4} | POINT(0 0)
> {2,1} | POINT(50 50)
> {2,2} | POINT(40 40)
> {2,3} | POINT(30 30)
> {2,4} | POINT(50 50)
- GEOMETRYCOLLECTION
> # SELECT path,astext(geom) FROM (SELECT (my_ST_DumpPoints('GEOMETRYCOLLECTION(POINT(0 0), POLYGON((10 10, 20 10, 20 20, 10 10)))')).*) AS foo;
> path | astext
> -------+--------------
> {1,1} | POINT(0 0)
> {2,1} | POINT(10 10)
> {2,2} | POINT(20 10)
> {2,3} | POINT(20 20)
> {2,4} | POINT(10 10)
--
yabo
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: my_st_dump_points.sql
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20090801/a5896aa2/attachment.ksh>
More information about the postgis-users
mailing list