Afficher une carte avec le Plugin Leaflet
Présentation
Le Plugin Leaflet apporte un socle de base afin d'afficher des cartes au sein d'une application Lutèce :
- librairie leaflet (core JavaScript et bibliothèque CSS)
- assortiment d'icônes pour afficher des marqueurs
- interface REST pour l'affichage de popup
- interface de fourniture d'icônes pour les marqueurs
Ces deux dernières interfaces sont à implémenter dans le code serveur de votre plugin pour retourner un contenu (icônes et popup HTML) spécifique. Dans sa version actuelle, le plugin leaflet ne propose pas de template incluant du code HTML/JavaScript pour l'affichage des cartes en elles-mêmes. Il revient à l'intégrateur d'inclure le code nécessaire dans une page en fonction des besoins cartographiques.
Le code Source de ce plugin est disponible ici .
Inclusion du plugin
Inclure le plugin-leaflet dans le pom.xml du plugin ou module en spécifiant la dernière version à jour :
<dependency> <groupId>fr.paris.lutece.plugins</groupId> <artifactId>plugin-leaflet</artifactId> <version>1.0.1-SNAPSHOT</version> <type>lutece-plugin</type> </dependency>
Fournisseur de popup
Les popups sont des fenêtres affichant un contenu contextuel lors du clic sur un objet de la carte. Le plugin leaflet fournit une interface de webservice REST permettant de retourner le contenu d'une popup.
Implémentation
Créer la classe Provider implémentant l'interface IPopupContentProvider et sa méthode getPopup().
import fr.paris.lutece.plugins.leaflet.rest.service.IPopupContentProvider; public class MyLutecePluginPopupContentProvider implements IPopupContentProvider { // Templates private static final String TEMPLATE_MYLUTECEPLUGIN_POPUP = "/skin/plugins/myluteceplugin/leaflet/popup.html"; // Markers private static final String MARK_MYLUTECEPLUGIN_ENTITY = "entity"; public String getPopup( HttpServletRequest request, String strIdEntity, String strCode ) { //add your code here to build the HTML content of the popup int nId = Integer.parseInt( strIdEntity ); MyLutecPluginEntity entity = MyLutecePluginService.LoadEntity(nId); Map<String, Object> model = new HashMap<String, Object>(); model.put( MARK_MYLUTECEPLUGIN_ENTITY, entity ); HtmlTemplate t = AppTemplateService.getTemplate( TEMPLATE_MYLUTECEPLUGIN_POPUP, request.getLocale(), model ); return t.getHtml(); } }
Déclaration
Ajouter les lignes suivantes dans le fichier WEB-INF/conf/plugins/<myLutecePlugin>_context.xml pour référencer le Provider :
<bean id="leaflet-icon-provider-myluteceplugin" class="fr.paris.lutece.plugins.myluteceplugin.leaflet.service.mylutecepluginPopupContentProvider" />
Le code java de la page affichant la carte peut alors appeler fr.paris.lutece.plugins.leaflet.service.IconService.getIcon( "leaflet-icon-provider-myluteceplugin", strIconKey ).
Ajouter une carte leaflet sur une page Lutèce
Exemple simple d'ajout d'une carte leaflet sur une page. Ici la projection par défault est utilisée (EPSG:3857 en lat long).
- Importer la librairie :
<link rel="stylesheet" type="text/css" href="js/plugins/leaflet/leaflet/leaflet.css"> <script type="text/javascript" src="js/plugins/leaflet/leaflet/leaflet.js"></script>
- Créer une carte, une vue et une couche pour les marqueurs :
var map = L.map('map_address').setView([48.85632, 2.33272], 12); var markers_layer = L.featureGroup().addTo(map); // create the tile layer with correct attribution var osmUrl='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'; var osmAttrib='Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors'; var osm = new L.TileLayer(osmUrl, {minZoom: 8, maxZoom: 16, attribution: osmAttrib}).addTo(map);
- Ajouter le marqueur, spécifier son icône et ajouter l'appel Ajax au service de popup lors d'un clic sur ce marqueur :
//Base rest Url for plugin-leaflet popup provider var popupProviderUrl = "rest/leaflet/popup/"; // Custom provider name that implements plugin-leaflet popup provider interface var popupProviderName = "myluteceplugin"; // Id parameter to retrieve an object var formId = ${appointmentform.idForm}; // code parameter ( not used with this adpater, let's set a dummy value) var code = "code"; //Full popup url var popupUrl = popupProviderUrl+popupProviderName+"/"+formId+"/"+code; //creating the icon from the provided path var myIcon = L.icon({ iconUrl: ${MyPluginIcon} }); markers_layer.clearLayers(); var marker = L.marker([poi.y, poi.x], {icon: myIcon}).addTo(markers_layer); marker.bindPopup("Chargement..."); marker.on('click', function(e) { var popup = e.target.getPopup(); $.get(popupUrl).done(function(data) { popup.setContent(data); popup.update(); }); }); map.fitBounds(markers_layer.getBounds());
Exemple :
Pour aller plus loin
La documentation leaflet en ligne permet d'aller plus loin en terme de fonctionnalités géographiques :
- Autres sources et formats pour les couches de fonds de plan et les couches métiers de la carte
- Affichage de multiples objets géolocalisés à partir d'une source Geojson
- Utiliser les propriétés des données de la carte pour modifier les marqueurs (paramétrage des icônes, couleurs...) en fonction des valeurs
- Utiliser les propriétés des données de la carte pour modifier les popups (passer en paramètre une valeur pour modifier la réponse du service fournisseur de popup)
- ...
La librairie proj4js également fournie avec le plugin-leaflet facilite les calculs de conversion entre les référentiels de coordonnées géographiques ( conversion d'une projection à une autre).