Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gestionnaire des couches #572

Open
babastienne opened this issue Sep 12, 2024 · 9 comments
Open

Gestionnaire des couches #572

babastienne opened this issue Sep 12, 2024 · 9 comments
Assignees

Comments

@babastienne
Copy link

Voir #528 (comment)

@babastienne babastienne converted this from a draft issue Sep 12, 2024
@babastienne
Copy link
Author

@amandine-sahl peux-tu nous indiquer où trouver la configuration des couches de GeoNature ?

Dans un premier temps :

  • Ajouter le système de gestion de couche

Les filtres par section (type de page) ou par espèce seront traités dans un second temps, pour une itération future.

@camillemonchicourt
Copy link
Member

@bruhnild
Copy link

Retours suite à la recette :

  • pouvoir replier le menu pour gagner de la place ou pouvoir combiner avec le gestionnaire de couches (mailles) existant

Image

@marcantoinedupre
Copy link

Quelques updates sur mon travail en cours sur l'ajout d'un gestionnaire de couches SIG additionnelles sur les cartes de l'atlas. J'ai ouvert la draft PR : #604

Configuration

Voici la configuration d'exemple qui permet d'obtenir le gestionnaire et les couches des captures d'écran postées par @bruhnild .

COUCHES_SIG = [
    {
        'name': 'Zonage pluvial',
        'type': 'wms',
        'url': 'https://cartographie.nantesmetropole.fr/arcgis/services/PLUm/plum_annexes/MapServer/WMSServer?',
        'options': {
            'layers': 'Zonage_pluvial_(I19-03)54824',
            'transparent': True,
            'format': 'image/png'
        }
    },
    {
        'name': 'Réseau de chaleur',
        'type': 'wms',
        'url': 'https://cartographie.nantesmetropole.fr/arcgis/services/PLUm/plum_annexes/MapServer/WMSServer?',
        'options': {
            'layers': 'Réseau_de_chaleur_(I_07-00)28291',
            'transparent': True,
            'format': 'image/png'
        }
    },
    {
        'name': 'PLUM annexes',
        'type': 'arcgisMapService',
        'url': "https://cartographie.nantesmetropole.fr/arcgis/rest/services/PLUm/plum_annexes/MapServer"
    }
]

Limites du plugin L.LayerTreeControl

  • affiche toutes les couches d'un MapService Arcgis, la sélection n'est pas possible
  • manque p-ê une interaction pour répercuter un toggle-on sur un groupe de couches sur toutes les couches enfants (en l'état il faut aller cocher les couches enfants une par une)
  • l'ordre des couches défini dans la config n'est pas respecté (un bug du plugin je pense)
  • pas possible de configurer certaines couches pour qu'elles soient visibles par défaut
  • ne supporte pas les légendes pour une couche WMTS

Après une recherche ça reste tout de même la meilleure option de plugin. À noter que gn-atlas va dépendre du fork du plugin par Makina suite à une correction de bug qui n'a pas encore été répercuté sur le upstream.

Ajout d'une dépendance vers la lib esri-leaflet

Lib nécessaire pour gérer les couches provenant d'un serveur Arcgis. La lib ne sera chargée dans le navigateur que s'il y a des couches Arcgis à afficher. J'ai choisi de l'inclure dans les dépendances npm de l'atlas car la solution de permettre à l'admin d'inclure son propre code JS via une propriété assets dans config.py paraît complexe pour l'usage (pas d'autres utilisations de ce mécanisme en vue).

J'ai néanmoins testé rapidement et ça pourrait fonctionner avec la configuration suivante et la méthode JS eval appliquée sur le nom reconstitué du constructeur de couche esri-leaflet.

{
    'name': 'PLUM annexes',
    'type': 'arcgisMapService',
    'url': "https://cartographie.nantesmetropole.fr/arcgis/rest/services/PLUm/plum_annexes/MapServer",
    'assets': [
        'custom/esri-leaflet.js',
        'custom/createEsriLayer.js',
    ]
}
function createLayer(coucheSigInfo) {
  let func = eval("create" + capitalize(coucheSigInfo.type) + "Layer");
  return func(coucheSigInfo);
}

Couche geoJSON et territoire.json

Il était mentionné dans les tickets pointés par @camillemonchicourt l'opportunité d'inclure l'élément de configuration territoire.json qui permet d'afficher les limites du territoire de l'atlas sur la carte. Ce sera possible mais plutôt dans un second temps.

  • L.LayerTreeControl supporte l'affichage d'une couche geoJSON
  • nécessite un bout de JS non-trivial pour gérer le chargement asynchrone du geoJSON pour créer la couche leaflet (pour les autres types de couche la création avec une URL est synchrone et c'est leaflet qui gère l'asynchrone)
  • les limites du territoire est une couche qu'on aimerait afficher par défaut, or ce n'est pas possible avec le plugin (peut-être une contribution possible au plugin ?)
  • ou bien on pourrait ajouter une option show_in_control true/false pour les couches sig. La couche territoire.json serait show_in_control: false donc toujours visible et n'apparaissant pas dans le gestionnaire de couches.

Travaux en cours

  • afficher couche uniquement sur pages cibles
  • afficher couche uniquement pour groupes INPN cibles
  • limiter la place occupé par le gestionnaire de couche, voire fusion avec le sélecteur des niveaux de mailles à afficher

@camillemonchicourt
Copy link
Member

OK merci pour ces éléments.
Jusqu'à présent, on avait réussi à rester très simple et éviter un "gestionnaire de couches" dans une volonté d'être très intuitif, et pas tomber dans des concepts et fonctionnalités trop WebSIG.
Il avait déjà été évoqué la possibilité d'afficher d'autres couches sur la carte (ici par exemple - #246) et a ensuite été discuté une fonctionnalité générique pour pouvoir configurer des couches locales ou distantes à afficher sur la carte.
Et d'en profiter pour virer le mécanisme spécifique d'ajout de la couche du territoire pour l'intégrer dans la mécanique générique d'ajout de couches additionnelles sur la carte.

L'idée était d'utiliser le gestionnaire de couches simple et basique de Leaflet.
Mais là, on est encore plus complexe et encore plus SIG avec un arbre de couches que je n'avais pas en tête.

Je pense que peu d'utilisateurs voudront ajouter des couches sur les cartes, mais encore moins sous forme d'arbre de couches.

De plus si cela oblige à intégrer un plugin peu fonctionnel, je suis assez réservé.

Ajouter un mécanisme simple et générique d'ajout de couches, groupé avec les couches de types de maille, est pertinent, mais encore un autre bloc à part pour ça pour gérer les arbres de couches, peu fonctionnel ni maintenu pose soucis il me semble.

On voulait aussi éviter la dépendance à "esri-leaflet" car là aussi sa maintenance est incertaine.
Si il est fonctionnel et chargé que si il est utilisé, pourquoi l'ajouter en dur dans le code, mais on ne pourra pas garantir sa maintenance si l'équipe qui le développe ne le maintient plus à l'avenir.

Tout ce travail devait aussi s'appuyer sur une mise à jour préalable des dépendances, notamment les versions de Leaflet et de ses plugins.

@babastienne
Copy link
Author

babastienne commented Jan 27, 2025

Jusqu'à présent, on avait réussi à rester très simple et éviter un "gestionnaire de couches" dans une volonté d'être très intuitif

Le gestionnaire "intuitif" actuel :

Image

À moins d'être connaisseur de la législation liée à la protection des données d'observation d'espèces ça m'étonnerai que quelqu'un comprenne à quoi correspondent ces couches et les légendes associées ... A soumettre à un expert UX mais ça m'étonnerai que son retour soit que le gestionnaire est "intuitif".

L'idée était d'utiliser le gestionnaire de couches simple et basique de Leaflet.

Dans ce commentaire pourtant tu semblais valider l'utilisation du plugin utilisé. ("J'intégrerai donc nativement Leaflet-LayerTreeControl mais ne l'utiliserai que si au moins une couche additionnelle est déclarée dans la config" > c'est ce qu'on a fait).

D'un point de vue "fonctionnel" je trouve pas ça déconnant d'avoir un gestionnaire dédié aux couches de données "GeoNature" et un autre bien séparé pour toutes les données tierces complémentaires qui viennent juste apporter du contexte mais pas des données applicatives.

Mais là, on est encore plus complexe et encore plus SIG avec un arbre de couches que je n'avais pas en tête.

L.LayerTREEControl

Je pense que peu d'utilisateurs voudront ajouter des couches sur les cartes,

Les utilisateurs qui ne souhaitent pas cette fonctionnalité ... ne l'utiliseront pas.

Actuellement j'ai testé une cinquantaine d'applis GeoNature-Atlas et j'en ai trouvé uniquement 2 qui avaient un sélecteur pour les mailles. Donc en effet tout le monde ne souhaite pas forcément aller à ce niveau de configuration. Mais comme tu l'as toi même pointé c'est un besoin déjà évoqué à plusieurs reprises dans d'autres tickets, donc ceux qui voudront pourront l'utiliser et les autres n'auront rien à faire et leur GeoNature ne sera aucunement affecté.

mais encore moins sous forme d'arbre de couches.

L'utilisation d'un niveau de hiérarchie important n'est pas obligatoire. C'est possible de rester simple : une couche uniquement sans notion de groupe. C'est juste que c'est aussi possible, pour couvrir plusieurs cas d'usages.

De plus si cela oblige à intégrer un plugin peu fonctionnel, je suis assez réservé.

Peux-tu en dire plus sur l'aspect "peu fonctionnel" ? 🤔


De manière plus générale, est-ce que ton commentaire signifie que vous ne souhaitez pas intégrer ces changements dans le produit GeoNature-Atlas ? Parce que là il est question d'une exigence spécifiée il y a pratiquement un an, où la démarche était décrite dans des tickets depuis plusieurs mois et sur laquelle tu ne semblais pas avoir émis autant de réserves. C'est un peu délicat et tardif d'émettre ces retours une fois que l'implémentation est déjà réalisée.

@camillemonchicourt
Copy link
Member

Je parlais de l'aspect simple et intuitif du gestionnaire de couche de base de Leaflet car classique et souvent utilisé :
Image
Je parlais pas de son contenu avec les mailles et la sensibilité qui est en effet peu compréhensible.

Pour le plugin LayerTreeControl, j'avais pas bien capté de quoi il s'agissait et que c'était pour gérer des arbres de couches.

Pour moi c'était évident qu'on allait juste ajouter la possibilité d'ajouter des couches externes additionnelles dans le gestionnaire de couches de base de Leaflet. Comme on a dans Geotrek-admin, dans Geotrek-rando, dans les zonages de sensibilité de GNA et dans plein d'autres outils.
Et en profiter pour virer la fonctionnalité spécifique d'affichage du territoire, pour laisser chacun l'afficher ou non en temps que couche additionnelle.
Là si une personne veut ajouter une ou 2 couches sur la carte, alors elle n'a pas besoin qu'il y ait un second gestionnaire de couches, que celui s'affiche sous forme d'arbres, etc...
Donc cela ne répondra qu'au cas spécifique où on a un arbre de couches à afficher, mais pas au cas de base, de ce que je comprends.

C'est normal actuellement qu'il n'y ait pas de sélecteur de couches sur les GNA déployés, car cette fonctionnalité n'est actuellement pas implémentée dans une version publiée de GNA.

Peu fonctionnel :

  • car ouvert par défaut de ce que j'ai vu,
  • car quand on coche un niveau cela ne coche pas les niveaux en dessous,
  • car plus maintenu depuis 2 ans
  • et surtout car quand on coche des couches, il prend toute la place, on ne voit plus la carte et on ne peut plus le replier
    Image

Mais sinon, oui oui, c'est clair et OK depuis le début que de pouvoir ajouter des couches additionnelles dans le gestionnaire de couches, même depuis 2020 : #246 (comment)

@camillemonchicourt
Copy link
Member

OK, j'ai regardé un peu plus en détail l'implémentation actuelle et en effet ce n'est pas très satisfaisant selon moi.
C'était déjà pas terrible actuellement car il y avait une légende statique avec seulement la couche de limite du territoire en haut à gauche et une autre légende du nombre d'observation en bas à droite.

Mais là l'ajout d'un gestionnaire a pour vocation de regrouper et clarifier tout ça, mais pas d'ajouter encore plus de boutons et de dispersion peu compréhensible.

Car en l'état des évolutions :

  • On a toujours 2 légendes à 2 endroits, mais en plus :
  • Non pas un mais 2 gestionnaires de couches
  • Celui des mailles quand l'espèce comprend des observations sensibles n'est pas compréhensible car
    • n'a pas de titre
    • affiche tous les zonages de floutage même si ils ne concernent pas l'espèce, donc ne correspondent à aucune couche sur la carte
    • mais n'affiche pas la couche des mailles non sensibles donc n'est pas utile et ne permet pas de masquer les observations pour voir la carte en dessous (ou les couches additionnelles ajoutées sous les mailles et donc non lisibles)
  • Celui des couches additionnelles est peu fonctionnel pour les raisons évoquées ci-dessus, mais en plus :
    • on ne comprend pas pourquoi il est à part de l'autre gestionnaire de couches
    • les couches additionnelles affichées ne sont pas lisibles car on ne peut pas masquer les observations en maille qui couvrent la carte

Donc le fait d'ajouter un gestionnaire de couches ainsi que le floutage des données sensibles nécessite de reprendre le fonctionnement actuel et pas de s'y ajouter à côté.

Voilà ce que j'aurai en tête pour regrouper tout ça dans un ensemble plus cohérent :

Image

Un seul gestionnaire de couches, incluant aussi les légendes.
Mais ça pas certain que le gestionnaire de couches Leaflet permette d'intégrer des couches activables ou non, tout en affichant en dessous leur éventuelle légende avec des classes ? Quoique :

Image

@marcantoinedupre
Copy link

OK merci pour tes retours @Camille. Je partage ta vision idéale pour l'intégration de cette fonctionnalité. Je ne pense pas que nous pourrons atteindre tous ces objectifs dans le temps dont nous disposons pour cette prestation.

Je vais apporter quelques précisions sur le travail en cours de façon concise sans rebondir forcément sur tous les points abordés.

espace occupé par le gestionnaire de couches SIG

La couche Arcgis utilisée (les annexes du PLUM Nantes) n'est pas la meilleure pour un exemple de fonctionnement. Elle a beaucoup de couches, beaucoup de niveaux d'arborescence et des titres très longs. Elle n'est pas représentative de l'usage qu'on veut faire du gestionnaire de couches SIG.

Je pense donc qu'il ne faut pas se focaliser sur la place prise par cette couche exemple. La quantité de données à exposer dans l'atlas sera adaptée par les administrateurs de chaque instance, avec une arborescence plus simple ou pas d'arborescence, moins de couches, des titres moins longs...

les légendes

Comme tu l'as compris l'utilisation du plugin LayerTreeControl est surtout dictée par sa capacité d'affichage des légendes des couches directement depuis le ou les serveurs de couches SIG. Les possibilités d'arborescence viennent avec mais c'est secondaire.

J'ai examiné le code de l'outil Layers standard de Leaflet et il n'y a aucune gestion des légendes. La capture d'écran que tu as postée doit être basée sur un plugin ou un développement spécifique.

pouvoir replier le gestionnaire de couches SIG

Comme je l'ai indiqué réduire la place prise par le gestionnaire de couches LayerTreeControl faisait partie de la suite de mon travail. Voici ce que j'ai actuellement :

Peek.28-01-2025.11-59.webm

Il s'agit du même fonctionnement que pour le composant Layers standard de Leaflet. Le panneau est développé au survol et réduit à la sortie du curseur. En mode mobile c'est un touch qui développe, et touch sur la carte pour réduire.

C'est une solution intermédiaire pour un effort de développement maitrisé. Idéalement il faudrait aller plus loin et fusionner les deux sélecteurs de couches. Cependant, à mon avis, avoir deux outils reste acceptable étant donné que les types d'objets manipulés sont différents :

  • niveaux de représentation des observations (objet central)
  • couches SIG additionnelles (informations complémentaires)

Je pense qu'on aurait d'ailleurs tendance à vouloir les différencier visuellement si affiché dans le même panneau.

définir des couches spécifiques pour des pages/des espèces

J'ai ajouté la possibilité de cibler des pages ou des groupes taxononiques pour les couches SIG. Voilà ce que ça donne pour la config :

COUCHES_SIG = [
    {
        'name': 'Zones de protection',
        'type': 'wms',
        'url': 'https://foo.bar/WMSServer?',
        'options': {
            'layers': 'zones_protection'
        },
        'pages': [
            'home',
            'species'
        ]
    },
    {
        'name': 'Zones humides',
        'type': 'wms',
        'url': 'https://foo.bar/WMSServer?',
        'options': {
            'layers': 'zones_humides'
        },
        'pages': [
            'species'
        ],
        'groups2_inpn': [
            'Amphibiens',
            'Oiseaux',
        ]
    }
]
  • les zones de protections sont disponibles uniquement sur la page générale ('home') ou la fiche espèce ('species').
  • les zones humides sont disponibles uniquement sur la fiche espèce et pour les taxons appartenant à l'un des deux groupes taxonomiques.
  • si les propriétés pages et/ou groups2_inpn ne sont pas présentes la couche est disponible pour toutes les pages et/ou pour tous les taxons.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: Doing
Development

No branches or pull requests

4 participants