[postgis-users] How do multipolygons work?

Kevin Neufeld kneufeld at refractions.net
Sun Dec 9 21:48:06 PST 2007


Hi Simon,

For most spatial functions, PostGIS assumes that input geometries are 
valid - nondeterministic results are bound to occur otherwise.  This is 
what you are seeing here.  The MultiPolygon you've posted here is not 
valid.  It's actually a multipolygon geometry with a single internal 
invalid polygon whose internal ring lies outside and intersecting the 
boundary of the exterior ring on a line.  Also, the orientation of the 
exterior ring is counter-clockwise.

I think you may have meant to post a multipolygon of two touching 
adjacent polygons:
MULTIPOLYGON(((0 0 0, 40 0 0, 40 50 0, 0 50 0, 0 0 0)),((40 0 0, 50 0 0, 
50 50 0, 40 50 0, 40 0 0)))

But this too is invalid according to the OpenGIS Simple Features 
Specification for SQL.
  "The Boundaries of any 2 Polygons that are elements of a MultiPolygon 
may not 'cross' and may touch at only a finite number of points."
In otherwords, your adjacent polygons may only touch at a point(s), not 
a line.

However, having said that, you will probably get the the answer you are 
looking for using the modified multipolygon and the current version of 
PostGIS.
postgis=# SELECT
postgis-#   intersects(
postgis(#     'MULTIPOLYGON ((( 0 0, 40 0, 40 50, 0 50, 0 0 )),
postgis(#                    (( 40 0, 50 0, 50 50, 40 50, 40 0 
)))'::geometry,
postgis(#     'POINT(45 5)'::geometry),
postgis-#   intersects(
postgis(#     'MULTIPOLYGON ((( 0 0, 40 0, 40 50, 0 50, 0 0 )),
postgis(#                    (( 40 0, 50 0, 50 50, 40 50, 40 0 
)))'::geometry,
postgis(#     'POINT(20 5)'::geometry);
 intersects | intersects
------------+------------
 t          | t
(1 row)

But like I said, this result is nondeterministic.  Since the input is 
still invalid, you may not get this same result in future releases.

Hope this clarify things,
Cheers,
Kevin

Simon Schneider wrote:
> Hi,
>
> I've a table with a multigeometry geometry column with only one object 
> inserted:
>
> insert into test(name, geom) values('Main', 
> GeomFromEWKT('MULTIPOLYGON(((0 0 0, 40 0 0, 40 50 0, 0 50 0, 0 0 
> 0),(40 0 0, 50 0 0, 50 50 0, 40 50 0, 40 0 0)))'));
>
>
> And now I wanted to check whether a certain point lies within this 
> multipolygon via this query:
>
> SELECT name FROM test WHERE distance(GeomFromText('POINT(45 5)',-1), 
> geom)=0;
>
> The thing I don't understand is that above query delivers no result, 
> but when I try a query with the point inside the first part of the 
> multipolygon like:
>
> SELECT name FROM test WHERE distance(GeomFromText('POINT(20 5)',-1), 
> geom)=0;
>
> it returns "Main" as expected.
>
>
>
> Can anybody explain to me why the query doesn't return anythin wheng 
> the point is in the second polygon?
>
>
>
> Cheers,
> Simon
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users



More information about the postgis-users mailing list