r.fillnulls fills NULL pixels (no data areas) in input map and
stores filled map to a new output map. The fill data are interpolated
from the no data area boundaries buffer using v.surf.rst or
Each area boundary buffer is set to three times the map resolution to get nominally
three points around the edge. This way the algorithm interpolates into the hole with
a trained slope and curvature at the edges, in order to avoid that such a flat plane
is generated in a hole.
During the interpolation following warning may occur when using the RST method:
Warning: strip exists with insufficient data
Warning: taking too long to find points for interpolation--please change
the region to area where your points are
This warning is generated if large data holes exist within the surface.
As the idea of r.fillnulls is to fill such holes, the user may
ignore the warning. The interpolation will be continued. However, the user
may pay attention to below notes.
When using the default RST method, the algorithm is based on v.surf.rst
regularized splines with tension interpolation module which interpolates the
raster cell values for NULL data areas from the boundary values of the NULL
data area. An eventual raster MASK is respected during the NULL data area(s)
filling. The interpolated values are patched into the NULL data area(s) of
the input map and saved into a new raster map.
Otherwise, either the bilinear or bicubic method can be selected (based on
Depending on the shape of the NULL data area(s) problems may occur due to an
insufficient number of input cell values for the interpolation process. Most
problems will occur if a NULL data area reaches a large amount of the map
boundary. The user will have to carefully check the result using
r.mapcalc (generating a difference map to the
input map and applying the "differences" color table with r.colors)
and/or d.what.rast to query individual cell values.
In this example, the SRTM elevation map in the
North Carolina sample dataset location is filtered for outlier
elevation values; missing pixels are then re-interpolated to obtain
a complete elevation map:
g.region rast=elev_srtm_30m -p
# remove too low elevations (esp. lakes)
r.mapcalc "elev_srtm_30m_filt = if(elev_srtm_30m < 50.0, null(), elev_srtm_30m)"
r.fillnulls input=elev_srtm_30m_filt output=elev_srtm_30m_complete tension=20
Mitas, L., Mitasova, H., 1999, Spatial Interpolation. In: P.Longley,
M.F. Goodchild, D.J. Maguire, D.W.Rhind (Eds.), Geographical Information
Systems: Principles, Techniques, Management and Applications, Wiley,
Mitasova H., Mitas L., Brown W.M., D.P. Gerdes, I.
Kosinovsky, Baker, T.1995, Modeling spatially and temporally distributed
phenomena: New methods and tools for GRASS GIS. International Journal of
GIS, 9 (4), special issue on Integrating GIS and Environmental modeling,
and Mitas L. 1993: Interpolation by Regularized Spline with Tension: I.
Theory and Implementation, Mathematical Geology 25, 641-655.
and Hofierka L. 1993: Interpolation by Regularized Spline with Tension:
II. Application to Terrain Modeling and Surface Geometry Analysis,
Mathematical Geology 25, 657-667.
r.fillnulls: Markus Neteler, University of Hannover and Fondazione Edmund Mach
and authors of v.surf.rst
Improvement by Hamish Bowman, NZ
Last changed: $Date$