cbn-alpin / sinp-paca-tickets

Tickets concernant le projet de migration vers GeoNature de silene.eu.
1 stars 0 forks source link

[Atlas] Différence mailles Silene Nature / Silene Expert #210

Closed helenechauvin closed 1 year ago

helenechauvin commented 1 year ago

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 image

Résultat Silene Expert image

Comment expliquer cette différence de résultats alors que l'échelle des mailles est la même ?

jpm-cbna commented 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...

helenechauvin commented 1 year ago

@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.

jpm-cbna commented 1 year ago

@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.

jpm-cbna commented 1 year ago

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' ;
jpm-cbna commented 1 year ago

@helenechauvin @okristo Voilà, j'ai finalement appliqué le code SQL ci-dessus dans l'Atlas. Maintenant les 2 affichages sont identiques.