GeoNature icon indicating copy to clipboard operation
GeoNature copied to clipboard

Carto: pouvoir afficher les zonages du ref_geo

Open TheoLechemia opened this issue 4 years ago • 2 comments

L'ensemble des carto de l'appli doivent pouvoir afficher les zonages présent dans le ref_geo. Dans le contrôleur de couche de leaflet (layer control), on affichera les type de zonage présent dans la table ref_geo.bib_areas_types. Le code devra être fait dans le composant mapComponent: https://github.com/PnX-SI/GeoNature/blob/master/frontend/src/app/GN2CommonModule/map/map.component.ts On pourra lister dans un paramètre les types de zonage que l'on veut afficher pour ne pas lister toute la table. Les zonages de la table ref_geo.l_areas seront afficher dynamiquement au clique sur le type de zonage (utiliser le champs geojson de la table).

Veiller aux performances lorsqu'on demande d'afficher beaucoup de zonage (communes par exemple). N'afficher que les zonages de la boundingbox ou faire un st_simplify ?

TheoLechemia avatar Jul 10 '20 15:07 TheoLechemia

Oui il est important de les charger à la demande, et pas de toutes les pré-charger. On peut commencer par les afficher telles que présentes dans ref_geo.l_areas et voir ensuite si il faut les alléger. C'est ce que l'on fait dans Geotrek-admin, voir https://github.com/PnX-SI/GeoNature/issues/474 En lien aussi avec :

  • https://github.com/PnX-SI/GeoNature/issues/728
  • https://github.com/PnX-SI/GeoNature/issues/572

camillemonchicourt avatar Jul 11 '20 11:07 camillemonchicourt

Ce qui est fait dans Geotrek-admin :

image

La configuration des couleurs : https://github.com/GeotrekCE/Geotrek-admin/blob/master/geotrek/settings/base.py#L469

camillemonchicourt avatar May 20 '22 10:05 camillemonchicourt

Des travaux ont démarrés récemment autour de cette issue pour MNHN.

Ce commentaire a été écrit conformément aux échanges avec MNHN et l'équipe technique du Parc des Ecrins (@TheoLechemia , @camillemonchicourt , @bouttier).

Voici le spectre fonctionnel retenu pour ces travaux.

Description

Un besoin fort existe sur la possibilité d'afficher dans le composant de carte (map.component) des données supplémentaires. A ce besoin s'ajoute une demande de pouvoir afficher simultanément plusieurs données. Ce point n'est actuellement pas permis puisque seuls les BASEMAP sont affichées et uniquement un seul peut être visible à la fois.

Après échanges, les données à ajouter sont issues de sources variées. Ces données seront ajoutées dans la carte en tant que Overlay Leaflet dans le sélecteur de couches Leaflet.

Ces travaux se focaliseront sur les sources suivantes affichées ici de façon synthétique :

source Format hébergeur
locale vectorielle GeoJSON GeoNature DB
distant ou locale vectorielle GeoJSON Fichier GeoJSON via URL
distant vectorielle WFS Serveur carto OGC
distant image WMS Serveur carto OGC

Données locales

Les données locales sont contenues dans la table ref_geo.l_areas au sein de GeoNature. Il conviendra de les importer dans cette table de GeoNature pour pouvoir les utiliser sur la carte.

Données type fichier GeoJSON

Ce format correspond à un fichier GeoJSON accessible publiquement par une URL (e.g data.gouv.fr).

Données distantes type vector WFS

Ces données sont publiées au format GeoJSON via un service type OGC compatible avec Leaflet. Seul ce format sera lu pour ces travaux afin de faciliter les développements et rester homogène aux données contenus dans la table ref_geo.l_areas (exposées au format GeoJSON).

Données distantes type image WMS

Ces données sont publiées au format png ou jpeg via un service type OGC compatible avec Leaflet. Seul les WMS du type Leaflet tileLayer.WMS seront utilisables via ces travaux.

il pourra alors être possible d'utiliser plusieurs flux simultanément.

Paramétrage

Pour pouvoir ajouter des données sélectionnable dans la carte, il sera demandé de compléter un nouveau paramètre de configuration dans le fichier geonature_config.toml.

Ce nouveau paramètre REF_LAYERS contiendra une liste de couches à afficher.

# Configuration cartographique
[MAPCONFIG]
REF_LAYERS=[]

Pour une couche, et selon son type le paramétrage pourra différer :

  • Couche locale

REF_LAYERS=[{code="COM", label="Communes", activate=true, type="area"}]

image

Propriété Description
code Permet de récupérer les features avec le type_code de la table ref_geo.bib_areas_types correspondant
label Text afficher dans le selecteur Leaflet
type Type de la couche
activate boolean pour afficher la couche par défaut
  • Fichier GeoJSON locale ou distante

REF_LAYERS=[{code="COM", label="Communes", activate=true, url="https://fqdn/files/znief.geojson", type="geojson"}]

Propriété Description
code Permet de récupérer les features avec le type_code de la table ref_geo.bib_areas_types correspondant
label Text afficher dans le selecteur Leaflet
type Type de la couche
activate boolean pour afficher la couche par défaut
  • Couche WMS

REF_LAYERS=[{code="Parc_naturel_marin", style="sld_name" url="https://ws.carmencarto.fr/WMS/....", activate=true, label="Parc Naturel marin", type="wms"}]

Propriété Description
code Equivaleur de typeName dans un serveur cartographique
type Type de la couche
label Text afficher dans le selecteur Leaflet
activate boolean pour afficher la couche par défaut
style nom du SLD du WMS (optionnel)
  • Couche WMS

REF_LAYERS=[{code="Parc_naturel_marin", style="sld_name" type="wfs" url="https://ws.carmencarto.fr/WFS/....", activate=true, label="Parc Naturel marin"}]

Propriété Description
code Equivaleur de typeName dans un serveur cartographique
label Text afficher dans le selecteur Leaflet
type Type de la couche
activate boolean pour afficher la couche par défaut

Pour les WFS, un style par défaut sera appliqué. Il est envisageable que plusieurs styles soient disponibles par défaut et que la couleur uniquement puisse être paramétrable.

Contraintes techniques

Une contrainte forte existe sur les performances des types GeoJSON / vector car le chargement d'une couche détaillées (e.g contours des communes de France détaillés) impose un temps d'affichage rallongé.

Pour palier à ce problème, il est envisagé de ne charger les couches qu'à la demande d'affichage (à l'initialisation ou au clic sur la couche à afficher).

Il est également de la responsabilité des gestionnaires de données de n'utiliser que des couches simplifiées ou uniquement limitées aux zones d'intérêt (e.g ma région et non la France entière). Les filtres pouvant être utilisés lors de l'import dans GeoNature ou bien via un CQL_FILTER pour les flux type OGC.

Gaetanbrl avatar Nov 15 '22 09:11 Gaetanbrl

OK pour moi. Juste sur la forme, à voir si on nomme ce paramètre :

  • REF_LAYERS
  • AREA_LAYERS
  • MAP_OVERLAY_LAYERS
  • Autre ?

camillemonchicourt avatar Nov 15 '22 10:11 camillemonchicourt

Pour faciliter le paramétrage et éviter de faire des développements spécifique à chaque besoin selon le WMS ou WFS, j'ai modifié la configuration afin de :

  • Utiliser tous les params OGC
  • Pouvoir utiliser un style personnalisé sans développements dans GeoNature
  1. Exemples pour un WFS avec style custom :
, {
        code="COM_LYON",
        type="wfs",
        label="Communes du Grand Lyon",
        activate=false,
        style={
            color= "red",
            fill= true,
            fillOpacity= "0.2",
            weight= 2,
            fillColor= "blue"
        },
        url="https://download.data.grandlyon.com/wfs/grandlyon?SERVICE=WFS&VERSION=2.0.0&request=GetFeature&typename=adr_voie_lieu.adrcomgl&outputFormat=geojson&SRSNAME=EPSG:4326"
    }
  1. Exemple avec un WMS et params custom :
    {
        code="znieff1",
        type="wms",
        label="Znieff de Bretagne",
        activate=false,
        url="https://geobretagne.fr/geoserver/dreal_b/znieff1/wms",
        params={layers="znieff1", crs="EPSG:4326", service="wms", format="image/png", version="1.3.0", request="GetMap", transparent=true}
    }

A noter que le code ici ne sert que d'ID et non plus pour le paramètre layers du WMS. Ce fonctionnement correspond mieux à la documentation Leaflet et permet de prendre directement tous les paramètres de params :

image

Gaetanbrl avatar Nov 16 '22 09:11 Gaetanbrl

@TheoLechemia le chargement Async d'une données via le controleur se réalise sans surcharge en utilisant les méthode disponibles dans Leaflet via (code utilisé sur la branche jdev-org/GeoNature - issue-974) :

  1. l'ajout d'une couche vide dans le control.layers

this.createGeojson([], false, null, cfg?.style)

  1. l'ajout d'un event sur L.control.layers
    map.on('overlayadd', (overlay) => {
      // load only if WFS or JSON layer is empty
      this.mapService.loadOverlay(overlay);
    });

Gaetanbrl avatar Nov 16 '22 09:11 Gaetanbrl

Aperçu à date :

  • 1 WMS Znieff de Bretagne

https://geobretagne.fr/geoserver/dreal_b/znieff1/wms

  • 1 WFS - Communes du Grand Lyon data.gouv.fr

https://download.data.grandlyon.com/wfs/grandlyon?SERVICE=WFS&VERSION=2.0.0&request=GetFeature&typename=adr_voie_lieu.adrcomgl&outputFormat=geojson&SRSNAME=EPSG:4326

  • 1 fichier JSON hébergé sur un site distant https://gis.jdev.fr/mviewer/data/epci_simple.geojson

  • 2000 premières communes de la table ref_geo.l_areas local

ref_geo_map

Gaetanbrl avatar Nov 16 '22 11:11 Gaetanbrl

Super, ce qui manque certainement est d'avoir une légende dans la liste des couches pour savoir à quoi correspond chaque type d'objet affiché sur la carte.

camillemonchicourt avatar Nov 16 '22 13:11 camillemonchicourt

ok @camillemonchicourt je pensais que ce n'était pas souhaité étant donné qu'elle est déjà absente.

Sinon on peut reprendre ce type de légende :

https://codepen.io/haakseth/pen/KQbjdO

image

Gaetanbrl avatar Nov 16 '22 13:11 Gaetanbrl

Je le voyais biens dans le LayerControl natif comme c'est dans l'exemple GeoTrek que Camille a mis en début de ticket. à voir si ça ne rajoute pas du code custo. Sinon sur la carte ça peut le faire aussi

TheoLechemia avatar Nov 16 '22 15:11 TheoLechemia

Oui idéalement dans le sélecteur de couches. Pas trop emballé par l'idée d'ajouter un bloc de légende en plus sur la carte.

camillemonchicourt avatar Nov 16 '22 15:11 camillemonchicourt

Ah ben si, ca doit être faisable vu qu'on peut custom via un HTML le libellé de la layer. Donc on peut y mettre la couleur.

Gaetanbrl avatar Nov 16 '22 16:11 Gaetanbrl

à voir si ça ne rajoute pas du code custo

C'est bien ce qu'ont doit faire pour la légende dans le composant de gestion d'affichage des couches.

Après test, il est possible de modifier le label et créer une sorte de légende, mais au final c'est plus complexe pour les WMS (qui ont leur propre légende - que faire ?) et ca détruit le lien entre le chargement async que j'ai mis en place qui est basé sur le nom de la couche et le nom mis à disposition par le contrôleur Leaflet. Car Leaflet ne semble pas permettre facilement l'accès aux props de la couche pourtant présente dans le GeoJson (contraitement à OpenLayers...).

Donc techniquement, j'arrive plutôt en mode bricolage et j'opte d'avantage pour une légende à part entière (controleur géré indépendamment). Ca évite de surcharger le contrôleur de base qui permet de faire ce qui est attendu dans le scope principal de cette issue.

On pourra alors afficher / masquer le bloc au clic sur le bouton "Voir la légende". Mais là, c'est limite à proposer dans une autre issue...

Gaetanbrl avatar Nov 16 '22 17:11 Gaetanbrl

Après rajoute forcé d'un id dans la couche Leaflet on arrive à avoir une légende (sauf WMS pour raison d'UX) :

image

Gaetanbrl avatar Nov 22 '22 17:11 Gaetanbrl

Intégré dans la 2.11.0 et complété par https://github.com/PnX-SI/GeoNature/issues/2208

camillemonchicourt avatar Dec 21 '22 23:12 camillemonchicourt