Can someone provide me with a simple vector file where the buffering bug
happens? or make it happen with a Speafish map?
Maciek:
http://www.biol.uni.wroc.pl/sieczka/udostepnione/grass/corrupted_buffer_of_a_line.png
thanks,
Hamish
Can someone provide me with a simple vector file where the buffering bug
happens? or make it happen with a Speafish map?
Maciek:
http://www.biol.uni.wroc.pl/sieczka/udostepnione/grass/corrupted_buffer_of_a_line.png
thanks,
Hamish
Hamish wrote:
Can someone provide me with a simple vector file where the buffering bug
happens? or make it happen with a Speafish map?
Hamish,
In a message I just sent to you offlist you'll find an attached Grass
location with 2 input vectors:
square_rot
ditches
and 3 output vectors:
square_rot_buf30
ditches_buf1
ditches_buf4
which expose the v.buffer's bug, using the following commands,
respectively:
v.buffer input=square_rot output=square_rot_buf30 type=line buffer=30
v.buffer input=ditches output=ditches_buf1 type=area buffer=1
v.buffer input=ditches output=ditches_buf4 type=area buffer=4
(Zoom to 'ditches_buf' wind file to notice the bug in the latter example.)
Good luck,
Maciek
me:
> Can someone provide me with a simple vector file where the buffering
> bug happens? or make it happen with a Speafish map?
Maciek:
In a message I just sent to you offlist you'll find an attached Grass
location with 2 input vectors:square_rot
Notice this is not a square of four corners! If you zoom in you find it
contains 229 vertices, i.e. this is r.to.vect output with steps at the
grid resolution. So not as easy to debug by hand,
ditches
I couldn't recreate your buff=1 and 4 errors- buffering works fine for
me there. I was however able to extract the attached problematic feature
(area 1188), which is a fairly simple example. I reimported the ascii
file as a new vector and got the same results, so hopefully others can
reproduce with this too (?). I tested with buff=4 and buff=10.
Using debug=buffer,clean didn't help, problem happens before that.
Hamish
bad_buff.vasc (1.58 KB)
Hamish wrote:
me:
> > Can someone provide me with a simple vector file where the
> > buffering bug happens? or make it happen with a Speafish map?
..
I couldn't recreate your buff=1 and 4 errors- buffering works fine for
me there. I was however able to extract the attached problematic
feature (area 1188), which is a fairly simple example. I reimported
the ascii file as a new vector and got the same results, so hopefully
others can reproduce with this too (?). I tested with buff=4 and
buff=10.Using debug=buffer,clean didn't help, problem happens before that.
Converting to line and cleaning out excess vertices doesn't help either.
Here is a simplified version of a problematic area:
("v.in.ascii -n format=standard")
B 26
600039.02641686 5678405.3999173
600077.97320276 5678399.62882899
600086.74267773 5678396.53372018
600165.15210099 5678369.45151806
600169.2571522 5678367.86458082
600321.12416744 5678313.92598028
600329.91897615 5678321.23595115
600333.66876785 5678318.50222813
600324.59956919 5678312.02422909
600321.23100969 5678310.98774925
600167.57287245 5678364.49602132
600085.45304905 5678392.66483416
600077.19942555 5678396.27579444
600036.44715953 5678401.36982765
600030.38590477 5678402.27256772
600010.78354895 5678405.62560227
599996.21074494 5678408.39830396
599987.18334424 5678410.71963557
599979.96142368 5678412.00926424
599968.01258083 5678413.77867984
599954.94262744 5678414.84644733
599949.52618701 5678419.48911054
599968.61269136 5678418.4574076
599998.40311369 5678411.75133851
600001.62800241 5678411.19452149
600039.02641686 5678405.3999173
C 1 1
600232.43677669 5678342.9534263
1 1188
adding a few debug statements to lib/vector/Vlib/buffer.c shows:
--> npoints = 26
--> side=0, added 41 points
--> dangle=0.283079, PI=3.141593
added 11 arc points
--> side=1, added 3 points
--> dangle=0.283079, PI=3.141593
in Vect_line_parallel():
For side=1, there are 73 points created by parallel_line(), which if
plotted describe the *correct* buffered boundaries that we want.
==> After clean_parallel() there are only 3 points left. <==
So the problem is in clean_parallel().
If I comment out the clean_parallel() call, a correct looking output map
is created, but this may lead to other problems later on...?
for the last loop in side 1, sa=0. after the following sa+1 and two
npn++ calls, the number of valid points from that pass ends up as 3.
if ( point_in_buf( origPoints, px, py, d ) ){ /* is loop in buffer ? */
npn=sa+1;
here is evolution of segments sa and sb. all debug messages are in
clean_parallel(). error happens when (sb - sa) != 2, ie when the segment
wraps back to the beginning of the polygon?
nareas=1
Areas buffers ... 100%
--> side 0
D0/0: clean_parallel(): npoints = 54, d = 10.000000, rm_end = 0
D0/0: current = 1, last = 2, lcount = 1
D0/0: //> no_overlap: sa=0 sb=2 first=0 np=54
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=1 sa=0 sb=2, lcount=1
D0/0: //> just before "move points down": npn=2
D0/0: current = 4, last = 5, lcount = 1
D0/0: //> no_overlap: sa=3 sb=5 first=3 np=54
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=53 sa=3 sb=5, lcount=1
D0/0: //> just before "move points down": npn=5
D0/0: current = 13, last = 14, lcount = 1
D0/0: //> no_overlap: sa=12 sb=14 first=12 np=54
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=52 sa=12 sb=14, lcount=1
D0/0: //> just before "move points down": npn=14
D0/0: current = 15, last = 16, lcount = 1
D0/0: //> no_overlap: sa=14 sb=16 first=14 np=54
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=51 sa=14 sb=16, lcount=1
D0/0: //> just before "move points down": npn=16
D0/0: current = 15, last = 17, lcount = 1
D0/0: //> no_overlap: sa=14 sb=17 first=14 np=54
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 4
D0/0: //> loop [centroid] is in buffer npn=50 sa=14 sb=17, lcount=1
D0/0: //> just before "move points down": npn=16
D0/0: current = 18, last = 19, lcount = 1
D0/0: //> no_overlap: sa=17 sb=19 first=17 np=54
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=48 sa=17 sb=19, lcount=1
D0/0: //> just before "move points down": npn=19
D0/0: current = 22, last = 23, lcount = 1
D0/0: //> no_overlap: sa=21 sb=23 first=21 np=54
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=47 sa=21 sb=23, lcount=1
D0/0: //> just before "move points down": npn=23
D0/0: current = 23, last = 24, lcount = 1
D0/0: //> no_overlap: sa=22 sb=24 first=22 np=54
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=46 sa=22 sb=24, lcount=1
D0/0: //> just before "move points down": npn=24
D0/0: current = 24, last = 25, lcount = 1
D0/0: //> no_overlap: sa=23 sb=25 first=23 np=54
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=45 sa=23 sb=25, lcount=1
D0/0: //> just before "move points down": npn=25
D0/0: current = 25, last = 26, lcount = 1
D0/0: //> no_overlap: sa=24 sb=26 first=24 np=54
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=44 sa=24 sb=26, lcount=1
D0/0: //> just before "move points down": npn=26
D0/0: current = 32, last = 33, lcount = 1
D0/0: //> no_overlap: sa=31 sb=33 first=31 np=54
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=43 sa=31 sb=33, lcount=1
D0/0: //> just before "move points down": npn=33
D0/0: current = 35, last = 36, lcount = 1
D0/0: //> no_overlap: sa=34 sb=36 first=34 np=54
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=42 sa=34 sb=36, lcount=1
D0/0: //> just before "move points down": npn=36
D0/0: //> after: npn=41
--> side 1
D0/0: clean_parallel(): npoints = 73, d = -10.000000, rm_end = 0
D0/0: current = 1, last = 71, lcount = 1
D0/0: current = 3, last = 4, lcount = 2
D0/0: //> no_overlap: sa=2 sb=4 first=0 np=73
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=1 sa=2 sb=4, lcount=2
D0/0: //> just before "move points down": npn=4
D0/0: current = 1, last = 70, lcount = 1
D0/0: current = 6, last = 7, lcount = 2
D0/0: //> no_overlap: sa=5 sb=7 first=0 np=73
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=72 sa=5 sb=7, lcount=2
D0/0: //> just before "move points down": npn=7
D0/0: current = 1, last = 69, lcount = 1
D0/0: current = 7, last = 8, lcount = 2
D0/0: //> no_overlap: sa=6 sb=8 first=0 np=73
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=71 sa=6 sb=8, lcount=2
D0/0: //> just before "move points down": npn=8
D0/0: current = 1, last = 68, lcount = 1
D0/0: current = 29, last = 30, lcount = 2
D0/0: //> no_overlap: sa=28 sb=30 first=0 np=73
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=70 sa=28 sb=30, lcount=2
D0/0: //> just before "move points down": npn=30
D0/0: current = 1, last = 67, lcount = 1
D0/0: current = 32, last = 33, lcount = 2
D0/0: //> no_overlap: sa=31 sb=33 first=0 np=73
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=69 sa=31 sb=33, lcount=2
D0/0: //> just before "move points down": npn=33
D0/0: current = 1, last = 66, lcount = 1
D0/0: current = 41, last = 42, lcount = 2
D0/0: //> no_overlap: sa=40 sb=42 first=0 np=73
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=68 sa=40 sb=42, lcount=2
D0/0: //> just before "move points down": npn=42
D0/0: current = 1, last = 65, lcount = 1
D0/0: current = 42, last = 43, lcount = 2
D0/0: //> no_overlap: sa=41 sb=43 first=0 np=73
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=67 sa=41 sb=43, lcount=2
D0/0: //> just before "move points down": npn=43
D0/0: current = 1, last = 64, lcount = 1
D0/0: current = 43, last = 44, lcount = 2
D0/0: //> no_overlap: sa=42 sb=44 first=0 np=73
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=66 sa=42 sb=44, lcount=2
D0/0: //> just before "move points down": npn=44
D0/0: current = 1, last = 63, lcount = 1
D0/0: current = 60, last = 61, lcount = 2
D0/0: //> no_overlap: sa=59 sb=61 first=0 np=73
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=65 sa=59 sb=61, lcount=2
D0/0: //> just before "move points down": npn=61
D0/0: current = 1, last = 62, lcount = 1
D0/0: current = 61, last = 62, lcount = 2
D0/0: //> no_overlap: sa=60 sb=62 first=0 np=73
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 3
D0/0: //> loop [centroid] is in buffer npn=64 sa=60 sb=62, lcount=2
D0/0: //> just before "move points down": npn=62
D0/0: current = 1, last = 61, lcount = 1
D0/0: //> no_overlap: sa=0 sb=61 first=0 np=73
D0/0: //> add sPoint->n = 1
D0/0: //> after loop sPoint->n = 62
D0/0: //> loop [centroid] is in buffer npn=63 sa=0 sb=61, lcount=1
D0/0: //> just before "move points down": npn=2
D0/0: //> after: npn=3
nisles=0
Hamish