Hi Brian,

you could try this query:

SELECT st_difference(l.wkb_geometry,
         case when st_union(p.wkb_geometry) is null
           then st_collect(p.wkb_geometry)
           else st_union(p.wkb_geometry)
         end)
       as tgeom
from
  big_landtypes l
  inner join
  small_parcels p
  on st_intersects(l.wkb_geometry, p.wkb_geometry)
where l.pkey = 1
group by l.pkey, l.wkb_geometry;

You are getting more than one result per landtype geometry because they intersect with more then one parcel geometry. For each intersect case there is a result row. You are unioning all parcel geometries which are anywhere intersecting any landtype geometry, which is probably resulting in a big geometry. I would assume, the proposed query would do better, but you would have to try :-) I also added a CASE WHEN with st_collect as an alternative for st_union, because, sometimes st_union fails and results in a NULL geometry. In this case st_collect could take over and as for the st_difference, st_union or st_collect have the same impact.

Hope that helps,

Birgit.



Am 14.02.2012 20:42, schrieb Brian Hamlin:
SELECT distinct on (tgeom)
     st_difference(
       l.wkb_geometry,

       (select st_union(p.wkb_geometry )
       from
         big_landtypes l,
         small_parcels p
       where st_intersects(
         l.wkb_geometry, p.wkb_geometry) AND
         l.pkey = 1)
       ) tgeom
     FROM
       big_landtypes l,
       small_parcels p
     WHERE
       l.pkey = 1
     ORDER BY
tgeom;
_______________________________________________
postgis-users mailing list
postgis-users@postgis.refractions.net
http://postgis.refractions.net/mailman/listinfo/postgis-users

Reply via email to