传单自定义标记图标缩放缩放
Leaflet custom marker icon scale to zoom
我使用 Leaflet 绘制了一个 OpenStreetMap 并附加了一个自定义图标标记
var mymap = L.map('mapid').setView([x, y], 13);
L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}', {
attribution: 'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://mapbox.com">Mapbox</a>',
maxZoom: 18,
id: ID,
accessToken: accessToken
}).addTo(mymap);
var busIcon = new L.Icon({
iconUrl: 'images/marker/bus.png',
// shadowUrl: 'images/leaflet/marker-shadow.png',
iconSize: [12, 12],
iconAnchor: [12, 41],
popupAnchor: [1, -34],
// shadowSize: [41, 41]
});
var marker = L.marker([x, y],{icon:busIcon}).addTo(mymap);
mymap.on('zoomed', function() {
var currentZoom = mymap.getZoom();
busIcon = new L.Icon({
iconUrl: 'images/marker/bus.png',
iconSize: [mymap.getZoom*2, mymap.getZoom*2],
iconAnchor: [12, 41],
popupAnchor: [1, -34],
});
marker.setIcon(busIcon);
});
现在我想根据缩放级别调整标记图标的大小。我上面的代码有问题。我应该怎么办?如果标记是 CircleMaker
,那么有一个 setRadius
函数可以让我轻松处理。但在这种情况下,标记是一个自定义图标,我按照上面的方法尝试但失败了。如何解决?
你打错了:zoomed应该是zoomend
map.on('zoomend', function() {
});
http://plnkr.co/edit/72ywrO8pgmmxLW6Y8mcL?p=preview
除此之外,我会创建图标并将其保留在 zoomend 回调之外。
事实上,每次缩放更改时,您的代码都会创建一个图标。
正如 YaFred 所说,有一些拼写错误,例如 zoomend
,还有 mymap.getZoom
,应该是 mymap.getZoom()
我对这个老问题做了一个新的回答,以提出一个更有效的解决方案。您可以在图标中添加 className
(参见 leaflet documentation)。
也就是说我们可以通过css来编辑图标的高宽!在您的 zoomend
函数中,不要创建新图标,只需调用 JQuery:
var newzoom = '' + (2*(mymap.getZoom())) +'px';
$('#mapid .YourClassName').css({'width':newzoom,'height':newzoom});
对于更多的标记,这将显着提高您的性能,如此 Whosebug 问题中所述:
我使用 Leaflet 绘制了一个 OpenStreetMap 并附加了一个自定义图标标记
var mymap = L.map('mapid').setView([x, y], 13);
L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}', {
attribution: 'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://mapbox.com">Mapbox</a>',
maxZoom: 18,
id: ID,
accessToken: accessToken
}).addTo(mymap);
var busIcon = new L.Icon({
iconUrl: 'images/marker/bus.png',
// shadowUrl: 'images/leaflet/marker-shadow.png',
iconSize: [12, 12],
iconAnchor: [12, 41],
popupAnchor: [1, -34],
// shadowSize: [41, 41]
});
var marker = L.marker([x, y],{icon:busIcon}).addTo(mymap);
mymap.on('zoomed', function() {
var currentZoom = mymap.getZoom();
busIcon = new L.Icon({
iconUrl: 'images/marker/bus.png',
iconSize: [mymap.getZoom*2, mymap.getZoom*2],
iconAnchor: [12, 41],
popupAnchor: [1, -34],
});
marker.setIcon(busIcon);
});
现在我想根据缩放级别调整标记图标的大小。我上面的代码有问题。我应该怎么办?如果标记是 CircleMaker
,那么有一个 setRadius
函数可以让我轻松处理。但在这种情况下,标记是一个自定义图标,我按照上面的方法尝试但失败了。如何解决?
你打错了:zoomed应该是zoomend
map.on('zoomend', function() {
});
http://plnkr.co/edit/72ywrO8pgmmxLW6Y8mcL?p=preview
除此之外,我会创建图标并将其保留在 zoomend 回调之外。
事实上,每次缩放更改时,您的代码都会创建一个图标。
正如 YaFred 所说,有一些拼写错误,例如 zoomend
,还有 mymap.getZoom
,应该是 mymap.getZoom()
我对这个老问题做了一个新的回答,以提出一个更有效的解决方案。您可以在图标中添加 className
(参见 leaflet documentation)。
也就是说我们可以通过css来编辑图标的高宽!在您的 zoomend
函数中,不要创建新图标,只需调用 JQuery:
var newzoom = '' + (2*(mymap.getZoom())) +'px';
$('#mapid .YourClassName').css({'width':newzoom,'height':newzoom});
对于更多的标记,这将显着提高您的性能,如此 Whosebug 问题中所述: