获取百度地图窗口内的当前显示内容瓦片,可以通过地图对象的当前配置变量的计算重新得到,因此调整窗口位置、缩放,可以很容易的获取所需要的瓦片的下载地址。下载瓦片,然后部署到对应的路径下,就可以实现地图的离线。
1.3版的百度地图瓦片获取是直接参考内部的代码抽取整理而成的,而相关的理论没有做过多的研究。当代码迁移到2.0上的时候,代码的变动很大,以至于想轻松的抽取代码是不现实的。
好在百度地图实现的理论是不变的,因此理论上来说,1.3版的百度地图和2.0版的百度地图在瓦片上是一样的,获取流程上也是一样的,只是某些参数的获取方式可能改变了,比如直接不提供相关的功能的访问。
还好上次写1.3版的百度地图瓦片获取代码的时候,我多深入了解了一下一些功能的实现,写在注释里面了。对上次写的博文《百度地图2.0瓦片获取》还是不够满意的,因为上次写的只能实现增量式瓦片地址获取,而无法一次性获得窗口内的所有瓦片地址。
这次再次翻腾了一下1.3版的这部分代码,感觉还是应该可以移植的,因此结合浏览器的调试,探究了一下相关方法和属性,写出了新版的百度地图2.0瓦片地址获取程序,希望能够帮助到一些有需要的人。
同样的,下载程序不提供,自行嵌入某些程序下载吧。
主要流程和方法描述:
对于页面内的地图,是有一个js对象map来承载的,后期异步的操作都是基于这个对象,获取当前窗口内的瓦片地址也毫不例外。我的思路是,根据map对象,和给出一个回调方法,把当前窗口内的瓦片地址给计算出来,然后通过回调方法输出出来。
我的实现是,写一个方法,所有变量对象都包在这个方法当中,这样就不会污染外部程序;然后调用这个方法的时候,我返回另外一个方法,这个方法的参数就是map和callback,当调用这个方法的时候,当前地图对象窗口内的瓦片地址就会通过回调方法输出出来。
就是这样:
function downloadBaiduTiles(){
//……
return function(map, callback){findAllTiles(map, callback);};
}
而findAllTiles方法是这样写的:
function findAllTiles(map, callback){
//var mapType = map.getMapType();// 地图类型,现在里面没那么多的可用数据了,直接不要了
var zoomLevel = map.getZoom();// 放大倍数,现在是用getZoom了,原先是zoomLevel,现在没了。
var center = map.getCenter(); //这个中心可能需要转换一下。先试试。 //map.mercatorCenter;// 原先获取的中心坐标
center = convertLL2MC(center);//果然是需要转换才能用啊
//var cV = mapType.getZoomUnits(zoomLevel);// zoomLevel相关的一个指数,=2^(18-zoomLevel)
var cV = Math.pow(2, 18-zoomLevel);//现在直接计算这个数。理论不变,代码变了,我们直接计算好了。
var unitSize = cV * 256; //这个也只能自己计算了//mapType.getZoomFactor(zoomLevel)