百度地图Silverlight版和Flex版(via SuperMap iClient)
Demo演示:(小提示:点击左上角罗盘外环转动,地图可以旋转哦。双击它即可恢复正北指向。)
http://liongg.github.com/maps/bmsl.html (Silverlight) http://liongg.github.com/maps/bmflex.html (Flex)
百度地图目前只有JavaScript版本,没有Flex、Silverlight等版本。SuperMap iClient系列产品,支持Google Maps、OSM、QQ 地图等等等等Web墨卡托投影及其Tile瓦片组织方式的地图自然不在话下,对于百度地图相对而言独树一帜的投影和瓦片组织方式,并没有提供已知的解决方案。出于“好奇”,俺试着把两者结合一下,搞个Mashup玩玩,非官方产品。
以下简单描述了两者结合的思路,语焉不详不是为了保留,而是没法详述。如果对两者都有一定程度的了解,则下面的思路即可转换为实际的代码。如果不了解,讲得再详细也没有用。另外,需要声明的是,这儿的思路都可以从两者公开的接口中拿到。当然有时候,你必须hack到一些在文档中没有,但实际上可以使用的接口。
按照SuperMap iClient提供的实现接口,需要知道百度地图的地图边界范围、尺度(分辨率或比例尺)数组、Tile瓦片组织方式。然后即可在SuperMap iClient系列产品中使用百度地图的数据。
尺度数组:在百度API技术交流群中,透漏过百度地图在18级是1px代表1m,也就是空间分辨率是1mpp。(同时还提到谷歌地图在18级是1px代表0.8m,但我认为此值不准确)如果你不凑巧错过上述有价值的信息,或者你貌似听到过但当了耳旁风,还可以从百度地图的比例尺控件中获取到这个值(思考题,怎么获取?),只是有稍许误差,但这并不影响。因此对于某缩放级别n而言,分辨率就是Math.pow(2,18-n) ppx。
边界范围:首先要勇于抛弃基本上没有什么价值的1-4级地图,除中国外,百度暂未提供其他地区的数据。也可以不抛弃,但抛弃会给后面的算法带来较大的简化。从第5级地图来分析,是有4行5列张瓦片组成。结合百度地图坐标拾取系统,可以获取地图左下角的经纬度值。通过百度地图API中hack到的坐标转换接口,可以将其转换为投影坐标。结合第一步得到尺度数据和刚才的瓦片数量,即可得出“右上角”的米坐标值。如此一来地图边界范围唾手而得。(思考题:为什么不直接用类似获取左下角坐标的方式来获取右上角的值呢?)
瓦片组织:经过对百度瓦片URL格式的简单分析,即可知道,它的起算点是(0,0),对于中国区而言,其实就是左下方向。SuperMap iClient的瓦片起算点在左上点,因此对二者进行相应的转换。悲催的是,每一级别的转换常量是不同的,必须分别计算。计算这一组常量差值,是整个过程中最复杂的步骤。
首先,有这么一个小程序,给定一个坐标值,即可计算出某确定级别时它所在的瓦片的行列号。(思考题,如何完成这个小工具?提示:需要hack到坐标转换接口)进而可得到该瓦片的精确范围,也即四边的经纬度值。
其次,有了上述工具,用地图坐标拾取系统得到第5级左上角的大概值,进而可确定第5级左上角的精确经纬度值。精确是必须的,因为在级别很大的时候,错1度都将差得很远。
第三,依次确定,在5级-18级时,左上角所在的行列号。该行列号,则是确定级别下,与SuperMap iClient瓦片组织的常量差值。
最后声明:此文仅作研究之用,非官方产品。尽管百度地图和SuperMap iClient都是免费产品,如果要商用,还请联系相关公司。