Leaflet 下拉选择数值时实时修改地图圆形半径的实现问题
解决方案
不需要模拟回车事件,直接监听下拉选择框的值变化事件即可实现需求,逻辑更简单稳定。你当前的实现存在两个核心问题:
- 下拉选择框没有绑定值变化的监听事件,仅错误绑定了点击事件且触发了无意义的表单提交
- 半径更新逻辑强依赖搜索触发的
geosearch/showlocation事件,没有独立的半径更新逻辑,且每次重建圆形图层的操作可优化
修改说明:
- 新增变量存储最后一次搜索到的定位坐标,避免下拉选值时无坐标可用
- 给下拉选择框绑定
change事件,选中新值时直接更新圆形半径 - 复用现有圆形图层,使用Leaflet内置的
setRadius方法更新半径,不需要销毁重建 - 删除无效的表单提交逻辑,修复无jQuery依赖导致的$未定义报错
完整可运行代码:
<html> <head> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.4/dist/leaflet.css" /> <link rel="stylesheet" href="https://unpkg.com/leaflet-geosearch@3.5.0/dist/geosearch.css" /> <script src="https://unpkg.com/leaflet@1.3.4/dist/leaflet.js"></script> <script src="https://unpkg.com/leaflet-geosearch@3.5.0/dist/geosearch.umd.js"></script> <script src="https://unpkg.com/leaflet-control-custom@1.0.0/Leaflet.Control.Custom.js"></script> </head> <body> <div id="mapid" style="width: 1920px; height: 1018px;"> <script> const carte = L.tileLayer('https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', { minZoom: 1, maxZoom: 18 }); const map = L.map('mapid', { layers: [carte], attributionControl: false, drawControl: true }).setView([46.73881, -1.10074], 6); const geocodageAdresse = new GeoSearch.GeoSearchControl({ provider: new GeoSearch.OpenStreetMapProvider(), }); map.addControl(geocodageAdresse); L.control.custom({ position: 'topleft', content: '<p>Circle size: ' + '<select id="dist">' + '<option value="0">0Km</option>' + '<option value="5000">5Km</option>' + '<option value="10000">10Km</option>' + '</select></p>', }).addTo(map); map.on("geosearch/showlocation", function (e) { radiusGPS(e); }); var geoCircle = L.circle(); // 存储最后一次搜索到的定位信息 let lastSearchedLocation = null; function radiusGPS(e) { lastSearchedLocation = e.location; var value = document.getElementById('dist').value; if (map.hasLayer(geoCircle)) { // 已存在圆形图层直接更新坐标和半径 geoCircle.setLatLng([e.location.y.toFixed(2), e.location.x.toFixed(2)]) geoCircle.setRadius(value) } else { geoCircle = L.circle([e.location.y.toFixed(2), e.location.x.toFixed(2)], { radius: value }).addTo(map); } } // 监听下拉框值变化,直接更新圆形半径 document.addEventListener('change', function(e) { if (e.target.id === 'dist' && lastSearchedLocation) { geoCircle.setRadius(e.target.value) } }) </script> </body> </html>
内容的提问来源于stack exchange,提问作者ThibaultP
相关产品推荐
相关产品推荐

