[postgis-users] st_difference() problem?

Chris Hermansen chris.hermansen at tecogroup.ca
Mon May 30 17:06:20 PDT 2011


Ladies and gentlemen;

Nice to be back.

I am wrestling with st_difference() and it is getting the better of me.  I
am hoping someone who has seen this before can help.

I have two tables that are buffer polygons, built by PostGIS, around some
linear features (trails and traplines).

I am seeking to combine these two tables to produce a single set of polygons
that shows areas that are inside the trail buffers, inside the trapline
buffers, both, or neither.

The pattern I am following is

st_difference(btrail, btrapline)
union
st_intersection(btrail, btrapline)
union
st_difference(btrapline, btrail)

The btrail table has 9 rows, all valid POLYGONs; the btrapline table has 18
rows, all valid POLYGONs.  Nothing self-overlaps.  All have SRID of 3005.

There is a place in the southwest of the area where one trapline buffer and
one trail buffer cross over each other twice.  No other features come close.

If I copy just those two polygons into two separate test tables and use my
difference/intersection/difference operation, I get the result I expect - 10
polygons, none overlapping, where some are trapline-only, some are
trail-only, and some are both trail and trapline.  A visual inspection of
the result in QGIS "makes sense".

If I perform the same analysis on the full data set, I get a result that
seems wrong - looking at the portion of the data related to those two
features, instead of 10 polygons, I see 35 polygons.  Many of these "result"
polygons overlap each other.  Visually (in QGIS again), I see what appears
to be the two original input polygons covering a bunch of other polygons.

I can of course post the data; I also have a few screen shots from QGIS
saved as jpg files.

This is from PostgreSQL 8.4.8 running on Ubuntu 10.10.  The output from
postgis_full_version() is

POSTGIS="1.5.1" GEOS="3.2.0-CAPI-1.6.0" PROJ="Rel. 4.7.1, 23 September 2009"
LIBXML="2.7.6" USE_STATS

This is the code that produces the multiple overlapping result polygons with
the full data set and seemingly normal results with the two test buffers.

-- create the diff/int/diff on the full table

drop table utrailtrapline;

create table utrailtrapline (
    gid serial,
    istrail boolean,
    istrapline boolean);

SELECT AddGeometryColumn('','utrailtrapline','the_geom','3005','POLYGON',2);

insert into utrailtrapline (istrail, istrapline, the_geom)
select
    istrail,
    FALSE as istrapline,
    (st_dump(st_difference(btrail.the_geom, btrapline.the_geom))).geom as
the_geom
from btrail, btrapline;

insert into utrailtrapline (istrail, istrapline, the_geom)
select
    istrail,
    istrapline,
    (st_dump(st_intersection(btrail.the_geom, btrapline.the_geom))).geom as
the_geom
from btrail, btrapline
where st_intersects(btrail.the_geom, btrapline.the_geom);

insert into utrailtrapline (istrail, istrapline, the_geom)
select
    FALSE as istrail,
    istrapline,
    (st_dump(st_difference(btrapline.the_geom, btrail.the_geom))).geom as
the_geom
from btrail, btrapline;

Thanks in advance!

-- 
Chris Hermansen
TECO Natural Resource Group Limited
301 · 958 West 8th Avenue
Vancouver BC CANADA · V5Z 1E5
Tel +1.604.714.2878 · Cel +1.778.840.4625
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20110530/7f6031f9/attachment.html>


More information about the postgis-users mailing list