Jorge Arévalo wrote:
... If is useful, I tested the method "ST_isvalid" with the multipolygon and returns "false". Maybe the multipolygon is not closed? I loaded the data from a shapefile. Is it possible to create a "non-valid" multipolygon? Does PostGIS accept this?

Ah, yes. Most spatial predicates in PostGIS assume the input geometry is valid. Suppose you had defined a POLYGON with a hole or inner ring outside of the exterior ring. What is the area? Does the question even make sense? PostGIS allows invalid geometries in the database so users can make full use of the PostGIS toolset to do whatever they need (ie. breakdown a polygon to it's constituent linework and rebuild it back up again to a valid polygon)

Ok, being even more specific. I'm working with data about Spain. I have a HUGE multipolygon that represents "water" (this is, the coasts around Spain and its islands). Then, the "holes" inside this multypolygon have the shape of Spain, Balearic Islands and Canary Islands. Of course, I have more multipolygons that represent "forests", "airports", "cities", etc, that fit into these holes.

Really, my problem is with some points that belong to an airport in an island. Using "ST_Within" and "ST_Contains", the result is that these points belong to the multipolygon "airport" and multipolygon "water" at same time. Obviously, the island (and its airport) is surrounded by water, but the airport's points shouldn't be part of the multopolygon "water". And, as I said, when I apply "ST_isvalid" to the multipolygon "water", returns false. Maybe is not closed?

Yeah, as mentioned before, a point that is not on the surface of a (multi)polygon (whether in a hole or completely outside) is not considered within the (multi)polygon. It does sound like your ocean polygon has validity issues.


Oh, btw, what's the difference between "ST_Within" and "Within". Does "ST_Within" use index instead of geometry? Am I right?
No, not instead of. Both use the actual geometry for testing within. ST_Within will also use the index to narrow down the candidate list first. As you can see, the definition of ST_Within is just a simple SQL wrapper that first invokes the index.
postgis=# select prosrc from pg_proc where proname = 'st_within';
prosrc ---------------------------------------
SELECT $1 && $2 AND _ST_Within($1,$2)
(1 row)

http://postgis.refractions.net/documentation/manual-svn/ST_Within.html

Cheers,
Kevin

_______________________________________________
postgis-users mailing list
[email protected]
http://postgis.refractions.net/mailman/listinfo/postgis-users

Reply via email to