Aller au contenu principal

LgLeafletMap

LgLeafletMap affiche une carte Leaflet dans une application Lagoon. Le composant Blazor rend uniquement le conteneur ; toutes les interactions avec la carte, les couches, les marqueurs, les dessins, la géolocalisation, les contrôles de recherche et les itinéraires passent par l'objet LeafletMap fourni au paramètre Map.

<LgLeafletMap Map="@_map" CssClass="leaflet-map" />
  • Espace de noms : Lagoon.UI.Leaflet.Components
  • Hérite de : LgComponentBase
  • Package NuGet : Lagoon.UI.Leaflet
Module séparé

LgLeafletMap n'est pas dans le package principal Lagoon.UI. Ajoutez le module Lagoon.UI.Leaflet au projet client, puis référencez le script d'initialisation :

<script src="_content/Lagoon.UI.Leaflet/js/app-init.js"></script>

Ce script charge les ressources Leaflet embarquées : Leaflet, Leaflet Draw, Geocoder, Routing Machine, Overpass Layer et MarkerCluster, avec leurs feuilles de style.

Taille obligatoire

Le composant occupe 100% de son conteneur interne. La classe transmise par CssClass doit donc définir au moins une hauteur.

Démonstration​

Essayez ce composant dans le showcase Lagoon.

Installation / intégration​

  1. Ajoutez une référence au package ou au projet Lagoon.UI.Leaflet dans l'application cliente.
  2. Ajoutez le script _content/Lagoon.UI.Leaflet/js/app-init.js dans la page hôte de l'application.
  3. Importez les espaces de noms utilisés par la carte :
    • Lagoon.UI.Leaflet.Components
    • Lagoon.UI.Leaflet.Components.Models
  4. Si les tuiles, le routage ou Overpass appellent des services externes, autorisez leurs domaines dans la CSP de l'application.

Exemple pour des tuiles OpenStreetMap :

{
"CSP": {
"img-src-add": "https://a.tile.openstreetmap.org"
}
}

Les URL de tuiles OpenStreetMap, OSRM, MapBox ou Overpass sont des services externes : elles ne constituent pas un endpoint applicatif Lagoon.

Utilisation​

Carte simple avec tuiles et marqueurs​

LeafletDemoPage.razor
@inherits LgPage
@using Lagoon.UI.Leaflet.Components
@using Lagoon.UI.Leaflet.Components.Models

<LgLeafletMap Map="@_map" CssClass="leaflet-map" />

<LgButton Text="#LeafletPanToParis" OnClick="PanToParis" />
<LgButton Text="#LeafletLocateMe" OnClick="LocateUser" />

<style>
.leaflet-map {
height: 600px;
}
</style>
LeafletDemoPage.razor.cs
using System.Drawing;
using Lagoon.UI.Leaflet.Components;
using Lagoon.UI.Leaflet.Components.Models;

public partial class LeafletDemoPage : LgPage
{
// Instance pilotée par le composant ; elle centralise les couches et les appels JS Leaflet.
private LeafletMap _map;

// Coordonnées initiales affichées au premier rendu de la carte.
private readonly LatLng _initialCenter = new(46.227638f, 2.213749f);

protected override void OnInitialized()
{
_map = new LeafletMap(JS)
{
Center = _initialCenter,
Zoom = 5,
MinZoom = 3,
MaxZoom = 18,
};

// Attend que Leaflet soit créé côté JavaScript avant d'ajouter des couches.
_map.OnInitialized += InitializeMapLayers;
}

// Ajoute les tuiles et les marqueurs après l'initialisation réelle de la carte.
private void InitializeMapLayers()
{
TileLayer openStreetMap = new()
{
UrlTemplate = "https://a.tile.openstreetmap.org/{z}/{x}/{y}.png",
Attribution = "&copy; OpenStreetMap contributors",
};

_map.AddLayer(openStreetMap);
_map.AddBaseLayer(openStreetMap.Id, "OpenStreetMap");

Marker marker = new(new PointF(48.8566f, 2.3522f))
{
Tooltip = new Tooltip { Content = "#LeafletParisTooltip" },
Popup = new Popup { Content = "#LeafletParisPopup" },
};

_map.AddLayer(marker);
}

// Déplace la vue vers Paris avec une animation Leaflet.
private void PanToParis()
{
_map.PanTo(new PointF(48.8566f, 2.3522f), animate: true, duration: 1.5f);
}

// Demande la position navigateur ; le résultat arrive dans l'événement OnLocationFound.
private void LocateUser()
{
_map.Locate(setView: true, maxZoom: 16);
}
}

Dessin et GeoJSON​

AddDrawControl() ajoute la barre d'outils Leaflet Draw. Les dessins créés, modifiés ou supprimés sont remontés par OnDrawCreated, OnDrawEdited et OnDrawDeleted. ToGeoJSON(string layerId) sérialise une couche existante.

LeafletDrawPage.razor.cs
using Lagoon.UI.Leaflet.Components;
using Lagoon.UI.Leaflet.Components.Models;

public partial class LeafletDrawPage : LgPage
{
// Carte utilisée pour activer le dessin et récupérer les couches produites par l'utilisateur.
private LeafletMap _map;

// Dernier GeoJSON extrait d'une couche dessinée.
private string _lastGeoJson;

protected override void OnInitialized()
{
_map = new LeafletMap(JS)
{
Center = new LatLng(46.227638f, 2.213749f),
Zoom = 5,
};

// Les contrôles et événements de dessin ne sont disponibles qu'après le premier rendu Leaflet.
_map.OnInitialized += InitializeDrawTools;
}

// Active Leaflet Draw et abonne les événements de création, modification et suppression.
private void InitializeDrawTools()
{
_map.AddDrawControl();
_map.OnDrawCreated += OnDrawCreated;
_map.OnDrawEdited += OnDrawEdited;
_map.OnDrawDeleted += OnDrawDeleted;
}

// Conserve la nouvelle couche et extrait immédiatement sa représentation GeoJSON.
private void OnDrawCreated(LeafletMap sender, Layer createdLayer)
{
_lastGeoJson = sender.ToGeoJSON(createdLayer.Id);
}

// Parcourt les couches modifiées pour récupérer le dernier état GeoJSON.
private void OnDrawEdited(LeafletMap sender, List<Layer> editedLayers)
{
if (editedLayers.Count > 0)
{
_lastGeoJson = sender.ToGeoJSON(editedLayers[0].Id);
}
}

// Nettoie l'état local quand les couches dessinées sont supprimées.
private void OnDrawDeleted(LeafletMap sender, List<Layer> deletedLayers)
{
_lastGeoJson = null;
}
}

Recherche, itinéraires et Overpass​

  • AddSearchControl() ajoute le contrôle de recherche d'adresse.
  • AddOsrmRoutingControl(RoutingControlOptions) ajoute un itinéraire via OSRM.
  • AddMapBoxRoutingControl(string accessToken, RoutingControlOptions) ajoute un itinéraire MapBox.
  • AddOverPassLayer(string query, string endPoint = "https://overpass-api.de/api/") ajoute le résultat d'une requête Overpass QL.
  • GetDataFromOverpassAPIAsync(string query) renvoie le résultat Overpass au format JSON.
LeafletRoutingPage.razor.cs
using Lagoon.UI.Leaflet.Components.Models;

public partial class LeafletRoutingPage : LgPage
{
// Carte initialisée ailleurs dans la page ; les méthodes ci-dessous ajoutent des contrôles externes.
private LeafletMap _map;

// Ajoute un calcul d'itinéraire OSRM entre Rennes et Nantes.
private void AddOsrmRoutingControl()
{
_map.AddOsrmRoutingControl(new RoutingControlOptions
{
Collapsible = true,
Waypoints = new[]
{
new LatLng(48.117266f, -1.6777926f),
new LatLng(47.218371f, -1.553621f),
},
Router = new Router
{
ServiceUrl = "https://router.project-osrm.org/route/v1",
Profile = "driving",
},
});
}

// Ajoute les hôpitaux proches d'Aix-en-Provence depuis Overpass.
private void AddHospitalsLayer()
{
_map.AddOverPassLayer("[out:json][timeout:25];nwr(around:10000,43.529742,5.447427)[\"amenity\"=\"hospital\"];out center;");
}
}

Clusters de marqueurs​

MarkerClusterGroup est une couche Leaflet gérée par le même composant. Elle regroupe des Marker, peut recevoir des marqueurs dynamiquement et expose des événements de cluster.

LeafletClusterPage.razor.cs
using System.Drawing;
using Lagoon.UI.Leaflet.Components.Models;

public partial class LeafletClusterPage : LgPage
{
// Groupe de clusters conservé pour ajouter ou retirer des marqueurs après le rendu.
private MarkerClusterGroup _clusterGroup;

// Ajoute le groupe de clusters à la carte après l'initialisation Leaflet.
private void AddClusterGroup(LeafletMap map)
{
_clusterGroup = new MarkerClusterGroup
{
Options = new MarkerClusterOptions
{
IncludeClusterBoundsInEvents = true,
IncludeTargetZoomInEvents = true,
IconPreset = ClusterIconPreset.SmallMediumLarge,
},
};

_clusterGroup.Markers.Add(new Marker(new PointF(48.8566f, 2.3522f))
{
Tooltip = new Tooltip { Content = "#LeafletParisTooltip" },
});

_clusterGroup.OnClusterClick += OnClusterClick;
map.AddLayer(_clusterGroup);
}

// Réagit au clic sur un cluster ; ChildCount vient du plugin MarkerCluster.
private void OnClusterClick(MarkerClusterGroup sender, MarkerClusterGroup.ClusterEventArgs e)
{
ShowInformation("#LeafletClusterClicked");
}

// Ajoute un marqueur au groupe déjà attaché à la carte.
private void AddMarkerToCluster()
{
Marker marker = new(new PointF(45.7640f, 4.8357f))
{
Tooltip = new Tooltip { Content = "#LeafletLyonTooltip" },
};

_clusterGroup.AddMarker(JS, marker);
}
}

API du composant​

PropriétéTypeDéfautDescription
CssClassstringnullClasse CSS ajoutée au conteneur externe du composant.
MapLeafletMapnullInstance utilisée pour créer la carte et piloter Leaflet.

Aucun événement n'est exposé directement par LgLeafletMap. Les événements sont portés par LeafletMap et par les couches.

Objet LeafletMap​

Propriétés​

PropriétéTypeDéfautDescription
CenterLatLngnew LatLng()Centre géographique initial.
Zoomfloat0Zoom initial.
MinZoomfloat?nullZoom minimal autorisé.
MaxZoomfloat?nullZoom maximal autorisé.
MaxBoundsLatLngBoundnullLimites géographiques de navigation.
ZoomControlbooltrueIndique si le contrôle de zoom Leaflet est ajouté.
IdstringgénéréIdentifiant technique utilisé par l'interopérabilité JavaScript.

Méthodes principales​

MéthodeDescription
AddLayer(Layer layer)Ajoute une couche à la carte après l'initialisation.
RemoveLayer(Layer layer)Retire une couche existante.
GetLayers()Renvoie les couches actuellement connues côté .NET.
FitBounds(PointF corner1, PointF corner2, PointF? padding = null, float? maxZoom = null)Ajuste la vue pour contenir deux coins géographiques.
PanTo(PointF position, bool animate = false, float duration = 0.25f, float easeLinearity = 0.25f, bool noMoveStart = false)Déplace le centre de la carte.
GetCenter()Lit le centre courant depuis Leaflet.
GetZoom()Lit le zoom courant depuis Leaflet.
ZoomIn(MouseEventArgs e)Augmente le zoom.
ZoomOutAsync(MouseEventArgs e)Diminue le zoom.
Locate(...)Lance la géolocalisation navigateur.
StopLocate()Arrête la géolocalisation en mode suivi.
AddDrawControl()Ajoute la barre d'outils de dessin.
AddSearchControl()Ajoute le contrôle de recherche.
AddOsrmRoutingControl(RoutingControlOptions routingControlOptions)Ajoute un contrôle de routage OSRM.
AddMapBoxRoutingControl(string accessToken, RoutingControlOptions routingControlOptions)Ajoute un contrôle de routage MapBox.
ToGeoJSON(string layerId)Renvoie la représentation GeoJSON d'une couche.
SetMaxBounds(LatLngBound bounds)Définit les limites de navigation.
AddBaseLayer(string layerId, string name)Ajoute une couche de base dans le sélecteur de couches.
AddOverlay(string layerId, string name)Ajoute une superposition dans le sélecteur de couches.
AddOverPassLayer(string query, string endPoint = "https://overpass-api.de/api/")Ajoute une couche issue d'Overpass QL.
GetDataFromOverpassAPIAsync(string query)Appelle Overpass et renvoie le JSON brut.

Événements de carte​

ÉvénementTypeDescription
OnInitializedActionDéclenché après le premier rendu et la création de la carte côté JavaScript.
OnZoomLevelsChangeMapEventHandlerDéclenché lorsque les niveaux de zoom changent.
OnResizeMapResizeEventHandlerDéclenché lors du redimensionnement de la carte.
OnUnloadMapEventHandlerDéclenché lors du déchargement de la carte.
OnViewResetMapEventHandlerDéclenché lors de la réinitialisation de la vue.
OnLoadMapEventHandlerDéclenché lorsque la carte est chargée.
OnZoomStartMapEventHandlerDéclenché au début d'un zoom.
OnMoveStartMapEventHandlerDéclenché au début d'un déplacement.
OnZoomMapEventHandlerDéclenché pendant un zoom.
OnMoveMapEventHandlerDéclenché pendant un déplacement.
OnZoomEndMapEventHandlerDéclenché à la fin d'un zoom.
OnMoveEndMapEventHandlerDéclenché à la fin d'un déplacement.
OnMouseMoveMouseEventHandlerDéclenché lors du déplacement de la souris sur la carte.
OnKeyPressMapEventHandlerDéclenché lors d'une touche produisant un caractère.
OnKeyDownMapEventHandlerDéclenché lors de l'appui sur une touche.
OnKeyUpMapEventHandlerDéclenché lors du relâchement d'une touche.
OnPreClickMouseEventHandlerDéclenché avant le clic Leaflet.
OnClickMouseEventHandlerDéclenché lors d'un clic sur la carte.
OnDblClickMouseEventHandlerDéclenché lors d'un double-clic.
OnMouseDownMouseEventHandlerDéclenché lors de l'appui souris.
OnMouseUpMouseEventHandlerDéclenché lors du relâchement souris.
OnMouseOverMouseEventHandlerDéclenché lorsque la souris entre dans la carte.
OnMouseOutMouseEventHandlerDéclenché lorsque la souris quitte la carte.
OnContextMenuMouseEventHandlerDéclenché lors du menu contextuel Leaflet.
OnLocationFoundLocationEventHandlerDéclenché lorsque la géolocalisation réussit.
OnDrawCreatedDrawCreatedEventHandlerDéclenché lorsqu'une couche est dessinée.
OnDrawEditedDrawEditedEventHandlerDéclenché lorsqu'une ou plusieurs couches sont modifiées.
OnDrawDeletedDrawDeletedEventHandlerDéclenché lorsqu'une ou plusieurs couches sont supprimées.

Couches prises en charge​

AddLayer accepte les types suivants :

CoucheUsage
TileLayerTuiles raster via UrlTemplate, attribution et bornes de zoom.
MbTilesLayerTuiles MBTiles.
ShapefileLayerDonnées Shapefile.
MarkerMarqueur ponctuel avec icône, popup et tooltip.
RectangleRectangle vectoriel.
CircleCercle vectoriel avec centre et rayon.
PolygonPolygone vectoriel.
PolylineLigne vectorielle.
ImageLayerImage géoréférencée.
GeoJsonDataLayerCouche créée depuis une chaîne GeoJSON.
MarkerClusterGroupGroupe de marqueurs clusterisés.

Les couches héritent de Layer, qui fournit Id, Pane, Attribution, Tooltip, Popup et les événements OnAdd, OnRemove, OnPopupOpen, OnPopupClose, OnTooltipOpen, OnTooltipClose. Les couches interactives héritent aussi de InteractiveLayer, qui fournit IsInteractive, IsBubblingMouseEvents et les événements souris usuels.

Options de routage​

PropriétéTypeDéfautDescription
RoutingControlOptions.WaypointsLatLng[]nullPoints de passage initiaux.
RoutingControlOptions.RouterRouternew Router()Routeur utilisé pour calculer les itinéraires.
RoutingControlOptions.Collapsiblebool?nullAffiche ou non le bouton de repli du contrôle.
RoutingControlOptions.ShowAlternativesboolfalseAffiche les itinéraires alternatifs lorsqu'ils existent.
Router.ServiceUrlstringhttps://router.project-osrm.org/route/v1URL du service de routage.
Router.Timeoutfloat30000Délai maximal du calcul d'itinéraire en millisecondes.
Router.ProfilestringdrivingProfil OSRM utilisé.
Router.PolylinePrecisionfloat5Précision de décodage des polylignes.
Router.UseHintsboolfalseIndique si les hints sont envoyés au service.

Clusters​

Options​

PropriétéTypeDéfautDescription
ShowCoverageOnHoverbooltrueAffiche le polygone de couverture au survol.
ZoomToBoundsOnClickbooltrueZoome sur les limites du cluster au clic.
SpiderfyOnMaxZoombooltrueDéplie le cluster au zoom maximal.
MaxClusterRadiusint?nullRayon maximal d'un cluster.
MaxClusterRadiusFunctionstringnullNom d'une fonction JavaScript globale calculant le rayon.
IconCreateFunctionstringnullNom d'une fonction JavaScript globale créant l'icône.
IconPresetClusterIconPresetNonePreset d'icône intégré.
CustomIconsList<ClusterIconRange>nullPlages personnalisées pour générer les icônes.
PolygonOptionsClusterPolygonOptionsnullStyle du polygone de couverture.
DisableClusteringAtZoomint?nullZoom à partir duquel les marqueurs ne sont plus groupés.
SingleMarkerModebool?nullAffiche les marqueurs isolés avec une icône de cluster.
SpiderfyOnEveryZoombool?nullConserve l'état déplié pendant les zooms.
SpiderfyDistanceMultiplierdouble?nullMultiplie l'écart entre les marqueurs dépliés.
RemoveOutsideVisibleBoundsbool?nullRetire les clusters hors vue pour les performances.
Animatebool?nullAnime les transitions de cluster.
AnimateAddingMarkersbool?nullAnime l'ajout individuel de marqueurs.
ChunkedLoadingbool?nullActive le chargement progressif des marqueurs.
ChunkIntervalint?nullDurée d'un chunk en millisecondes.
ChunkDelayint?nullPause entre deux chunks en millisecondes.
SpiderLegPolylineOptionsClusterSpiderLegPolylineOptionsnullStyle des jambes de spiderfy.
SpiderfyShapePositionsFunctionstringnullNom d'une fonction JavaScript globale pour la position spiderfy.
IncludeClusterBoundsInEventsboolfalseAjoute les limites du cluster aux arguments d'événement.
IncludeChildMarkerIdsInEventsboolfalseAjoute les identifiants des marqueurs enfants aux arguments d'événement.
IncludeTargetZoomInEventsboolfalseAjoute le zoom cible aux arguments d'événement.

Méthodes et événements​

MembreTypeDescription
MarkersList<Marker>Marqueurs contenus dans le groupe.
OptionsMarkerClusterOptionsOptions du plugin MarkerCluster.
AddMarker(IJSInProcessRuntime jsRuntime, Marker marker)méthodeAjoute un marqueur dynamiquement.
RemoveMarker(IJSInProcessRuntime jsRuntime, string markerId)méthodeRetire un marqueur dynamiquement.
Clear(IJSInProcessRuntime jsRuntime)méthodeVide le groupe.
OnChunkProgressévénementDéclenché pendant le chargement progressif.
OnClusterClickévénementDéclenché lors du clic sur un cluster.
OnClusterMouseOverévénementDéclenché quand la souris entre dans un cluster.
OnClusterMouseOutévénementDéclenché quand la souris quitte un cluster.
OnClusterAnimationEndévénementDéclenché à la fin d'une animation de cluster.
OnClusterSpiderfiedévénementDéclenché après le dépliage d'un cluster.
OnClusterUnspiderfiedévénementDéclenché après le repliage d'un cluster.

Énumérations associées​

ClusterIconPreset​

ClusterIconPreset n'est pas décorée avec [Flags].

ValeurDescription
NoneAucun preset : le comportement par défaut du plugin ou IconCreateFunction est utilisé.
SmallMediumLargeStyle standard basé sur des seuils petit, moyen et grand.

Interopérabilité JavaScript​

LgLeafletMap crée une référence .NET vers l'objet Map au premier rendu et appelle window.leafletBlazor.create. Les actions suivantes passent ensuite par LgLeafletInterops : création de la carte, ajout ou suppression de couches, zoom, déplacement, géolocalisation, dessin, recherche, routage, Overpass et clusters. Les callbacks JavaScript appellent les méthodes [JSInvokable] des objets .NET pour déclencher les événements listés ci-dessus.