[GRASS-dev] v.prune with Douglas-Peucker

Markus Metz markus_metz at gmx.de
Sat May 19 03:57:35 EDT 2007


Hello all,

I encountered a few problems while pruning vector boundaries and decided 
to try to update the algorithm. The biggest problem with the old 
algorithm was that it didn't work in latlon. From previous mails to to 
list I got the idea to use the Douglas-Peucker algorithm as implemented 
in gshhs_dp for pruning lines and boundaries. The algorithm in gshhs was 
tailored to latlon, but I wanted it to work in any projection and use 
map units. This is now realized, it works both in latlon and in 
projections with meters or anything else as map units. The attached 
prune.c goes to lib/vector/diglib/prune.c The threshold is the deviation 
of a given point from a straight line connecting the two adjacent points 
and should be not more than half the map resolution. Using insanely 
large thresholds can result in duplicate centroids. In my test map with 
146000 vertices, 3109 centroids and 4294 areas (areas without centroids 
are islands, this is wanted), I got 2 duplicate centroids when the 
threshold was 1000x map resolution, an insane threshold removing over 
80% of the vertices.  The algorithm itself does not change the first and 
last point, so there is no more need to pass a boundary without the 
first and last point to the algorithm. That means that 
vector/v.clean/prune.c can be modified accordingly.

As before, there is a first routine removing duplicate points. Is there 
a reason for duplicate points in lines or boundaries? If not, why are 
they there at all? I converted rasters to vectors extracting areas and 
typically had above 30% duplicate vertices. Working with large vectors 
with millions of vertices, they are clogging up the vector. So something 
for the wish list would be to have line and area vectors without 
duplicate vertices after map conversions.  For the time being, prune 
should be first run with a threshold of 0.0 as before to remove 
duplicate centroids. Then lines and boundaries can be pruned beginning 
with a small threshold and increasing it gently (e.g. next threshold = 
2x previous threshold), until the vector is satisfyingly reduced while 
preserving the desired amount of detail.

So far I tested the new Douglas-Peucker algorithm in different 
projections and it works fine. But I only tested it on my system (FC6 
x86_64, gcc-4.1.1) with grass-6.2.1 and grass-6.3 cvs snapshot from 
12.5.2007. If anybody is interested in testing the new algorithm and 
help make it the new standard for GRASS, please do!

CAUTION: I'm not a programmer, I'm a biologist by training doing GIS and 
remote sensing work, so I can't guarantee for the code. I tried my best.

Markus (not Neteler but Metz)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: prune.c
Type: text/x-csrc
Size: 8456 bytes
Desc: not available
Url : http://lists.osgeo.org/pipermail/grass-dev/attachments/20070519/6d30ea21/prune.bin


More information about the grass-dev mailing list