Mehr

Merkblatt: Wie finde ich alle Geo-Json-Features an einer bestimmten Position?

Merkblatt: Wie finde ich alle Geo-Json-Features an einer bestimmten Position?


Für ein kleines Projekt verwenden wir Leaflet mit Geojson-Features anstelle von Openlayern, die von Geoservern unterstützt werden.

Wenn ich jetzt in die Karte klicke, möchte ich eine Liste aller Features an dieser Position sehen.

Ich verwende dasonEachFeatureum ein Popup an alle sichtbaren Features (in separaten Layern) anzuhängen, aber nicht ganz unerwartet, fängt nur das oberste Element dieses Klickereignis ab und zeigt das Popup an.

Ich habe in der Dokumentation gesucht und nach Beispielen gesucht, aber nichts brauchbares gefunden. Im openlayers+geoserver würde ich den WFS-Dienst verwenden, um alle Funktionen zu erhalten, und dann würde ich das zurückgegebene Ergebnis anzeigen.

Muss ich auf Geoserver umsteigen oder ist dies auch mit Geojson-Features (im Prospekt) möglich?


Sie können einfach in 2 Schritten vorgehen:

  1. Hängen Sie einen zusätzlichen "Klick"-Ereignis-Listener an Ihre Features an (oder direkt an die Gruppe, wenn es sich um eine L.GeoJSON oder eine L.FeatureGroup handelt).
  2. Verwenden Sie in diesem Listener-Callback das Mapbox Leaflet PIP (Point In Polygon)-Plugin, um alle Funktionen abzurufen, die die Latlng-Position des Klicks enthalten. Beachten Sie, dass PIP als 2. Argument ein L.geoJson erwartet.

Kein Geoserver nötig, alles clientseitig.

Wenn Sie möchten, dass die gefundenen Funktionen ihr Popup öffnen, durchlaufen Sie einfach das resultierende Array und verwenden Sieschicht.openPopup(). Sie benötigen jedoch einen Hack, damit mehrere Popups gleichzeitig geöffnet werden können.

groupGeoJson.on("click", function (event) { var latlng = event.latlng,layerArray = leafletPip.pointInLayer(latlng, groupGeoJson);layerArray.forEach(function (layer) {layer.openPopup();});} );

Demo: http://jsfiddle.net/ve2huzxw/51/

(Die obige Demo enthält den Hack von http://bl.ocks.org/mpmckenna8/9395643, um mehrere offene Popups zu ermöglichen)