[postgis-users] How to simplify and complex (i.e. slow) geometry
Martin Davis
mbdavis at refractions.net
Tue Aug 21 09:41:57 PDT 2007
Mike,
If I understand your query, it looks like you are running buffer(0) on
*each* polygon in your query mask. This is my bad - what I should have
said was that you need to ST_Collect all your query polys into a single
MultiPolygon, and then run buffer(0) on that to get your final query
geometry. (The MultiPoly you create will be invalid, but buffer()
doesn't care).
Actually, I'm told that ST_Union can act as an aggregator itself (when
given a single argument). However, I suspect that it is not using an
efficient method of unioning the polygons.
Once you have your query polygon, another thing you might try is
simplifying it using a small tolerance. This depends on your need for
accuracy, but it can reduce the number of points (and hence speed things
up) significantly.
Mike Dvorak wrote:
> Thanks for the response Martin. Unfortunately, that produces about the
> same results, but maybe I'm misinterpreting your advice. Here's what I
> tried most recently:
>
> CREATE TABLE buffered_mask_5( key SERIAL PRIMARY KEY );
>
> SELECT AddGeometryColumn('buffered_mask_5', 'the_geom', 3310, 'POLYGON',
> 2);
>
> INSERT INTO buffered_mask_5 (the_geom) SELECT
> ST_Buffer(Transform(ST_Buffer(the_geom, 0.0), 3310), 2500) AS the_geom
> FROM usgs_bathy_mm5_20_50_200m
>
> Any more advice?
>
> Cheers,
> Mike
>
>
> Martin Davis wrote:
>
>> Try using ST_Buffer(mask, 0.0). That should union all the geometries
>> into a single (Multi)polygon.
>>
>> You could also help us to find some funding to support porting the new
>> JTS optimized predicates to GEOS ;^)
>>
>> Martin
>>
>>
>>
>> Mike Dvorak wrote:
>>
>>> Dear PostGIS users,
>>>
>>> First off, I must say that I think the PostGIS project is absolutely
>>> great. I've been using PostGIS daily for my research for about 6 months
>>> now and have come to love it. I deal with rather larger geospatial
>>> databases (as large as 200 GB), so I think I have been really pushing
>>> PostGIS (and Postgres) to its limits but having mostly success in
>>> doing so.
>>>
>>> Here's my current problem. I have a complex 2D polygon geometry that
>>> I'm using as a mask, to limit what areas of wind fields from a weather
>>> model I insert into my database. You can find an example mask of the
>>> "shallow" ocean waters near the San Francisco Bay here:
>>> http://www.stanford.edu/~dvorak/tmp/how-to-simplify-geom-example.png
>>>
>>> The problem is that this 2D polygon, contains a lot of redundancy for a
>>> mask and it takes forever (i.e. tens of hours) to create the
>>> intersection of the 2D mask polygon and the grid of model points that I
>>> want to mask (approximately 200 x 240 points).
>>>
>>> I tried using ST_ConvexHull and ST_Union (with the mask for both
>>> arguments) without luck to simplify this example mask in the URL. Is
>>> there a PostGIS function that will get rid of all redundant mask objects
>>> i.e. objects that are completely contained within another object, or do
>>> I have to program this myself?
>>>
>>> Thanks for any advice!
>>>
>>> Cheers,
>>> Mike
>>>
>>>
>>>
>>>
>
>
--
Martin Davis
Senior Technical Architect
Refractions Research, Inc.
(250) 383-3022
More information about the postgis-users
mailing list