[GRASS-user] Re: v.what.rast (large file)

Massimo Di Stefano massimodisasha at yahoo.it
Wed Apr 11 09:07:02 EDT 2007


Hi Glynn

thanks for your suggestion,

i do not know the c code...
i must study it...

to walk around the problem
i used a bash script,
its sintax is like :
v.out.ascii | r.what > file_raster
then using awk
i extract the column of raster value from file_raster
and past it in the original vector file (ascii vector points )
then re-import the vector file using v.in.ascii -r (region of my raster)


Il giorno 11/apr/07, alle ore 14:22, Glynn Clements  
<glynn at gclements.plus.com> ha scritto:

>
> Message: 2
> Date: Mon, 9 Apr 2007 09:48:15 +0100
> From: Glynn Clements <glynn at gclements.plus.com>
> Subject: Re: [GRASS-user] v.what.rast (large file)
> To: Massimo Di Stefano <massimodisasha at yahoo.it>
> Cc: grassuser at grass.itc.it, grass-dev at grass.itc.it
> Message-ID: <17945.64975.520050.289809 at cerise.gclements.plus.com>
> Content-Type: text/plain; charset=us-ascii
>
>
> Massimo Di Stefano wrote:
>
>> i've a large  point vector file (ascii 160 mb)
>
>> can i divide my area in many subregion
>> and then patch the results ?
>
> The categories are modified in-place, so you can just run the command
> on each subregion; there's no need to "patch" anything.
>
> AFAICT, the problem is in the code which deletes duplicate categories:
>
>     i = 1;
>     while ( i < point_cnt ) {
>         if ( cache[i].cat == cache[i-1].cat ) {
> 	    cache[i-1].count++;
> 	    for ( j = i; j < point_cnt - 1; j++ ) {
> 		cache[j].row = cache[j+1].row;
> 		cache[j].col = cache[j+1].col;
> 		cache[j].cat = cache[j+1].cat;
> 		cache[j].count = cache[j+1].count;
> 	    }
> 	    point_cnt--;
> 	    continue;
> 	}
>         i++;
>     }
>
> This is O(n^2), but thiscould be done in O(n). The problem is that
> it's shifting the remainder of the array down by one place at each
> step, when it could move each entry to its final destination in one
> go. E.g. (untested):
>
>     i = j = 1;
>     while ( i < point_cnt ) {
>         while ( i < point_cnt && cache[i].cat == cache[j-1].cat ) {
>             cache[j-1].count++;
>             i++;
>         }
>         cache[j].row   = cache[i].row;
>         cache[j].col   = cache[i].col;
>         cache[j].cat   = cache[i].cat;
>         cache[j].count = cache[i].count;
>         i++;
>         j++;
>     }
>     point_cnt = j;




More information about the grass-user mailing list