Leaflet-在不使用地图实例的情况下查找边界的缩放级别

时间:2015-12-11 02:58:11

标签: zoom leaflet

我正在尝试做什么

我需要能够找到多个形状的传单缩放级别,而无需创建地图实例并使用map.fitBounds() 移动它

我坚持的两种可能的解决方案:

1)我尝试制作模拟/临时地图以获取对map.fitBounds() 功能的访问权限并模拟map.fitBounds()

-But无法正常工作,因为地图需要实例化div容器。

2)我一直在寻找以编程方式计算传单缩放的方法。

- 我没有找到任何有关如何做到这一点的资源。

如果您有任何策略可以帮助我将这些原始数据转换为他们的传单,那将是非常棒的!

2 个答案:

答案 0 :(得分:3)

您可以创建一个L.Map实例,其中包含未附加到DOM的元素:

new L.Map(document.createElement('div'), {
    'center': [0, 0],
    'zoom': 0
});

问题是,为了计算边界,负责方法需要知道地图的大小。为了获得大小,它将调用getSize L.Map方法,但由于地图的元素未附加到DOM,因此将始终返回{x:0, y:0}的大小。您可以覆盖getSize方法以返回大小:

L.Map.include({
    getSize: function () {
        return new L.Point(400, 300);
    }
});

var map = new L.Map(document.createElement('div'), {
    'center': [0, 0],
    'zoom': 0
});

console.log(map.getSize()); // o.Point {x: 400, y: 300} 

现在,您可以使用getBoundsZoom致电L.Map L.LatLngBounds

L.Map.include({
    getSize: function () {
        return new L.Point(400, 300);
    }
});

var map = new L.Map(document.createElement('div'), {
    'center': [0, 0],
    'zoom': 0
});

var featureGroup = new L.FeatureGroup([
    new L.Marker([0,-45]),
    new L.Marker([0,45])
]);

var zoom = map.getBoundsZoom(featureGroup.getBounds());

毋庸置疑,稍后在实际地图上使用派生缩放级别时,只有在地图是您在getSize方法中预定义的大小时才会正确。如果您计划在不重新加载的情况下使用getSize,也不要忘记恢复L.Map方法。

答案 1 :(得分:0)

我试图将缩放设置为在容器DIV中显示一个具有可变半径的圆,这里是我使用的代码:

    // r is the radius in meters (for example 2km => 2000)
    circle.setRadius(r);

    // <div> size containing leaflet map
    var width = 300;
    var height = 220;

    // you have to use the MIN of them if you want the circle fit in    
    metresPerPixel = r * 2 / height;

    // here the zoom level you have to use
    z = (Math.log((40075016.686 * Math.cos(map.getCenter().lat * Math.PI/180))/metresPerPixel))/Math.log(2)-8;

    mymap.setZoom(z.toFixed(2),{animate:false});

确保在创建地图到所需的值时设置zoomSnap(我将其设置为最小值0.1以获得更好的结果)

该公式是来自http://wiki.openstreetmap.org/wiki/Zoom_levels

的清晰z的结果