Leaflet点击地图移动圆形并自动缩放的功能异常求解
问题根因
你的代码存在三个逻辑问题,对应你遇到的三个异常:
- 点击判断逻辑错误:你检测到
groupCircle已存在时,仅将图层组从地图移除,没有清空组内存储的旧圆形。下一次点击触发else分支时,会新增一个圆形到图层组,再把包含新旧两个圆形的图层组加回地图,就会出现新旧点位同时显示圆形的问题,第一次点击后第二次点击圆形消失也是因为你直接移除了整个图层组。 - 圆形尺寸不符合预期:你引用的Leaflet 0.7版本中,
L.Circle的半径参数单位为米,你传入的5000对应地表实际半径5公里,如果你需要的是不随地图缩放改变大小的固定像素圆形,应该使用L.CircleMarker,其半径单位为像素。 - 缺少自动缩放逻辑:你没有编写任何让地图适配圆形范围的代码,自然不会自动缩放到圆形位置。
修复后完整代码
<!DOCTYPE html> <html> <head> <title>Leaflet Polygons</title> <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css"/> <script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script> </head> <body> <div id="map" style="width: 900px; height: 580px"></div> <script> // 地图初始化配置 var mapOptions = { center: [16.506174, 80.648015], zoom: 11 } var groupCircle = L.featureGroup(); var map = new L.map('map', mapOptions); // 添加底图图层 var layer = new L.TileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'); map.addLayer(layer); // 初始化时就把圆形图层组加到地图,不用反复移除添加 map.addLayer(groupCircle); map.on("click", function(e){ // 先清空图层组内所有旧要素 groupCircle.clearLayers(); // 添加新圆形到图层组,需要固定像素大小就换成L.circleMarker,半径传像素值 L.circle(e.latlng, 5000).addTo(groupCircle); // 自动缩放到圆形所在范围 map.fitBounds(groupCircle.getBounds()); }) </script> </body> </html>
关键改动说明
- 初始化阶段就把
groupCircle图层组添加到地图,去掉点击时反复移除/添加整个图层组的逻辑,避免点击后圆形先消失的问题 - 每次点击事件触发时,先调用
clearLayers()清空图层组内的旧圆形,再添加新的圆形,避免旧要素残留导致多圆同时显示 - 新增圆形后调用
map.fitBounds(groupCircle.getBounds()),自动调整地图视野和缩放级别适配圆形范围 - 半径参数可以根据需求调整:如果需要圆形随地图缩放改变显示大小(地理范围固定)就保留
L.circle,半径传米为单位的数值;如果需要圆形显示大小固定(不随缩放变化)就替换为L.circleMarker,半径传像素为单位的数值。
内容的提问来源于stack exchange,提问作者Michael Grzesiek
相关产品推荐
相关产品推荐

