GeoNature
GeoNature copied to clipboard
Carto: pouvoir afficher les zonages du ref_geo
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 ?
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
Ce qui est fait dans Geotrek-admin :
La configuration des couleurs : https://github.com/GeotrekCE/Geotrek-admin/blob/master/geotrek/settings/base.py#L469
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"}]
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.
OK pour moi. Juste sur la forme, à voir si on nomme ce paramètre :
- REF_LAYERS
- AREA_LAYERS
- MAP_OVERLAY_LAYERS
- Autre ?
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
- 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"
}
- 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 :
@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) :
- l'ajout d'une couche vide dans le control.layers
this.createGeojson([], false, null, cfg?.style)
- 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);
});
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
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.
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
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
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.
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.
à 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...
Après rajoute forcé d'un id dans la couche Leaflet on arrive à avoir une légende (sauf WMS pour raison d'UX) :
Intégré dans la 2.11.0 et complété par https://github.com/PnX-SI/GeoNature/issues/2208