Search for
Login | Username Password Forgot? | Email: | Create Account
Non English | Popularity: 0 | Entries: 63 | Updated: 50m 46s ago | | Add to My Feeds

最近工作上一直忙于开发一个基于百度地图的模块,今天抽空记录一下遇到的一点小问题,其实也不算是什么问题,关键是百度地图API文档做的太烂了(个人感觉)!
需要实现的功能:
有省、市、区这三级,当点击其中任意一个时,地图自动定位并缩放。然后查出定位缩放后的当前可视区域内的某些数据。
可使用的方法:
centerAndZoom()
方法描述:如果center类型为字符串时,比如“北京”,zoom可以忽略,地图将自动根据center调整zoom级别。
getBounds()
方法描述:返回地图可视区域,以地理坐标表示。
问题:
实际使用中发现,执行如下代码时,通过得到的bounds无法从数据库中查出应有的数据。

1
2
3
4
5
6
map.centerAndZoom('西安市');
var ne = map.getBounds()._ne;
var sw = map.getBounds()._sw;
var bounds = [];
bounds.push(ne.lat+','+ne.lng);
bounds.push(sw.lat+','+sw.lng);

而如果将上面的代码紧接着再执行一次,则能够查出数据来。
对比之后发现两次获取到的bounds竟然不一样,于是猜想centerAndZoom()或getBounds()的内部实现是个复杂费时的过程,这边的程序还在一行行执行,而bounds的最终值还尚未计算出来,而紧接着第二次执行时,由于条件没有变,所以就直接返回第一次计算出来的结果(可能,这个时候第一次的计算才结束)。
于是修改了一下代码:

1
2
3
4
5
6
7
8
map.centerAndZoom('西安市');
console.log(map.getBounds());		//A
settimeout(function(){
	console.log(map.getBounds());		//B
}, 3000);
settimeout(function(){
	console.log(map.getBounds());		//C
}, 6000);

执行了一下发现A处与B、C不等,而B与C相等。
后来在百度地图API贴吧里面找到了介绍(干嘛不直接在文档里面写明白?),若给centerAndZoom()传递的是字符串,则其是一个异步的过程,在该方法内部需要将字符串转换为point类型。(既然如此,你干嘛不为centerAndZoom()提供一个回调呢?)
接着查那垃圾的API文档,找到了LocalSearch,问题解决:

1
2
3
4
5
6
7
8
9
10
11
var ls = new BMap.LocalSearch(map);
ls.setSearchCompleteCallback(function(rs){
	if(ls.getStatus() == BMAP_STATUS_SUCCESS){
		var poi = rs.getPoi(0);
		if(poi){
			map.centerAndZoom(poi.point, cocosily.zoom);
			//接下来获取bounds就没问题了
		}
	}
});
ls.search('西安市');


More from Neeke's Blog

收拾东西回家 11 Mar 28
女朋友过生日 11 Mar 2
博客下雪吧 11 Mar 2
十日杂谈 10 Dec 3

^ Back To Top