百度地图设置圆形覆盖物的最佳视角

下面是百度地图缩放级别对应的比例尺距离,这个规律目前还没想到好的算法

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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值