Closed helenechauvin closed 1 year ago
@helenechauvin Alors, ce problème a déjà été remonté mais je ne retrouve pas le ticket. Cela peut être été traité via des échanges par emails...
La différence s'explique ainsi. Il y a 26 observations concernées, 23 sur la commune d'Arles et 3 sur la commune des Saintes-Marie-de-la-Mer. Les 26 observations nécessitent d'être floutée à la commune (via leur niveau de diffusion).
Dans Silene Nature le floutage à la commune s'effectue en redéfinissant la géométrie des observations en point correspondant au centroïde de la commune (cela respecte le format défini par le SINP). C'est un point qui est utilisé car l'Atlas (=Silene Nature) peut afficher aussi les observations sous forme de point mais nous on a choisi l'affichage à la maille... Résultat, les observations sont regroupées dans les mailles correspondant aux centroïdes des deux communes. Dans Silene Expert par contre, nous floutons les observations au niveau de leur géométrie précise sous forme de maille...
@jpm-cbna Ok merci, je comprends mieux du coup la différence d’affichage. Ne faudrait-il pas mettre un message d’info à ce sujet sur Silene Nature? Pour que les utilisateurs ne se méprennent pas.
@okristo @helenechauvin Oui, c'est possible pour le texte mais il faudrait m'indiquer son contenu et où le placer...
Une autre solution, c'est modifier le mécanisme de l'Atlas pour que le floutage se fasse comme dans Silene Expert... Par contre, cela serait spécifique à l'installation de l'Atlas sur le SINP PACA. J'ai regardé et cette modification n'est pas compliquée.
Exemple de code SQL modifié pour correspondre au floutage défini dans Silene Expert:
-- Compatibility : Atlas v1.5.0+
-- Usage : Git branch feat/sinp
-- Replace
CREATE MATERIALIZED VIEW synthese.vm_cor_synthese_area
TABLESPACE pg_default
AS
SELECT DISTINCT ON (sa.id_synthese, t.type_code)
sa.id_synthese,
sa.id_area,
st_transform(a.centroid, 4326) AS centroid_4326,
t.type_code,
a.area_code
FROM synthese.cor_area_synthese AS sa
JOIN ref_geo.l_areas AS a
ON (sa.id_area = a.id_area)
JOIN ref_geo.bib_areas_types AS t
ON (a.id_type = t.id_type)
WHERE t.type_code IN ('M5', 'M10', 'COM')
WITH DATA;
-- View indexes:
CREATE UNIQUE INDEX ON synthese.vm_cor_synthese_area (id_synthese, id_area);
CREATE INDEX ON synthese.vm_cor_synthese_area (type_code);
VACUUM ANALYSE synthese.vm_cor_synthese_area;
CREATE OR REPLACE FUNCTION atlas.get_blurring_centroid_geom_by_diffusion_level(code CHARACTER VARYING, idSynthese INTEGER)
RETURNS geometry
LANGUAGE plpgsql
IMMUTABLE
AS $function$
-- Function which return the centroid for a sensitivity or diffusion_level code and a synthese id
DECLARE centroid geometry;
BEGIN
SELECT INTO centroid csa.centroid_4326
FROM synthese.vm_cor_synthese_area AS csa
WHERE csa.id_synthese = idSynthese
AND csa.type_code = (CASE WHEN code = '1' THEN 'M5' WHEN code = '2' THEN 'M5' WHEN code = '3' THEN 'M5' END)
LIMIT 1 ;
RETURN centroid ;
END;
$function$
;
CREATE OR REPLACE FUNCTION atlas.get_blurring_centroid_geom_by_sensitivity(code CHARACTER VARYING, idSynthese INTEGER)
RETURNS geometry
LANGUAGE plpgsql
IMMUTABLE
AS $function$
-- Function which return the centroid for a sensitivity or diffusion_level code and a synthese id
DECLARE centroid geometry;
BEGIN
SELECT INTO centroid csa.centroid_4326
FROM synthese.vm_cor_synthese_area AS csa
WHERE csa.id_synthese = idSynthese
AND csa.type_code = (CASE WHEN code = '1' THEN 'M10' WHEN code = '2' THEN 'M10' WHEN code = '3' THEN 'M10' END)
LIMIT 1 ;
RETURN centroid ;
END;
$function$
;
CREATE VIEW synthese.syntheseff AS
SELECT
s.id_synthese,
s.id_dataset,
s.cd_nom,
s.date_min AS dateobs,
s.observers AS observateurs,
(s.altitude_min + s.altitude_max) / 2 AS altitude_retenue,
CASE
WHEN (sens.cd_nomenclature::INT >= 1 AND sens.cd_nomenclature::INT <= 3 AND dl.cd_nomenclature::INT >= 1 AND dl.cd_nomenclature::INT <= 3) THEN
CASE
WHEN (sens.cd_nomenclature::INT >= dl.cd_nomenclature::INT) THEN (
atlas.get_blurring_centroid_geom_by_sensitivity(sens.cd_nomenclature, s.id_synthese)
)
WHEN (sens.cd_nomenclature::INT < dl.cd_nomenclature::INT) THEN (
atlas.get_blurring_centroid_geom_by_diffusion_level(dl.cd_nomenclature, s.id_synthese)
)
END
WHEN (sens.cd_nomenclature::INT >= 1 AND sens.cd_nomenclature::INT <= 3) AND (dl.cd_nomenclature::INT < 1 OR dl.cd_nomenclature::INT > 3) THEN (
atlas.get_blurring_centroid_geom_by_sensitivity(sens.cd_nomenclature, s.id_synthese)
)
WHEN (dl.cd_nomenclature::INT >= 1 AND dl.cd_nomenclature::INT <= 3) AND (sens.cd_nomenclature::INT < 1 OR sens.cd_nomenclature::INT > 3) THEN (
atlas.get_blurring_centroid_geom_by_diffusion_level(dl.cd_nomenclature, s.id_synthese)
)
ELSE st_transform(s.the_geom_point, 4326)
END AS the_geom_point,
s.count_min AS effectif_total,
areas.area_code AS insee,
sens.cd_nomenclature AS sensitivity,
dl.cd_nomenclature AS diffusion_level
FROM synthese.synthese s
JOIN synthese.vm_cor_synthese_area AS areas
ON (s.id_synthese = areas.id_synthese)
LEFT JOIN synthese.t_nomenclatures AS sens
ON (s.id_nomenclature_sensitivity = sens.id_nomenclature)
LEFT JOIN synthese.t_nomenclatures AS dl
ON (s.id_nomenclature_diffusion_level = dl.id_nomenclature)
LEFT JOIN synthese.t_nomenclatures AS st
ON (s.id_nomenclature_observation_status = st.id_nomenclature)
WHERE areas.type_code = 'COM'
AND ( NOT dl.cd_nomenclature = '4' OR s.id_nomenclature_diffusion_level IS NULL )
AND ( NOT sens.cd_nomenclature = '4' OR s.id_nomenclature_sensitivity IS NULL )
AND st.cd_nomenclature = 'Pr' ;
@helenechauvin @okristo Voilà, j'ai finalement appliqué le code SQL ci-dessus dans l'Atlas. Maintenant les 2 affichages sont identiques.
Il semble y avoir des différences d'affichages de mailles entre Silene Nature et Silene Expert
Exemple avec l'espèce Criquet des marais Chorthippus jucundus (Fischer, 1853) pour l'ensemble de la région PACA Résultat Silene Nature
Résultat Silene Expert
Comment expliquer cette différence de résultats alors que l'échelle des mailles est la même ?