最近工作上一直忙于开发一个基于百度地图的模块,今天抽空记录一下遇到的一点小问题,其实也不算是什么问题,关键是百度地图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('西安市'); |
| 您可能也喜欢: | ||||
![]() 腾讯微博API |
![]() ExtJS Google Map API |
![]() 把腾讯微博API集成到WordPress主题 |
![]() 为绝版电影《毒咒》入侵服务器 |
![]() Hibernate executeFind() |
| 无觅 | ||||




