[postgis-users] Spatial intersect optimization

Bill Binko bill at binko.net
Mon Feb 6 14:44:46 PST 2006


Ack   Small error below
Here's the correct select:

 select a.name, sum(p.area) as parcel_area
 from polygons a, parcels p
 where a.the_geom && Centroid(p.the_geom)
 and contains(a.the_geom, Centroid(p.the_geom))
 group by a.name
 order by parcel_area;

Bill Binko wrote:

> You absolutely need GiST indexes for this to run effectively.
>
> Two additional things you could do for both sanity and performance:
>
> 1) Run the query on Centroids  instead of actual areas.  You can do 
> this two ways, but in addition to being faster, it is actually more 
> accurate since your parcels will only fall within one of your polygons.
>    a) Create a separate table or column that holds the results of the 
> Centroid() function
>    b) Easier: Create a functional index like so:
> CREATE INDEX cent_idx on parcels USING GIST (Centroid(the_geom) 
> GIST_GEOMETRY_OPS);
>   Then you would write the query below as:
>
>  select a.name, sum(p.area) as parcel_area
>  from polygons a, parcels p
>  where a.the_geom && Centroid(p.the_geom)
>  and contains(a.the_geom, p.the_geom)
>  group by a.name
>  order by parcel_area;
>
>
> 2) If this is your main use for the tables, you can try ordering your 
> data by Clustering: read the archives of this list for a long 
> discussion on whether or not it actually helps (but it does :)
> CLUSTER cent_idx on parcels;
>
> Hope this helps
>
> Stephen Woodbridge wrote:
>
>> Josh,
>>
>> select a.name, sum(p.area) a parcel_area
>>   from polygons a, parcels p
>>   where a.the_geom && p.the_geom
>>   and intersects(a.the_geom, p.the_geom)
>>   group by a.name
>>   order by parcel_area;
>>
>> There is not much more you can do to make this faster. If parcels can 
>> overlap polygons and you want only the part of the parcel that is in 
>> the polygon then you will want the intersection of the two and then 
>> you will need to compute the area for the intersection, etc.
>>
>> -Steve W.
>>
>> Josh Livni wrote:
>>
>>> I am fairly inexperienced with optimizing spatial queries in 
>>> PostGIS, and am trying to do something similar to the example 
>>> 4.6.2.4 in the documentation at 
>>> http://postgis.refractions.net/docs/ch04.html
>>>
>>> It notes that this will be slow due to summarizing.  I have over 
>>> 500k parcels, and I'd like to do some summary stats in each of about 
>>> 15k polygons.
>>>
>>> My question is, could the example mentioned above become faster if 
>>> it took better advantage of the gist indices?  or is it already?  
>>> How would I go about adding some kind of 'AND the_geom && (bbox of 
>>> m.geom)' to the  WHERE clause?
>>>
>>> Thanks for any hints,
>>>
>>>   -Josh
>>>
>>>
>>> _______________________________________________
>>> postgis-users mailing list
>>> postgis-users at postgis.refractions.net
>>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>>
>>
>> _______________________________________________
>> postgis-users mailing list
>> postgis-users at postgis.refractions.net
>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>
>
> _______________________________________________
> 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