Calcul des aires d'occurences de taxons pour les listes rouges régionales

PostGIS 2.4 propose des fonction de fenêtre très pratiques pour les calculs d'aire d'occupation de taxon, utilisés dans la définition des listes rouges

Deux fonctions sont disponibles, ST_ClusterDBSCAN et ST_ClusterKMeans :

  • https://postgis.net/docs/manual-dev/ST_ClusterDBSCAN.html
  • https://postgis.net/docs/manual-dev/ST_ClusterKMeans.html

La requête ci-dessous créée l'aire d'occurence de l'espèce, pour les observations anciennes et récentes, en excluant les artefacts marins (découpage des périmètres produits selon les départements puis union des résultats)

WITH calcul_cluster AS (
	SELECT id_entite, nom_ref , cd_ref, tous_point_espece_selon_format_esri.geometrie, 
		CASE WHEN annee<2007 THEN 'ancien' WHEN annee>=2007 THEN 'recent' END AS age, 
		--ST_ClusterKMeans(geom, 10) OVER(), 
		ST_ClusterDBSCAN(tous_point_espece_selon_format_esri.geometrie, 25000, 1) OVER(PARTITION BY nom_ref, CASE WHEN annee<2007 THEN 'ancien' WHEN annee>=2007 THEN 'recent' END) AS cluster_id 
	FROM public.tous_point_espece_selon_format_esri 
	JOIN departement ON st_intersects(departement.geometrie, tous_point_espece_selon_format_esri.geometrie) 
	WHERE statut_validation NOT IN ('non valide','douteux','accidentel') 
	AND "nom_reg" = 'LANGUEDOC-ROUSSILLON-MIDI-PYRENEES' 
), cluster_entier AS (
	SELECT ROW_NUMBER() OVER() AS gid, nom_ref, age, 
		st_area2d(st_makevalid(st_multi(st_buffer(st_buffer(ST_ConvexHull(ST_Collect(geometrie)),1000),-900)))::geometry(MULTIPOLYGON,2154) )/1000000 AS surf_km2, 
		st_makevalid(st_multi(st_buffer(st_buffer(ST_ConvexHull(ST_Collect(geometrie)),1000),-900)))::geometry(MULTIPOLYGON,2154) AS geometrie 
	FROM calcul_cluster 
	--WHERE nom_ref ILIKE 'zerynthia %' 
	GROUP BY nom_ref, cluster_id, age
) 
SELECT ROW_NUMBER() OVER() AS id_noyau, nom_ref, age, 
		st_area2d(st_union(st_intersection(cluster_entier.geometrie, departement.geometrie)) )/1000000 AS surf_km2, 
		st_union(st_intersection(cluster_entier.geometrie, departement.geometrie)) AS geometrie 
FROM cluster_entier 
JOIN departement ON st_intersects(cluster_entier.geometrie, departement.geometrie) 
GROUP BY nom_ref, age

Tags: 

Les contenus des sites sig.cenlr.org et si.cenlr.org sont mis à disposition selon
les termes de la licence Creative Commons Attribution 3.0 France

Licence Creative Commons