[postgis-users] Spatial query Help: points not in set of polygons

Stephen Woodbridge woodbri at swoodbridge.com
Thu Jan 24 07:14:04 PST 2008


Regina,

I think I spoke too soon. On closer inspection of the results it looks 
like the query is returning all the points in the points table.

select a.file, a.id, a.name
   from points a LEFT JOIN polygons b
     ON (a.the_geom && b.the_geom
         and distance(a.the_geom, b.the_geom) = 0.0)
  where b.the_geom IS NULL

I think this has a logic issue, IF b.the_geom is NULL then the ON clause 
must also be NULL. Does that work?

I also tried this query, which returned no points:

select file, id, name
   from points
  where distance(the_geom, (select collect(the_geom) from polygons)) > 0.0';

Any thoughts why this does not appear to work?

I'm going to try your other query and see if I get different results 
with that.

Thanks,
   -Steve

Obe, Regina wrote:
> SELECT a.*
> FROM point a LEFT JOIN polygons b
> 	ON (a.the_geom && b.the_geom
>     and ST_distance(a.the_geom, b.the_geom) = 0.0)
> WHERE b.the_geom IS NULL
> 
> or
> 
> SELECT a.*
> FROM point a LEFT JOIN polygons b
> 	ON ST_Within(a.the_geom, b.the_geom)
> WHERE b.the_geom IS NULL
> 
> I think the second one should be more efficient, but I haven't done any
> benchmarks.
> 
> Hope that helps,
> Regina
> 
> 
> -----Original Message-----
> From: postgis-users-bounces at postgis.refractions.net
> [mailto:postgis-users-bounces at postgis.refractions.net] On Behalf Of
> Stephen Woodbridge
> Sent: Wednesday, January 23, 2008 10:27 PM
> To: PostGIS Users Discussion
> Subject: [postgis-users] Spatial query Help: points not in set of
> polygons
> 
> Hi all,
> 
> I'm drawing a blank on setting up a query for this.
> 
> I have a tables points and a table of polygons. I need to find all the 
> points that are not in any of the polygons.
> 
> select a.*
>    from points a, polygons b
>   where a.the_geom && b.the_geom
>     and distance(a.the_geom, b.the_geom) > 0.0;
> 
> The problem with this is that if a point is in polygon A it will have a 
> distance to polygon B, so this in no good.
> 
> I thought of doing something like:
> 
> select * from points
>   where distance(the_geom, union((select the_geom from polygons))) >
> 0.0;
> 
> or
> 
> select * from points
>   where distance(the_geom, collect((select the_geom from polygons))) >
> 0.0;
> 
> So is there a better way to do this. Seems like there should be. If not 
> which of these would you suggest.
> 
> Thanks,
>    -Steve
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
> -----------------------------------------
> The substance of this message, including any attachments, may be
> confidential, legally privileged and/or exempt from disclosure
> pursuant to Massachusetts law. It is intended
> solely for the addressee. If you received this in error, please
> contact the sender and delete the material from any computer.
> 
> _______________________________________________
> 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