[postgis-users] intersection/within queries - newbie basicspatial queries

Kevin Neufeld kneufeld at refractions.net
Fri Dec 7 09:16:23 PST 2007


Correct.  This JOIN query is the same thing that I posted yesterday, but 
using a WHERE clause instead.

Josh,
A quick note on your comment about gist indexes.  I totally agree with 
you that you need the && operator, but now in postgis, most of the st_* 
methods are simple wrappers of previous methods and include the && operator.
i.e.
test=# \df+ st_within
                                                            List of 
functions
 Schema |   Name    | Result data type | Argument data types |  Owner   
| Language |              Source code              | Description
--------+-----------+------------------+---------------------+----------+----------+---------------------------------------+-------------
 public | st_within | boolean          | geometry, geometry  | postgres 
| sql      | SELECT $1 && $2 AND _ST_Within($1,$2) |
(1 row)

In fact, I've noticed that sometimes adding an extra && operator can 
make a query take longer.  Here is an example two tiny tables I have:

test=# explain analyze
select a.* from neighbourhood_poly a, cityarea_poly b
where st_within(a.the_Geom, b.the_Geom);
                                                        QUERY 
PLAN                                                       
--------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=1.03..4.24 rows=19 width=30271) (actual 
time=2.391..121.782 rows=15 loops=1)
   Join Filter: ((a.the_geom && b.the_geom) AND _st_within(a.the_geom, 
b.the_geom))
   ->  Seq Scan on neighbourhood_poly a  (cost=0.00..1.26 rows=26 
width=30271) (actual time=0.049..0.233 rows=26 loops=1)
   ->  Materialize  (cost=1.03..1.06 rows=3 width=15506) (actual 
time=0.006..0.192 rows=3 loops=26)
         ->  Seq Scan on cityarea_poly b  (cost=0.00..1.03 rows=3 
width=15506) (actual time=0.015..0.028 rows=3 loops=1)
 Total runtime: 122.979 ms
(6 rows)

test=# explain analyze
select a.* from neighbourhood_poly a, cityarea_poly b
where st_within(a.the_Geom, b.the_Geom)
and b.the_geom && a.the_geom;
                                                        QUERY 
PLAN                                                       
--------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=1.03..4.44 rows=14 width=30271) (actual 
time=4.176..190.813 rows=15 loops=1)
   Join Filter: ((a.the_geom && b.the_geom) AND _st_within(a.the_geom, 
b.the_geom) AND (b.the_geom && a.the_geom))
   ->  Seq Scan on neighbourhood_poly a  (cost=0.00..1.26 rows=26 
width=30271) (actual time=0.048..0.658 rows=26 loops=1)
   ->  Materialize  (cost=1.03..1.06 rows=3 width=15506) (actual 
time=0.012..0.110 rows=3 loops=26)
         ->  Seq Scan on cityarea_poly b  (cost=0.00..1.03 rows=3 
width=15506) (actual time=0.125..0.140 rows=3 loops=1)
 Total runtime: 191.687 ms
(6 rows)

This looks like it's due to the fact that the && operator is not truely 
symmetric and the query planner does not disregard the extra index lookup.

Cheers,
Kevin

Obe, Regina wrote:
> You are missing an ON. You can fix by moving your where into the ON
>
> SELECT sec_catch.secondary 
> FROM sec_catch INNER JOIN prim_catch ON st_within(sec_catch.the_geom,
> prim_catch.the_geom)
>
> I tend to spell out the type of JOIN too because I can never remember
> what is the default join behavior in PostgreSQL.
>
> 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
> Craigie Dirk
> Sent: Friday, December 07, 2007 1:42 AM
> To: postgis-users at postgis.refractions.net
> Cc: dylan
> Subject: RE: [postgis-users] intersection/within queries - newbie
> basicspatial queries
>
> Thanks,
>
> 1st case worked perfectly - thanks.
>
> 2nd case (more what I am after) gave a syntax error at or near "where" 
> Any ideas on the error ?
> ---------------------------
> select sec_catch.secondary 
> from sec_catch join prim_catch
> where st_within(sec_catch.the_geom, prim_catch.the_geom)
> ---------------------------
>
> Regards,
>
> Dirk Craigie
>
> -----Original Message-----
> From: dylan [mailto:debeaudette at ucdavis.edu] 
> Sent: 07 December 2007 08:27 AM
> To: postgis-users at postgis.refractions.net
> Cc: Craigie Dirk
> Subject: Re: [postgis-users] intersection/within queries - newbie basic
> spatial queries
>
> On Thursday 06 December 2007 10:02:57 pm Craigie Dirk wrote:
>   
>> I am a new user and trying to perform some basic spatial queries using
>> within/intersect/union etc.
>>
>>
>>
>> I have 2 x polygon files :
>>
>>
>>
>> Prim_catch (19 x records)
>>
>> Sec_catch (attribute secondary = text field name of catchment)
>>
>>
>>
>> All the polys in sec_catch fall within a single record (polygon) of
>> prim_catch
>>
>> The query I am using (see below) needs some kind of loop or temporary
>> table as it returns a true/false and not a list of the records = true.
>>
>> ------------
>>
>> SELECT secondary FROM sec_catch
>>
>> WHERE WITHIN((select the_geom from sec_catch),(select the_geom from
>> prim_catch))
>>
>> -----------
>>
>>
>>     
>
> Using a join can save typing:
>
> select st_intersection(a.geom, b.geom) from a join b on
> st_intersects(a.geom, 
> b.geom) ;
>
> if you want the cartesian product (all possible permutations leave off
> the ON 
> clause).
>
> or if you just want matching records:
>
> select a.id from a join b where st_within(a.geom, b,geom);
>
> does that help ?
>
> Dylan
>
>
>
>
>
>
>
>
>
> DISCLAIMER:
> This message and any attachments are confidential and intended solely
> for the addressee. If you have received this message in error, please
> notify the system manager/sender.  Any unauthorized use, alteration or
> dissemination is prohibited.  The Department of Water Affairs and
> Forestry further accepts no liability whatsoever for any loss, whether
> it be direct, indirect or consequential, arising from this e-mail, nor
> for any consequence of its use or storage.
> _______________________________________________
> 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