【v0.02版】“天地图”目前貌似还没有API,只好自己设计 ...

来源:百度文库 编辑:超级军网 时间:2024/05/04 07:46:33


天地图(www.tianditu.com)目前还只是个浏览地图的测试版,离推出API还遥遥无期。在期待天地图API的这段时间里,只能用“破解”的方式来直接访问天地图的图片。

~~~~~首先是无聊的理论部分~~~~~

天地图提供了从全球到街道的各个比例的地图图片,分为17个层次。每个层次的地图都是由若干个256x256的图块构成的。

用FireFox+FireBug很容易得到的图块请求格式:
例:
  1. http://tile1.tianditu.com/DataServer?T=A0512_EMap&X=1&Y=0&L=3
复制代码
tile?:服务器名。?=X的值整除8的余数。{tile0,tile1,...,tile7}
T:地图类型,后面再细说;
X:图块在当前缩放层次的X坐标,X={0, 2^L-1}。上例中,X={0,7}
Y:图块在当前缩放层次的Y坐标,Y={0,2^(L-1)-1}。上例中,Y={0,3}
L:当前的缩放层次。目前,天地图提供的图层为L={2,18}。

投影展开方式:
没有投影,直接以(-180,0)为坐标原点,以赤道为横轴,-180经线为纵轴,建立平面直角坐标系。与NASA WorldWind的图块系统类似(没细查,也可能就是一样的)。

经纬度到像素坐标转换:(得到对应该坐标的像素在整个地图图层中的坐标)
X=(180+经度)/360*(2^L)*256,向下取整。(西经为负)
Y=(90-纬度)/180*(2^(L-1))*256,向下取整。(南纬为负)
不乘256即为图块在整个图块阵列中的位置……

地图类型:
天地图提供了“矢量”和“影像”两类地图。

矢量类型的地图,在2~10层(含10)都是由上下两层图片叠加而成。上层为地名,下层为底图。而11~18层则是(已叠加之后的)单层底图。
具体参数如下:
2~10层:地名图层T=AB0512_Anno 底图图层T=A0512_EMap
11~12层:T=B0627_EMap
13~18层:T=siwei0608

影像类型的底图全部是由地名和底图两层图片叠加而成。
2~10层:地名图层T=A0610_ImgAnno 底图图层T=sbsm0210
11层:地名图层T=B0530_eImgAnno 底图图层T=e11
12层:地名图层T=B0530_eImgAnno 底图图层T=e12
13层:地名图层T=B0530_eImgAnno 底图图层T=e13
14层:地名图层T=B0530_eImgAnno 底图图层T=eastdawnall
15~18层:地名图层T=siweiAnno68 底图图层T=sbsm1518

注:地图类型参数"T="主要是从北京和新疆局部地区浏览+验证得到的,难免有照顾不到的地方,不保证全国通用。如果找不到图的话,开着Firebug到天地图去找~

~~~~~理论部分结束~~~~~

下面拿实例说话,验证理论。

以北京市为例,东经116.46,北纬39.92
当L=5时,求北京市所在的图块计算过程如下:
(116.46+180)/360*(2^5)=26.352,取整,X=26
(90-39.92)/180*(2^(5-1))=4.452,取整,Y=4

按照天地图自己的服务器均衡算法,应将请求发送至tile2服务器;

最后拼字串,可得:
北京所在图块的矢量地名图层URL:
  1. http://tile2.tianditu.com/DataServer?T=AB0512_Anno&X=26&Y=4&L=5
复制代码
北京所在图块的矢量底图图层URL:
  1. http://tile2.tianditu.com/DataServer?T=A0512_EMap&X=26&Y=4&L=5
复制代码
北京所在图块的影像地名图层URL:
  1. http://tile2.tianditu.com/DataServer?T=A0610_ImgAnno&X=26&Y=4&L=5
复制代码
北京所在图块的影像底图图层URL:
  1. http://tile2.tianditu.com/DataServer?T=sbsm0210&X=26&Y=4&L=5
复制代码
下一步将是图块拼接和API的编码,打算先用JS+HTML实现网页版,然后再移植到Android和iOS平台。

~~~~~v0.01版~~~~~
源码及截图在#18楼
zip包里包含了3个文件:
-tdtAPI.js和tdtAPI.css是API的本体部分;
-simpleMap.htm相当与用户自己的网页,通过调用API实现地图功能。

目前已经实现的功能有:
-按经纬度和缩放层次在地图上定位
-地图平移(目前鼠标拖拽的部分还没有写)
-地图缩放
-地图模式在矢量与影像模式间的切换



解释一下山寨版天体图(simpleMap.htm)的代码:
首先在html的<header>部分引入tdtAPI.js和tdtAPI.css。API的逻辑部分在.js里,.css用来设定些格式。
  1. <head>
  2.         ...
  3.         <script type="text/javascript" src="tdtAPI.js"></script>
  4.         <link rel="stylesheet" type="text/css" href="tdtAPI.css" />
  5.         ...
  6. </head>
复制代码
然后创建最简单的用户界面,就是截图最上面的输入框+按钮之类,主要用来接收onclick事件。
很简陋,轻拍~
  1. 经度(-180~180)<input type="text" id="txt_lng" style="width:100px"/>
  2. 纬度(-90~90)<input type="text" id="txt_lat" style="width:100px"/>
  3. 缩放层次(2~18)<input type="text" id="txt_zoom" style="width:50px"/>
  4. <input type="button" id="btn_goto" value="去往" onclick="GotoCoordinate()"/>
  5. <br />
  6. <input type="button" id="btn_goE" value="向东" onclick="GoEast()"/>
  7. <input type="button" id="btn_goW" value="向西" onclick="GoWest()"/>
  8. |
  9. <input type="button" id="btn_goN" value="向北" onclick="GoNorth()"/>
  10. <input type="button" id="btn_goS" value="向南" onclick="GoSouth()"/>
  11. |
  12. <input type="button" id="btn_zoomIn" value="+" onclick="ZoomIn()"/>
  13. <input type="button" id="btn_zoomOut" value="-" onclick="ZoomOut()"/>
  14. |
  15. <input type="button" id="btn_vector" value="矢量" onclick="VectorMap()"/>
  16. <input type="button" id="btn_image" value="影像" onclick="ImageMap()"/>
复制代码
接下来是创建地图容器:
  1. <!-- 地图容器 -->
  2. <div id="mapContainer0" class="tdtMap" style="width:800px; height:600px"></div>
复制代码
“mapContainer0”是地图的标识,下面创建地图时要用到;
class="tdtMap"这句不要改动,css里有对应的格式;
style="width:800px; height:600px 用来确定地图尺寸。

创建地图:(从这之后就都是JavaScript了)
  1. var map0 = new tdtMap("mapContainer0", 116.46, 39.92, 5);
复制代码
mapContainer0就是刚刚提到过的地图容器的id;
116.46:地图初始经度;
39.92:地图初始纬度;
5:地图初始的缩放层次。
map0:地图本身。通过它来调用API中的功能。
【注意】v0.01暂时没有考虑在网页里集成多个地图的情况。如果集成了两个及两个以上的地图,代码会出错~~下次更新的时候补上

控制地图:
-平移:
通过onclick事件调用用户自己的GoEast函数;
html:
  1. <input type="button" id="btn_goE" value="向东" onclick="GoEast()"/>
复制代码
GoEast函数再通过map0调用API中的MoveOffset;
JavaScript:
  1. function GoEast(){
  2.         map0.MoveOffset(50,0); //通过调用.MoveOffset函数实现,参数为(水平偏移量,垂直偏移量)
  3. }
复制代码
-缩放:
html的部分与平移类似,省了;
JavaScript:
  1. //用户缩放
  2. function ZoomIn(){
  3.         map0.ZoomTo(map0.GetLevel() + 1);//放大一层               
  4. }
  5. function ZoomOut(){
  6.         map0.ZoomTo(map0.GetLevel() - 1);//缩小一层               
  7. }
复制代码
上面的代码用到了两个API函数:
.ZoomTo()实现缩放功能,参数为目标缩放层次;
.GetLevel()用来返回当前的缩放层次,无参数;

-地图类型切换
JavaScript:
  1. //选择地图类型
  2. function VectorMap(){
  3.         map0.SetMapType(map0.MapType.VECTOR);
  4. }
  5. function ImageMap(){
  6.         map0.SetMapType(map0.MapType.IMAGE);
  7. }
复制代码
.SetMapType()实现地图模式的切换,参数为地图类型;
.MapType.VECTOR和.MapType.IMAGE是API中定义的两个常量,分别用来代表“矢量”与“影像”,用来做.SetMapType()的参数;
两个常量的具体取值可以在tdtAPI.js中找到

~~~~~v0.01发布结束~~~~~
~~~~~v0.02版~~~~~
tdtAPI v0.0.2.rar(5.93 KB, 下载次数: 69)