Skip to the content.

Expressions + style pour profil d’altitude

english version - sommaire

L’idée : proposer une expression pour dessiner un profil altitudinal dynamiquement.

Démo

Les expressions

L’une ne génère qu’une simple ligne, l’autre un polygone, elles se ressemblent.

Elles exploitent l’interessante fonction with_variable qui permet de factoriser et rendre le code plus lisible,
mais aussi :

Les expressions sont à placer dans un style générateur de géométrie de type ligne pour la première, polygone pour la seconde.

Le nom de la couche raster (dem) portant les altitudes doit être adapté (theDemLayer ici).

-- Expression à placer dans un style générateur de géométrie de type LINESTRING
with_variable('transect', smooth($geometry, 3), -- la géométrie liséee
with_variable('dem', 'theDemLayer', -- nom de la couche raster (mnt) à adapter
with_variable('fz', 3, -- exagération du relief
with_variable('x0', x_min(@transect), -- gauche
with_variable('y0', y_min(@transect), -- bas 
with_variable('xs',  -- tableau d'abscisses : distance depuis l'origine, en chaque point
	array_foreach(
		generate_series(1, num_points(@transect)),
		distance_to_vertex(@transect, @element-1)
	),
with_variable('zs', -- tableau d'altitudes (exagérées) ou non
	array_foreach(
		generate_series(1, num_points(@transect)),
		@fz * raster_value(@dem, 1, point_n(nodes_to_points(@transect), @element))
	),
with_variable('xz', -- tableau de couples x/z
	array_foreach(
		generate_series(1, num_points(@transect)),
		array(array_get(@xs, @element-1), array_get(@zs, @element-1))
	),
with_variable('points', -- tableau de points
	array_foreach(@xz, make_point(@element[0], @element[1])), 
	-- > et la ligne 
	translate(make_line(@points), @x0, @y0-array_max(@zs)
	)
)))))))))
-- Expression à placer dans un style générateur de géométrie de type POLYGON
with_variable('transect',  densify_by_distance( smooth($geometry, 3), $length/50), 
with_variable('dem', 'theDemLayer', 
with_variable('base_height', 1000,
with_variable('fz', 3, 
with_variable('x0', x_min(@transect), 
with_variable('y0', y_min(@transect), 
with_variable('xs', 
	array_foreach(
		generate_series(1, num_points(@transect)),
		distance_to_vertex(@transect, @element-1)
	),
with_variable('zs', 
	array_foreach(
		generate_series(1, num_points(@transect)),
		@fz * coalesce(raster_value(@dem, 1, point_n(nodes_to_points(@transect), @element)), 0)
	),
with_variable('xz',
	array_foreach(
		generate_series(1, num_points(@transect)),
		array(array_get(@xs, @element-1), array_get(@zs, @element-1))
	),
with_variable('points', 
	array_foreach(@xz, make_point(@element[0], @element[1])), 
	-- > et le polgygone avec les deux point de la base en plus
	translate(
		make_polygon(make_line(
			array_append(
				array_append(@points, 
					make_point(array_max(@xs), 0) 
				), 
				make_point(array_min(@xs), 0) 
			)
		)), 
		@x0, @y0-array_max(@zs)
	)
))))))))))

Les fichiers