微信小程序--地图组件与api-模拟器上返回的scale 与真机上不同--bindregionchange触发图标一直闪现问题

场景:根据地理定位获取不同地区的充电桩位置,要求

1.平移的时候,跟随坐标变化展示不同区域的坐标点信息

2.不同的缩放等级,14以下,展示聚合点数据,14以上,展示真正的站点信息;

3.点击聚合点的时候,当前地图会放大,直到缩放等级大于14为止,最终的结果是展示真正的站点信息而不是聚合点

实现原理:

map组件提供了bindregionchange函数,可以监听视野变化,目前测试下来(不知道还有没有别的),能够引起视野变化的有:

1.改变经纬度

2.改变缩放等级

因此,利用这两点,可以达到我们的需求。

定义一个函数getLngLat,这个函数,获取当前的缩放等级与中心点坐标,然后根据当前的缩放等级,来决定是调用站点信息接口,还是聚合站点列表接口

getLngLat: function() {

var that = this;

this.mapCtx = wx.createMapContext("map");

// //获取缩放等级

this.mapCtx.getScale({

...

});

//获取中心坐标点

that.mapCtx.getCenterLocation({

...

});

//根据缩放等级来请求,如果是最低的等级,直接请求详情列表,如果缩放等级很大,请求集合数据

if (scale >= 14) {

that.searchStation(res.latitude, res.longitude);//请求具体站点接口

} else {

that.getStationList(res.longitude, res.latitude, scale);//请求聚合信息接口

}

}

});

然后在bindregionchange函数中执行他

// 视野发生事件

regionchange(e) {

let that = this;

if (e.type == \'end\') {

this.getLngLat();

} else {}

}

这样就解决了平移以及根据当前缩放等级来请求不同的接口的问题

然后,如果展示的是聚合点,要点击能继续放大地图

这点的实现思路是,由于聚合点和真正的站点信息都是markers,那么监听markers的点击事件,当点击的时候,获取当前的缩放等级,如果大于14,就说明是站点的信息,直接弹出站点详情,如果小于14,说明是聚合点,

前面我们说过,当缩放等级或者经纬度变化的时候,bindregionchange函数会被触发,因此在这个函数中,把获取到的scale ,setData到当前,就会自动执行bindregionchange里的getLngLat函数,(获取当前的缩放等级,获取中心点坐标,根据坐标与缩放等级请求不同的接口)

//地图标记点击事件

markertap: function(e) {

//如果当前的scale大于等于14,直接展示站点信息,否则就放大

// //获取缩放等级

this.mapCtx.getScale({

success: function(res) {

let scale = parseInt(res.scale);

if (scale < 14) {

that.setData({

scale_c: scale+1//改变当前的缩放等级,为了触发bindregionchange函数

})

} else {

},

});

},

然后开始测试

接下来重点来了!!!

按照上面的写法,在模拟器上测试的时候,点击聚合点,会一直缩小,直到scale==3为止。。。。

大写的懵,感觉实现没问题啊,查了很久发现,在模拟器上获取的scale,和真机上是不一样的啊,请同志们一定要在真机上测试啊!!!!

这是个bug吧。。。

恩,最后我放弃了模拟器,反正客户又不用看模拟器,手机正常就行。。。

bug&坑:

bindregionchange中,不能直接setData 经纬度和scale,否则会一直闪现

模拟器和真机上,返回的scale不一致,建议真机测试

再次注意:

一定要仔细检查传参啊,很多小问题都是最基础的造成的。。。。

资料参考:

微信小程序腾讯地图bindregionchange事件导致图标闪烁的解决方法:

https://blog.csdn.net/u013631121/article/details/81225865

感谢