Leafletjs地图元素事件触发查找坐标点并打开popup
应用场景非常多,比如airbnb上面的民宿列表,点击就能在地图上显示坐标,本文就该功能用leaflet来实现。
示例一 jQuery
最新示例代码:
多个标注
<!-- the map div holds the map --> <div id="map"></div> <div id="stations"> <!-- the stations div holds a list of the stations marked on the map --> <b style="color:red; text-decoration: underline;">Net #886</b><br><a id='marker_1' href='#'>N0SAX</a><br><a id='marker_2' href='#'>KF0ED</a><br><a id='marker_3' href='#'>KD0ZMG</a><br><a id='marker_4' href='#'>KC0NOX</a><br><a id='marker_5' href='#'>AA0JA</a><br> <a id='marker_6' href='#'>AC0OK</a><br><a id='marker_7' href='#'>KG6TUB</a><br><a id='marker_9' href='#'>NCMO</a><br><a id='marker_10' href='#'>AC0TQ</a><br><a id='marker_11' href='#'>KE0MGD</a><br><a id='marker_12' href='#'>KE0ELB</a><br><a id='marker_13' href='#'>W0WHH</a><br> <a id='marker_14' href='#'>AD0YN</a><br><a id='marker_15' href='#'>KE0RTA</a><br> </div> <script> var map = null; var zoomLevel = 10; var markers = []; var fg = new L.featureGroup(); var bounds = new L.latLngBounds; // starting point for the map and a zoom level of 20 var map = L.map('map').setView([39.202903, -94.602907], zoomLevel); L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: zoomLevel, attribution: 'Map data © <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, ' + '<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' + 'Imagery © <a href="https://www.mapbox.com/">Mapbox</a>', id: 'mapbox.streets' }).addTo(map); fg.addTo(map); $(document).ready(function() { function netStationLocations(e) { // This is the markers array // var markers = []; var N0SAX = L.marker([39.3762884, -93.496261], { title: "marker_1" }).addTo(fg).bindPopup("1<br><b>#233</b><br>N0SAX<br>Jack Vantrump<br>Carroll Co., MO Dist: A<br>39.3762884, -93.496261<br>EM39GJ"); markers.push(N0SAX); var KF0ED = L.marker([39.7898224, -93.558050], { title: "marker_2" }).addTo(fg).bindPopup("2<br><b>#245</b><br>KF0ED<br>Glenn O connor<br> Livingston Co., MO Dist: H<br>39.7898224, -93.558050<br>EM39FS"); markers.push(KF0ED); var KD0ZMG = L.marker([39.010151, -94.579769], { title: "marker_3" }).addTo(fg).bindPopup("3<br><b>#264</b><br>KD0ZMG<br> THEARL Speck<br>Livingston Co., MO Dist: H<br>39.010151, -94.579769<br>EM29RA"); markers.push(KD0ZMG); var KC0NOX = L.marker([39.8132645, -93.558613], { title: "marker_4" }).addTo(fg).bindPopup("4<br><b>#387</b><br>KC0NOX<br>Joe Dietrick<br>Livingston Co., MO Dist: H<br>39.8132645, -93.558613<br>EM39FT"); markers.push(KC0NOX); var AA0JA = L.marker([39.593217, -93.788696], { title: "marker_5" }).addTo(fg).bindPopup("5<br><b>#389</b><br>AA0JA<br>Bill Whitlock<br>Caldwell Co., MO Dist: H<br>39.593217, -93.788696<br>EM39co"); markers.push(AA0JA); var AC0OK = L.marker([40.1697444, -93.093104], { title: "marker_6" }).addTo(fg).bindPopup("6<br><b>#414</b><br>AC0OK<br>Sam Cook<br>Sullivan Co., MO Dist: B<br>40.1697444, -93.093104<br>EN30KE"); markers.push(AC0OK); var KG6TUB = L.marker([39.7973405, -93.551737], { title: "marker_7" }).addTo(fg).bindPopup("7<br><b>#610</b><br>KG6TUB<br>Doris Hoch<br>Livingston Co., MO Dist: H<br>39.7973405, -93.551737<br>EM39FT"); markers.push(KG6TUB); var NCMO = L.marker([40.0706749, -93.611323], { title: "marker_9" }).addTo(fg).bindPopup("9<br><b>#614</b><br>NCMO<br>Glendale (KB0RPJ) Briggs<br>Grundy Co., MO Dist: <br>40.0706749, -93.611323<br>EN30EB"); markers.push(NCMO); var AC0TQ = L.marker([39.7973405, -93.551737], { title: "marker_10" }).addTo(fg).bindPopup("10<br><b>#616</b><br>AC0TQ<br>Ken Hoch<br>Livingston Co., MO Dist: H<br>39.7973405, -93.551737<br>EM39FT"); markers.push(AC0TQ); var KE0MGD = L.marker([39.8157137, -94.020960], { title: "marker_11" }).addTo(fg).bindPopup("11<br><b>#621</b><br>KE0MGD<br>Carl Russell<br>Daviess Co., MO Dist: H<br>39.8157137, -94.020960<br>EM29XT"); markers.push(KE0MGD); var KE0ELB = L.marker([40.2363229, -93.153805], { title: "marker_12" }).addTo(fg).bindPopup("12<br><b>#623</b><br>KE0ELB<br>Kris Good<br>Sullivan Co., MO Dist: B<br>40.2363229, -93.153805<br>EN30KF"); markers.push(KE0ELB); var W0WHH = L.marker([40.1931446, -93.667155], { title: "marker_13" }).addTo(fg).bindPopup("13<br><b>#624</b><br>W0WHH<br>Bill Hein<br>Grundy Co., MO Dist: H<br>40.1931446, -93.667155<br>EN30DE"); markers.push(W0WHH); var AD0YN = L.marker([39.659816, -93.398354], { title: "marker_14" }).addTo(fg).bindPopup("14<br><b>#644</b><br>AD0YN<br>Charles STIRLING<br>Livingston Co., MO Dist: H<br>39.659816, -93.398354<br>EM39HP"); markers.push(AD0YN); var KE0RTA = L.marker([40.0722144, -93.578824], { title: "marker_15" }).addTo(fg).bindPopup("15<br><b>#673</b><br>KE0RTA<br>Vic Markell<br>Grundy Co., MO Dist: H<br>40.0722144, -93.578824<br>EN30FB"); markers.push(KE0RTA); fg.eachLayer(function(layer) { bounds.extend(layer.getLatLng()); }); // Set up to show markers popup function markerFunction(id) { for (var i in markers) { var markerID = markers[i].options.title; if (markerID == id) { markers[i].openPopup(); }; } // end of for loop } // end markerFunction // JQuery call to display the popup from the marker list $("a").click(function() { markerFunction($(this)[0].id); }); } // End of the netStationLocations function // In case some errors pop up function onLocationError(e) { alert(e.message); } // map.on('locationfound', netStationLocations); // map.on('locationerror', onLocationError); //map.locate({setView: true, maxZoom: zoomLevel }); netStationLocations(); map.fitBounds(bounds, { padding: [1.5, 1.5] }); // Zoom to fit all markers // var fg = new L.featureGroup([[39.3762884,-93.496261],[39.7898224,-93.558050],[39.010151,-94.579769],[39.8132645,-93.558613],[39.593217,-93.788696],[40.1697444,-93.093104],[39.7973405,-93.551737],[40.0706749,-93.611323],[39.7973405,-93.551737],[39.8157137,-94.020960],[40.2363229,-93.153805],[40.1931446,-93.667155],[39.659816,-93.398354],[40.0722144,-93.578824]]); }); </script>
单标注
html
<div id="map" style="width:500px;height:400px;"></div> <a id="marker_1" href="#">Marker 1</a><br>
js
var map = L.map('map').setView([51.495, -0.09], 15); var osmUrl = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'; var osmLayer = new L.TileLayer(osmUrl, { maxZoom: 19, attribution: 'Map data © OpenStreetMap contributors' }); map.addLayer(osmLayer); var markers = []; var marker1 = L.marker([51.497, -0.09],{title:"marker_1"}).addTo(map).bindPopup("Marker 1"); markers.push(marker1); marker1.on('mouseover',function(ev) { marker1.openPopup(); }); function markerFunction(id){ for (var i in markers){ var markerID = markers[i].options.title; if (markerID == id){ markers[i].openPopup(); }; } } $("a").click(function(){ markerFunction($(this)[0].id); });
示例二 React
import React, { useEffect, useState } from "react"; import { MapContainer, TileLayer, Marker, Popup } from "react-leaflet"; import "leaflet/dist/leaflet.css"; import { Icon } from "leaflet"; import FakeData from "../data"; import { Div, PopContainer } from "./mapStyle"; import markerIcon from "../public/markerIcon.png"; const MarkerIcon = new Icon({ iconUrl: markerIcon, iconSize: [50, 50] }); function MapBox({ cardItem }) { const [nurse, setNurse] = useState(null); const bull = <span>•</span>; const [map, setMap] = useState(null); useEffect(() => { if (!cardItem || !map) return; const { coordonatelat, coordonatelng } = cardItem; // map.setView([coordonatelat, coordonatelng], 13); map.flyTo([coordonatelat, coordonatelng]); }, [cardItem, map]); return ( <Div> <MapContainer center={[50.6365654, 3.0635282]} zoom={13} scrollWheelZoom={false} whenCreated={setMap} > <TileLayer attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' url="https://{s}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png" /> {FakeData.map((data) => ( <Marker key={data.id} icon={MarkerIcon} position={[data.coordonatelat, data.coordonatelng]} onmouseover={() => setNurse(data)} /> ))} {nurse && ( <Popup position={[nurse.coordonatelat, nurse.coordonatelng]} onClose={() => { setNurse(null); }} closeButton={false} > <PopContainer> <h2> {bull} {nurse.first_name} {nurse.last_name} {bull} </h2> <h3>{nurse.job}</h3> <p> {" "} {nurse.address} <br /> {nurse.phone_number} </p> </PopContainer> </Popup> )} </MapContainer> </Div> ); } export default MapBox;