[GRASS-user] Fill holes with an area bigger of a specific value in a raster coverage

I want to fill some areas of a raster coverage with a value of my choice. Those areas now contain NODATA values. So, they look like holes in my coverage.

I know I could use r.clump function , but I don’t know how to specify the maximum area. Because if a hole is bigger than that area, I don’t want to consider it as hole. Is that even possible with GRASS?

Many thanks in advance,


Jorge Arevalo
Freelance developer

http://about.me/jorgeas80

On Tue, Apr 29, 2014 at 6:48 PM, Jorge Arevalo
<jorgearevalo@libregis.org> wrote:

I want to fill some areas of a raster coverage with a value of my choice.
Those areas now contain NODATA values. So, they look like holes in my
coverage.

If you want to set all NODATA area to the same value, then use r.null
with null=yourvalue:

http://grass.osgeo.org/grass70/manuals/r.null.html#examples

I know I could use r.clump function , but I don't know how to specify the
maximum area. Because if a hole is bigger than that area, I don't want to
consider it as hole. Is that even possible with GRASS?

You could assign all NODATA areas a specific, yet unused value (see above).
Then extract this value with r.mapcalc (if condition) and extract from
the resulting map only the smaller areas with

http://grass.osgeo.org/grass70/manuals/r.reclass.area.html

Then merge them back with r.patch into the original maps in order to
create the final map.

Maybe there are other possibilities, too.

Markus

Hello Markus,

···

On Tue, Apr 29, 2014 at 10:07 PM, Markus Neteler <neteler@osgeo.org> wrote:

On Tue, Apr 29, 2014 at 6:48 PM, Jorge Arevalo
<jorgearevalo@libregis.org> wrote:

I want to fill some areas of a raster coverage with a value of my choice.
Those areas now contain NODATA values. So, they look like holes in my
coverage.

If you want to set all NODATA area to the same value, then use r.null
with null=yourvalue:

http://grass.osgeo.org/grass70/manuals/r.null.html#examples

Yep, we already solved that. But thanks!

I know I could use r.clump function , but I don’t know how to specify the
maximum area. Because if a hole is bigger than that area, I don’t want to
consider it as hole. Is that even possible with GRASS?

You could assign all NODATA areas a specific, yet unused value (see above).
Then extract this value with r.mapcalc (if condition) and extract from
the resulting map only the smaller areas with

http://grass.osgeo.org/grass70/manuals/r.reclass.area.html

Then merge them back with r.patch into the original maps in order to
create the final map.

Maybe there are other possibilities, too.

Markus

Sounds like a good plan. We will try that way. Many thanks!!


Jorge Arevalo
Freelance developer

http://about.me/jorgeas80

On Tue, Apr 29, 2014 at 11:07 PM, Markus Neteler <neteler@osgeo.org> wrote:

On Tue, Apr 29, 2014 at 6:48 PM, Jorge Arevalo
<jorgearevalo@libregis.org> wrote:

I want to fill some areas of a raster coverage with a value of my choice.
Those areas now contain NODATA values. So, they look like holes in my
coverage.

If you want to set all NODATA area to the same value, then use r.null
with null=yourvalue:

http://grass.osgeo.org/grass70/manuals/r.null.html#examples

I know I could use r.clump function , but I don't know how to specify the
maximum area. Because if a hole is bigger than that area, I don't want to
consider it as hole. Is that even possible with GRASS?

You could assign all NODATA areas a specific, yet unused value (see above).
Then extract this value with r.mapcalc (if condition) and extract from
the resulting map only the smaller areas with

http://grass.osgeo.org/grass70/manuals/r.reclass.area.html

Then merge them back with r.patch into the original maps in order to
create the final map.

Maybe there are other possibilities, too.

You can try and parse the output or r.report of a "valid data map" eg:

1) r.mapcalc "in.valid = if(isnull(in))?1:2"

2) r.clump input=in.valid out=in.clump

3) r.report -h map=in.clump out=report units=me

here's a small python snippet which parses the report file which was
created in step3 and writes in a file which clumps you are intrested
at:

'''''
import fileinput
import locale
locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' )
t =
threshold = 100 #<- threshold in sq meters since r.report is reporting in meters
for l in fileinput.input(['report']):
        try:
            if locale.atof((l.split("|")[3])) > threshold:
                t.append(l.split("|")[1])
        except:
            continue

with open('somefile.txt', 'w') as f:
    for x in t:
        f.write(str(x) + "\n")
'''''

and now since you know in what holes you want to act upon you can
itterate easy with a little bash:

for hole in $(cat somefile.txt);
    do stuff;
done

Markus
_______________________________________________
grass-user mailing list
grass-user@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/grass-user