[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