下面是百度地图缩放级别对应的比例尺距离,这个规律目前还没想到好的算法
23级 1m
22级 2m
21级 5m
20级 10m
19级 20m
18级 50m
17级 100m
16级 200m
15级 500m
…
结果不严谨的计算,勉强能用
/**
* 设置圆覆盖物最佳视角
* @param {Object} point 坐标点
* @param {Number} radius 直径
*/
function setCircleBestViewport(point, radius) {
//地图缩放最大层级为20级,比例尺对应显示的米数为20米,假设圆的直径是100米
//地图在20级时显示的米数为20米,无法完全显示100米的圆,需要缩放到下一级,下一级比例尺显示的米数是当前级的两倍
//地图20级-1缩放到19级,比例尺对应显示的米数为20*2=40,还是不能完全显示100米的圆,继续缩放
//地图19级-1缩放到18级,比例尺对应显示的米数为20*2*2=80,还是不能完全显示100米的圆,继续缩放
//地图18级-1缩放到17级,比例尺对应显示的米数为20*2*2*2=160,可以显示100米的圆
let zoom = 20; //地图最大缩放级数为20级
let num = 20; //最大级数的比例尺对应显示米数为20米
//如果比例尺对应显示的米数小于圆的直径,就一直向下翻倍,直到比列尺对应显示的米数大于圆的直径
while (num < radius) {
num = num * 2; //基数乘以2相当于下一层比例尺的米数
zoom--;
}
//设置中心点和缩放层级
map.centerAndZoom(
new BMap.Point(point.lng, point.lat),
zoom + 2 //加两级适配,不要问为什么,我也不知道
);
}
结果很严谨,但这是写过最烂的代码
/**
* 通过米获取所属缩放级别
* @param {Number} m 米
* @returns {Number} 地图缩放级别
*/
function getZoom(m) {
let zoom = 19;
if (m <= 1) {
zoom = 23;
} else if (m > 1 && m <= 2) {
zoom = 22;
} else if (m > 2 && m <= 5) {
zoom = 21;
} else if (m > 5 && m <= 10) {
zoom = 20;
} else if (m > 10 && m <= 20) {
zoom = 19;
} else if (m > 20 && m <= 50) {
zoom = 18;
} else if (m > 50 && m <= 100) {
zoom = 17;
} else if (m > 100 && m <= 200) {
zoom = 16;
} else if (m > 200 && m <= 500) {
zoom = 15;
} else if (m > 500 && m <= 1000) {
zoom = 14;
} else if (m > 1000 && m <= 2000) {
zoom = 13;
} else if (m > 2000 && m <= 5000) {
zoom = 12;
} else if (m > 5000 && m <= 10000) {
zoom = 11;
} else if (m > 10000 && m <= 20000) {
zoom = 10;
} else if (m > 20000 && m <= 50000) {
zoom = 9;
} else if (m > 50000 && m <= 100000) {
zoom = 8;
} else if (m > 10000 && m <= 20000) {
zoom = 7;
} else if (m > 20000 && m <= 50000) {
zoom = 6;
} else if (m > 50000 && m <= 100000) {
zoom = 5;
} else if (m > 100000 && m <= 200000) {
zoom = 4;
} else if (m > 200000 && m <= 500000) {
zoom = 3;
} else if (m > 500000 && m <= 1000000) {
zoom = 2;
} else if (m > 1000000 && m <= 2000000) {
zoom = 1;
}
return zoom;
}