RST Spline Surfaces
RST: Regularized Spline with Tension
Thin plate splines fit a surface to a series of points by minimizing the energy it takes to "bend" the surface. You can think of it as stretching a rubber sheet between all the points and then varying the stiffness of the sheet.
Using this method you can create raster surfaces which, as compared to a simple rasterization method like a sampled TIN, better match the true topography, work better results from groundwater flow modules, and create much nicer visualization images.
A quadtree segmentation method is used to concentrate computational effort into areas of greatest input point density.
Tuning parameters and Validation
- See the module help pages
- [Video lecture on spline interpolation] by Prof Helena Mitasova
- (TODO: write user guide)
- (TODO: write How-to)
- To help speed things up during tuning tests use a smaller area, e.g. 100x100 cells, that is representative of the terrain.
Getting rid of those segmentation boxes
Here some work-around (avoiding segmentation at all):
6921 input points ... WARNING: Points are more dense than specified 'DMIN'--ignored 5575 points (remain 1346)
Now we can calculate: 6921-5575=1346. For smooth connection of segments, npmin > segmax.
You may get errors like:
ERROR: segmentation parameters set to invalid values: npmin = 300, segmax = 850 for smooth connection of segments, npmin > segmax (see manual) ERROR: input failed!
In the/ source code, there is a MAXPOINTS value defined in the surf.h file. MAXPOINTS simply says how many input points are allowed to be computed without segmentation. I had to increase the value of MAXPOINTS in surf.h to 1346 (or a bit more), recompile, and then use segmax=1346 to avoid segmentation. Tricky but works. (n.b. actually this source code change probably has no effect other than to mask the warning message for v.surf.rst. It seems to be used in v.vol.rst though)
- Update I have a patch which I currently test to replace MAXPOINTS with a new npmax parameter - Markus Neteler 12:56, 7 April 2009 (UTC)
The idea of the module authors is to change v.surf.rst/v.vol.rst to a more dynamic management of this value, the question is how to implement that.
Summary: avoid segmentation if possible.
Computational time needed
GRASS 7.svn, expirical formulae (to be stabilized or improved):
- (t in minutes; points: number of vector points)
- : t ~= 1.5e-11 * points^2
- : t ~= 4.5e-11 * points^3
Working with contour lines
The RST modules work best with an even distribution of starting points. Contour line vertices tend to be highly packed along lines with huge gaps in between different lines. Not very evenly distributed! This will usually lead to segmentation problems (see troubleshooting section below). Some solutions are offered at the following link, demonstrating the use of themodule to remove vertices from the contour lines:
You may prefer to try theor add-on modules if starting with contour line data.
- See the Contour lines to DEM wiki page for a study of different interpolation methods.
Working with huge data sets
Interpolation large DEMs from large amounts of vector points requires lot of RAM. Some hints
- don't create point topology (-b flag in several modules like , etc)
- use segmentation (e.g., segmax=10 and npmin=120)
- interpolate in chunks with overlap
todo: explain more
- If your input data points include a dramatic change in point density across the region of interest you may get square artifacts in the output map. This is especially visible in a slope map or in contour lines created from the elev map with
- Solution 1: increase the npmin parameter
- Solution 2: Create the surface in multiple passes. First isolate the low density points and use to make a polygon around them. Next run for those points to make a smooth surface between them. Then you can either run on the hull area and create new random points with the module, or sample the new surface with the add-on script. Finally use to create a new points file with a less dramatic change in point density.
- Spline surfaces do not handle hard breaks in the topography very well, such as found on a beach at the base of a cliff. "Ringing_artifacts" may be introduced and the module may complain about "overshoots", as the surface is bent away from an input point further than the module is happy with. Users familiar with digital electronics may recall the similar problem of fitting a sinusoid to a square wave.
- add parallelization support to the RST library (e.g. OpenMP)