The big problem with this in PostGIS land is that Union (or let's call it Overlay, to distinguish it from the existing Union) is a *global* function. I.e. it operates over *all* polygons in a table (or set of tables). This is in contrast to most existing PostGIS functions, which operate over a single or a pair of Geometries

Your example is a bit simplistic - typically people want to overlay 1000's of polygons at a time. There's two ramification of this. (a) This can't be done in a piecewise, polygon-by-polygon fashion (or at least, not efficiently, correctly, or robustly). (b) This can't be done in-memory. It requires some external structures (in PostGIS, presumably tables, although possibly some other file-based structure would work as well or better).

ArcINFO must have some long-standing rocket science to compute overlays. This is majorly helped by the fact that its native data structure is an arc-node topology, which is a necessary precursor to computing an overlay efficiently - and which is itself expensive and difficult to compute in a non-memory bound fashion.

The basic approach to computing polygon overlays has been well-understood for a long time (although this does not imply well-documented!). The implementation however is quite tricky, especially if performance and robustness is required. There is a notable lack of open-source existing implementations - which should be an indication of just how difficult this really is.

Not that it wouldn't be fun to try... but this is a multi-month effort for some clever developers familiar with the area.



Chris Hermansen wrote:
Following on from Paul's note about a function that would make the output of st_intersection() more immediately useful, I have a favourite whine to mention.

Some geoprocessing activities that are easy to do in ArcInfo are more-or-less as easy to do in PostGIS. One, though, seems to me to be very difficult or slow or both, and that is the ArcInfo UNION function.

A simple example: Let's say I have polygon theme "a" as (0 0, 2 0, 2 1, 0 1, 0 0) and "b" as (1 0, 3 0, 3 1, 1 1, 1 0). Then

UNION a b c

will produce polygon theme "c" with three polygons: (0 0, 1 0, 1 1, 0 1, 0 0), (1 0, 2 0, 2 1, 1 1, 1 0), and (2 0, 3 0, 3 1, 2 1, 2 0).

In other words, the three polygons in "c" bound: the points unique to the polygon in "a"; the points common to the polygons in "a" and "b"; and the points unique to the polygon in "b".

This seems exceedingly difficult in PostGIS; for example, see the article at http://www.postgis.org/support/wiki/index.php?ExamplesOverlayTables

I can vouch from personal experience, at least following the approach recommended at the above link by Kevin, that this is not a particularly speed operation either.

And yet, so easy to do in ArcInfo. And, a pretty useful and basic kind of geoprocessing function. In my mind, it is a kind of spatial outer join, where output polygons have either the attributes from "a", the attributes from "b", or both.

Another way to think of this is to use the polygons from "b" to make holes in "a", putting the results in "c1". Then use the polygons from "a" to make holes in "b", putting the results in "c2". Finally, intersect "a" and "b" and put that in "c3". Then append c1, c2, and c3 together.

Please tell me I'm not the only one "out there" who's stuck on this problem; or, if I am, please tell me that function "st_something_i_havent_tried_yet()" that gives me the result I'm looking for - perhaps wrapped in "st_just_gimme_the_polygons()".


--
Martin Davis
Senior Technical Architect
Refractions Research, Inc.
(250) 383-3022

_______________________________________________
postgis-users mailing list
[email protected]
http://postgis.refractions.net/mailman/listinfo/postgis-users

Reply via email to