[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