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

Markus Metz markus_metz at gmx.de
Mon May 21 16:55:40 EDT 2007



Maciej Sieczka wrote:
> Markus Metz wrote:
>
>   
>> 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.
>>     
>
> I used to experience doubled vertices in v.build.polylines and v.clean
> tool=snap output (these bugs are fixed now in both 6.2.2 CVS and 6.3
> CVS) but never in r.to.vect output.
>
> Trying to reproduce your problem I run, in spearfish6 location:
>
> $ g.region rast=soils -a
> $ r.to.vect input=soils output=soils_v feature=area
>
>   
use
$ r.to.vect -s input=soils output=soils_vs feature=area
soils_vs has 30337 duplicate vertices
without smoothing corners I also don't get duplicate vertices

> $ g.region rast=streams -a
> $ r.thin input=streams output=streams_th
> $ r.to.vect input=streams_th output=streams_th_v feature=line
>
>   
this vector doesn't have any duplicate vertices, neither has 
streams_th_vs created with
$ r.to.vect -s input=streams_th output=streams_th_vs feature=line
> but neither yielded doubled vertices. Using GRASS 6.2.2 and 6.3 current
> CVS. Could you provide an exact procedure to reproduce your problem?
>
> Maciek
>
>   
My main issue was that I wanted to offer a new mehtod for line/boundary 
simplification based on the Douglas-Peucker algorithm. These duplicate 
vertices are not much of a problem, the only increase the size of a 
vector which can become a problem when working on large regions with a 
high resolution. The real problem is that the old pruning method 
produces funny results and doesn't work in latlon.

Run
$ v.in.region output=region type=area

create new location for spearfish in latlon
import the vector region from spearfish60
set region to match this vector
import soils_vs from spearfish60

prune vector with
$ v.clean input=soils_vs at user1 output=soils_vs_double type=boundary 
tool=prune thresh=0

this removes duplicate vertices (old and new prune.c)

now prune
$ v.clean input=soils_vs_double at user1 output=soils_vs_old type=boundary 
tool=prune thresh=0.001

results is nothing pruned. Try higher thresholds, I tried thresh=10, 
still nothing is pruned. Now try the new Douglas-Peucker algorithm with 
thresh=0.001 (this is decimal degrees according to the projection) and 
have a look at the result. I hope you like it.

Sorry for the long answer!

Markus





More information about the grass-dev mailing list