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_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
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