【小程序开发】地图circle自适应大小(radius适配)

问题

小程序地图组件map可以配置circles,用于标示当前位置的一个范围
circle有一个字段radius来规定圆圈半径
不过,这个值是与地图对应,即地图缩放时,它并不会改变大小

circle的透明度是通过配置fillColor属性的#XXXXXX00最后2位实现的,当不配置(即颜色值只有6位)时等同于opacity=1,当为00时,等同于opacity=0,以此类推。

在这里插入图片描述

官网api:

circles 在地图上显示圆

属性说明类型必填备注
latitude纬度Number浮点数,范围 -90 ~ 90
longitude经度Number浮点数,范围 -180 ~ 180
color描边的颜色String十六进制
fillColor填充颜色String十六进制
radius半径Number
strokeWidth描边的宽度Number

这里的radius就是来表示圆的半径的

解决方案

比例尺

最开始是打算通过地图比例尺,然后就可以计算出来了,结果,官方论坛
在这里插入图片描述
emmmm,算了,另外想方案= =

是时候考验真正的技术了

官方有个接口
MapContext.getRegion(Object object)
基础库 1.4.0 开始支持,低版本需做兼容处理。

获取当前地图的视野范围

参数
Object object

属性类型默认值必填说明
successfunction接口调用成功的回调函数
failfunction接口调用失败的回调函数
completefunction接口调用结束的回调函数(调用成功、失败都会执行)

object.success 回调函数
参数

Object res

属性类型说明
southwestnumber西南角经纬度
northeastnumber东北角经纬度

通过这个接口可以获取到2个坐标(左下角和右上角)
这样,我们就可以通过这2个坐标计算出2点之间的水平/垂直距离
从而得到radius的值

radius值为number,而且根据观察应该是1代表1m

计算2坐标换算距离我是参考微信小程序中使用地图和定位的一些坑和经验中的计算方法

var EARTH_RADIUS = 6378.137; //地球半径
function rad(d) {
    return d * Math.PI / 180.0;
}
function getDistance(lng1, lat1, lng2, lat2) {
  var radLat1 = rad(lat1);
  var radLat2 = rad(lat2);
  var a = radLat1 - radLat2;
  var b = rad(lng1) - rad(lng2);
  var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
    + Math.cos(radLat1) * Math.cos(radLat2)
    * Math.pow(Math.sin(b / 2), 2)));
  s = s * EARTH_RADIUS;
  s = Math.round(s * 10000) / 10000;
  return s;//返回数值单位:公里
}

通过getRegion接口我们得到2个坐标值,通过计算判断,得到短边,然后进行计算短边实际距离

this.wxmap.getRegion({
   success:res=>{
       let lng1 = res.northeast.longitude;
       let lat1 = res.northeast.latitude;
       let lng2 = res.southwest.longitude;
       let lat2 = res.southwest.latitude;

       let longitude = lng1 - lng2;
       let latitude = lat1 - lat2;
       let flag = longitude>latitude?true:false;
       let radius = 0;
       //计算得到短边,然后再通过*1000转变为m,除2得到半径,*0.8优化显示,让圈圈只占界面的80%
       if(flag){
           radius= app.getDistance(lng1,lat1,lng1,lat2)*1000/2*0.8;
       }else{
           radius= app.getDistance(lng1,lat1,lng2,lat1)*1000/2*0.8;
       }
       this.setData({
           "circles[0].radius":radius
       });
   }
});

这样,所需要的效果就达到了。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值