Examples

This describes the validation and example datasets, along with sample mesher inputs.

A zip containing all the example code and data can be found here.

flat

Flat DEM, produces 2 triangles

image0


#Example configuration file using the sample data

dem_filename = '../data/ideal_flat.tif'

max_area= 9999999999999999**2  #Effectively unlimited upper area -- allow tolerance check to refine it further
max_tolerance = 5    # 5m max RMSE between triangle and underlying elevation set to -1 to skip tolerance checks
min_area = 5**2     # triangle area below which we will no longer refine, regardless of max_tolerance

MPI_nworkers = 1

flat_veg

Uses the EOSD dataset to mesh with a mode=0.9 threshold. This captures most of the vegetation patches. ALthough it result in an over-generation of triangles between patches, this is due to producing a good gradation from small to larger triangles.

image1


dem_filename = '../data/ideal_flat.tif'

max_area= 50000**2  #Effectively unlimited upper area -- allow tolerance check to refine it further
max_tolerance = 5    # 5 m max RMSE between triangle and underlying elevation set to -1 to skip tolerance checks
min_area = 30**2     # triangle area below which we will no longer refine, regardless of max_tolerance

parameter_files = {
    'landcover': {'file': '../data/eosd.tif', # vegetation landcover
                  'method': 'mode',
                  'tolerance':.9}
}
MPI_nworkers = 1

gaussian_hill

Using the generated gaussian hill dataset, produces a mesh for a guassian hill.

image2

dem_filename = '../data/ideal_gaussianHill.tif'

max_area= 50000**2  #Effectively unlimited upper area -- allow tolerance check to refine it further
max_tolerance = 5    # 5 m maxe RMSE between triangle and underlying elevation set to -1 to skip tolerance checks
min_area = 30**2     #triangle area below which we will no longer refine, regardless of max_tolerance

MPI_nworkers = 1

ideal_ridge

An idealized ridge line

image3

dem_filename = '../data/ideal_ridge.tif'

max_area= 50000**2  #Effectively unlimited upper area -- allow tolerance check to refine it further
max_tolerance = 5    #5m maxe RMSE between triangle and underlying elevation set to -1 to skip tolerance checks
min_area = 30**2     #triangle area below which we will no longer refine, regardless of max_tolerance

MPI_nworkers = 1

ideal_ridge_low_tol

Same as the ideal_ridge, but with a tighter tolerance. Produces more triangles along the rige to better capture it.

image4

dem_filename = '../data/ideal_ridge.tif'

max_area= 50000**2  #Effectively unlimited upper area -- allow tolerance check to refine it further
max_tolerance = 1    #1m maxe RMSE between triangle and underlying elevation set to -1 to skip tolerance checks
min_area = 30**2     #triangle area below which we will no longer refine, regardless of max_tolerance
MPI_nworkers = 1

uniform

Produces a uniform mesh with area = 100 m x 100 m.

image5

dem_filename = '../data/ideal_flat.tif'

max_area= 9999999999999999**2  #Effectively unlimited upper area -- allow tolerance check to refine it further
max_tolerance = -1    # -1 to skip tolerance checks
min_area = 100**2     #triangle area below which we will no longer refine, regardless of max_tolerance
MPI_nworkers = 1

lloyd

Demonstrates the impact of 100 lloyd optimization iterations on the above uniform domain. Compare to the uniform case

image6


dem_filename = '../data/ideal_flat.tif'

max_area= 9999999999999999**2  #Effectively unlimited upper area -- allow tolerance check to refine it further
max_tolerance = -1    #1 -1 to skip tolerance checks
min_area = 100**2     #triangle area below which we will no longer refine, regardless of max_tolerance

lloyd_itr=100
MPI_nworkers = 1

flat_stream

The flat DEM has been constrained to a stream network input as a shape file. This shows the greater number of triangles near the stream. Simplified stream networks produce fewer triangles along the river constraint.

image7


dem_filename = '../data/ideal_flat.tif'

max_area= 9999999999999999**2  #Effectively unlimited upper area -- allow tolerance check to refine it further
max_tolerance = 5    # 5m max RMSE between triangle and underlying elevation set to -1 to skip tolerance checks
min_area = 5**2     #triangle area below which we will no longer refine, regardless of max_tolerance

constraints = { 'river_network' :
					{
						'file': '../data/Stream.shp',
						'simplify':1 # will be in original projection units
					}
 			}
MPI_nworkers = 1

stream_dem

Same as above, but including the the Granger subset DEM. image8



dem_filename = '../data/granger1m.tif'

max_area= 99999999**2  #Effectively unlimited upper area -- allow tolerance check to refine it further
max_tolerance = 5    #5 m RMSE
min_area = 25**2     #triangle area below which we will no longer refine, regardless of max_tolerance


constraints = { 'river_network' :
					{
						'file': '../data/Stream.shp'
						# 'simplify':5 # will be in original projection units
					}
 			}

lloyd_itr=1
MPI_nworkers = 1

granger

The Granger subset is used, deriving a mesh from only the elevation map.

image9

dem_filename = '../data/granger1m.tif'

max_area= 99999999**2  #Effectively unlimited upper area -- allow tolerance check to refine it further
max_tolerance = 1    #1 m RMSE
min_area = 5**2     #triangle area below which we will no longer refine, regardless of max_tolerance

lloyd_itr=1
simplify=True
MPI_nworkers = 1

granger_low_veg_weight

The granger subset is used with a low elevation tolerance plus low weights on the vegetation map, showing mesher mostly ignoring the vegetation constraints.

image10

dem_filename = '../data/granger1m.tif'

max_area= 50000**2  #Effectively unlimited upper area -- allow tolerance check to refine it further
max_tolerance = 5    #5m maxe RMSE between triangle and underlying elevation set to -1 to skip tolerance checks
min_area = 30**2     #triangle area below which we will no longer refine, regardless of max_tolerance

use_weights = True
topo_weight=0.8
weight_threshold = 0.8
parameter_files = {
    'landcover': {'file': '../data/eosd.tif',
                  'method': 'mode',
                  'weight':0.2,
                  'tolerance':.9}
}


lloyd_itr=1
simplify=True

granger_high_veg_weight

Same as above but with high weight on the vegetation map, showing the algorithm refining triangles to capture the vegetation patches.

image11

dem_filename = '../data/granger1m.tif'

max_area= 50000**2  #Effectively unlimited upper area -- allow tolerance check to refine it further
max_tolerance = 5    # 5m maxe RMSE between triangle and underlying elevation set to -1 to skip tolerance checks
min_area = 30**2     #triangle area below which we will no longer refine, regardless of max_tolerance

use_weights = True
topo_weight=0.2
weight_threshold = 0.8
parameter_files = {
    'landcover': {'file': '../data/eosd.tif',
                  'method': 'mode',
                  'weight':0.8,
                  'tolerance':.9}
}


lloyd_itr=1
simplify=True
MPI_nworkers = 1

flow_accumulation

This domain shows large-extent meshing with a mountain domain for the Bow Valley region near Canmore, Alberta, Canada. This mesh uses a DEM-derived flow accumulation via RichDEM to ensure the mesh captures the high-accumulation locations. The flow accumulation input is generated with the flow.py script in data folder. This requires the RichDEM Python package to be installed.

image12

dem_filename='../data/chro_extent_lowRes.tif'

max_area=5000**2
max_tolerance=50
min_area=200**2

use_input_prj=False
lloyd_itr=100
simplify=True
simplify_tol=100
simplify_buffer=-50

parameter_files = {    
                     'flow_accumulation':{
                         'file':'../data/flow_accumulation.tif',
                         'method':'mean',
                         'tolerance':50
                     }
                   }


MPI_nworkers = 1

flow_accumulation_granger

Flow accumulation for the smaller Granger subbasin.

image16

dem_filename='../data/granger1m.tif'

max_area=5000**2
max_tolerance=10
min_area=5**2

lloyd_itr=100
simplify=True
simplify_tol=100
simplify_buffer=-50

parameter_files = {    
                     'flow_accumulation':{
                         'file':'../data/flow_accumulation_granger.tif',
                         'method':'mean',
                         'tolerance':500
                     }
                   }


MPI_nworkers = 1

dem_smoothing

A small subset of the above Bow Valley domain is extracted to show the impact of smoothing on the output mesh. If the min_area is approximately equal to the cell size of the raster and tolerance parameter ensures triangles of this size are being produced, then in complex terrain the stair stepping of the raster (due to non-continous first derivative; i.e., slope) impacts the mesh quality as shown below.

image13

mesher has an option to smooth the input DEM to lessen this impact. This is enabled via

do_smoothing = True
max_smooth_iter = 1
smoothing_scaling_factor = 1

Each iteration the smoothing magnitude increases by iteration * smoothing_scaling_factor. This is the result of 1 smoothing iteration. image14

Subsequent iterations, or increases in smoothing_scaling_factor can reduce the stair-stepping further at the cost of increased smoothing of complex terrain.

do_smoothing = True
max_smooth_iter = 2
smoothing_scaling_factor = 1

image15

dem_filename='../data/chro_small.tif'

max_area=5000**2
max_tolerance=10
min_area=30**2

lloyd_itr = 1
use_input_prj=False
do_smoothing = True
max_smooth_iter = 2
smoothing_scaling_factor = 1

MPI_nworkers = 1