[postgis-users] How to trim a GeometryCollection to get a MultiPolygon?

Michael Smedberg Michael.Smedberg at redfin.com
Mon Aug 4 10:28:56 PDT 2008


I have some SQL that intersects a number of multipolygons, and then
attempts to test whether a point is in the result.  In most cases it
works fine.  However, some intersections return a GeometryCollection,
which results in an error like:

ERROR:  Relate Operation called with a LWGEOMCOLLECTION type.  This is
unsupported

Is there a simple and generic way to simplify the collection to trim out
linestrings, etc.?  Through experimentation, I've found that doing an
ST_Buffer(XXX, 0.0) will clean up the GeometryCollection, but I don't
know if that's a safe thing to rely on.

Here's an example of a problematic SQL statement:

SELECT ST_Contains
(
        ST_Intersection
        (
                GeomFromText('MULTIPOLYGON(((0 0,0 2,2 2,2 0,0 0)),((0
4,2 4,2 6,0 6,0 4)))', 4326),
                GeomFromText('POLYGON((0 1,2 1,2 4,0 4,0 1))', 4326)
        ),
        GeomFromText('POINT(1 1.5)', 4326)
)

And here's an example of a "fixed" SQL statement:

SELECT ST_Contains
(
        ST_Buffer
        (
                ST_Intersection
                (
                        GeomFromText('MULTIPOLYGON(((0 0,0 2,2 2,2 0,0
0)),((0 4,2 4,2 6,0 6,0 4)))', 4326),
                        GeomFromText('POLYGON((0 1,2 1,2 4,0 4,0 1))',
4326)
                ),
                0.0
        ),
        GeomFromText('POINT(1 1.5)', 4326)
)

Is it OK to use ST_Buffer to clean up a GeometryCollection?  Or is there
a
better/safer way to do this?

Thanks so much!




More information about the postgis-users mailing list