[postgis-users] How best to do this?
Paul Ramsey
pramsey at refractions.net
Fri Feb 2 09:25:43 PST 2007
snaptogrid might help, it is a crude hammer similar in many ways to the
more subtle approaches in GEOS3.
Because the C API didn't change between versions, you may be able to
simply copy a suitably compiled geos DLL into place, perhaps by
stripping one out of the windows downloads. I don't actually know if our
windows downloads are using GEOS3 though... hrm. Mark CA?
P
Stephen Woodbridge wrote:
> Paul, et al,
>
> Any chance that someone would have GEOS 3 built for WinXP that I could
> drop into a system currently running:
>
> "POSTGIS="1.1.3" GEOS="2.2.2-CAPI-1.1.0" PROJ="Rel. 4.4.9, 29 Oct 2004"
> USE_STATS"
>
> "PostgreSQL 8.1.4 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC)
> 3.4.2 (mingw-special)"
>
> So I could give this a try.
>
> In the past, I seem to remember people dealing with these problems using
> snaptogrid() - would this potentially help here and how would I change
> my query to use that?
>
> -Steve
>
> Paul Ramsey wrote:
>> GEOS 3 does include a number of fixes that will help difference and
>> union.
>>
>> P
>>
>> On 1-Feb-07, at 9:01 PM, Stephen Woodbridge wrote:
>>
>>> OK, one step forward and two steps backward ...
>>>
>>> I was about to get rid of my gemetrycollections with:
>>>
>>> update newtable set the_geom =
>>> (select geomunion(geom1) from
>>> (select (dump(the_geom)).geom as geom1) as foo
>>> where geometrytype(geom1)='POLYGON'
>>> )
>>> where geometrytype(the_geom)='GEOMETRYCOLLECTION';
>>>
>>> This worked very nicely once I figured out that this was the way to
>>> solve the problem. So now each geometry collection is converted into
>>> a polygon or multipolygon and all the linestring and point artifacts
>>> of the intersection are removed.
>>>
>>> select distinct geometrytype(the_geom) from soils2;
>>> POLYGON
>>> MULTIPOLYGON
>>>
>>> select * from soils where not isvalid(the_geom);
>>> reports 0 rows
>>>
>>> insert into newtable (..., the_geom)
>>> select A....,
>>> difference(A.the_geom, B.the_geom) as the_geom
>>> from A, B
>>> where A.the_geom && B.the_geom and overlaps(A.the_geom, B.the_geom);
>>>
>>> NOTICE: TopologyException: no outgoing dirEdge found
>>> (287030,892621,892621)
>>>
>>> ERROR: GEOS difference() threw an error!
>>>
>>> Now what do I do??? If I have to upgrade it might be easiest to
>>> upgrade my WinXP laptop if there is an easy way to do that, then dump
>>> and load the data to that.
>>>
>>> select postgis_full_version();
>>> "POSTGIS="1.1.5" GEOS="2.2.3-CAPI-1.1.1" PROJ="Rel. 4.4.9, 29 Oct
>>> 2004" USE_STATS (procs from 1.1.1 need upgrade)"
>>>
>>> select version();
>>> "PostgreSQL 8.0.8 on i386-portbld-freebsd5.3, compiled by GCC cc
>>> (GCC) 3.4.2 [FreeBSD] 20040728"
>>>
>>> -Steve
>>>
>>> Stephen Woodbridge wrote:
>>>> Hi all,
>>>> Sorry the subject line is not more useful, but let me explain.
>>>> 1) I have a set of polgons A and another set of polygon B
>>>> 2) I need to a new set of polygons C that are the union of
>>>> A intersect B and A difference B
>>>> So basically B partially covers A and I want to split polygons in a
>>>> into the covered piece(s) and that that is not covered.
>>>> On the surface this is very straight forward, but it isn't ...
>>>> insert into newtable (....)
>>>> select ..., intersection(A.the_geom, B.the_geom) as the_geom
>>>> from A, B
>>>> where A.the_geom && B.the_geom and
>>>> intersects(A.the_geom, B.the_geom);
>>>> This works, but I get a bunch of GEOMETRYCOLLECTION objects in the
>>>> results and out of 1022 collection I have 2780 additional POLYGONs.
>>>> So I could do something like:
>>>> insert into newtable (....)
>>>> select * from
>>>> (select ..., (dump(the_geom)).geom as the_geom from newtable
>>>> where geometrytype(the_geom)='GEOMETRYCOLLECTION' ) as foo
>>>> where geometrytype(the_geom)='POLYGON';
>>>> delete from newtable where geometrytype(the_geom)='GEOMETRYCOLLECTION';
>>>> So now comes the tricky part how do you do the difference? I was
>>>> thinking I could take A difference newtable but because I have
>>>> multiple little pieces instead of a single piece, I think I am getting:
>>>> (A - Part1), (A - Part2), (A - Part3) instead of
>>>> (A - Part1 - Part2 - Part3)
>>>> So I think I need to union the polygon pieces from each row that is
>>>> dumped above. Is that as simple as tossing part of the dump into a
>>>> geomunion()? How would that look?
>>>> -Steve W
>>>> _______________________________________________
>>>> 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
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
--
Paul Ramsey
Refractions Research
http://www.refractions.net
pramsey at refractions.net
Phone: 250-383-3022
Cell: 250-885-0632
More information about the postgis-users
mailing list