【v0.02版】“天地图”目前貌似还没有API,只好自己设计 ...
来源:百度文库 编辑:超级军网 时间:2024/05/04 07:46:33
天地图(www.tianditu.com)目前还只是个浏览地图的测试版,离推出API还遥遥无期。在期待天地图API的这段时间里,只能用“破解”的方式来直接访问天地图的图片。
~~~~~首先是无聊的理论部分~~~~~
天地图提供了从全球到街道的各个比例的地图图片,分为17个层次。每个层次的地图都是由若干个256x256的图块构成的。
用FireFox+FireBug很容易得到的图块请求格式:
例:
- http://tile1.tianditu.com/DataServer?T=A0512_EMap&X=1&Y=0&L=3
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:
- http://tile2.tianditu.com/DataServer?T=AB0512_Anno&X=26&Y=4&L=5
- http://tile2.tianditu.com/DataServer?T=A0512_EMap&X=26&Y=4&L=5
- http://tile2.tianditu.com/DataServer?T=A0610_ImgAnno&X=26&Y=4&L=5
- http://tile2.tianditu.com/DataServer?T=sbsm0210&X=26&Y=4&L=5
~~~~~v0.01版~~~~~
源码及截图在#18楼
zip包里包含了3个文件:
-tdtAPI.js和tdtAPI.css是API的本体部分;
-simpleMap.htm相当与用户自己的网页,通过调用API实现地图功能。
目前已经实现的功能有:
-按经纬度和缩放层次在地图上定位
-地图平移(目前鼠标拖拽的部分还没有写)
-地图缩放
-地图模式在矢量与影像模式间的切换
解释一下山寨版天体图(simpleMap.htm)的代码:
首先在html的<header>部分引入tdtAPI.js和tdtAPI.css。API的逻辑部分在.js里,.css用来设定些格式。
- <head>
- ...
- <script type="text/javascript" src="tdtAPI.js"></script>
- <link rel="stylesheet" type="text/css" href="tdtAPI.css" />
- ...
- </head>
很简陋,轻拍~
- 经度(-180~180)<input type="text" id="txt_lng" style="width:100px"/>
- 纬度(-90~90)<input type="text" id="txt_lat" style="width:100px"/>
- 缩放层次(2~18)<input type="text" id="txt_zoom" style="width:50px"/>
- <input type="button" id="btn_goto" value="去往" onclick="GotoCoordinate()"/>
- <br />
- <input type="button" id="btn_goE" value="向东" onclick="GoEast()"/>
- <input type="button" id="btn_goW" value="向西" onclick="GoWest()"/>
- |
- <input type="button" id="btn_goN" value="向北" onclick="GoNorth()"/>
- <input type="button" id="btn_goS" value="向南" onclick="GoSouth()"/>
- |
- <input type="button" id="btn_zoomIn" value="+" onclick="ZoomIn()"/>
- <input type="button" id="btn_zoomOut" value="-" onclick="ZoomOut()"/>
- |
- <input type="button" id="btn_vector" value="矢量" onclick="VectorMap()"/>
- <input type="button" id="btn_image" value="影像" onclick="ImageMap()"/>
- <!-- 地图容器 -->
- <div id="mapContainer0" class="tdtMap" style="width:800px; height:600px"></div>
class="tdtMap"这句不要改动,css里有对应的格式;
style="width:800px; height:600px 用来确定地图尺寸。
创建地图:(从这之后就都是JavaScript了)
- var map0 = new tdtMap("mapContainer0", 116.46, 39.92, 5);
116.46:地图初始经度;
39.92:地图初始纬度;
5:地图初始的缩放层次。
map0:地图本身。通过它来调用API中的功能。
【注意】v0.01暂时没有考虑在网页里集成多个地图的情况。如果集成了两个及两个以上的地图,代码会出错~~下次更新的时候补上
控制地图:
-平移:
通过onclick事件调用用户自己的GoEast函数;
html:
- <input type="button" id="btn_goE" value="向东" onclick="GoEast()"/>
JavaScript:
- function GoEast(){
- map0.MoveOffset(50,0); //通过调用.MoveOffset函数实现,参数为(水平偏移量,垂直偏移量)
- }
html的部分与平移类似,省了;
JavaScript:
- //用户缩放
- function ZoomIn(){
- map0.ZoomTo(map0.GetLevel() + 1);//放大一层
- }
- function ZoomOut(){
- map0.ZoomTo(map0.GetLevel() - 1);//缩小一层
- }
.ZoomTo()实现缩放功能,参数为目标缩放层次;
.GetLevel()用来返回当前的缩放层次,无参数;
-地图类型切换
JavaScript:
- //选择地图类型
- function VectorMap(){
- map0.SetMapType(map0.MapType.VECTOR);
- }
- function ImageMap(){
- map0.SetMapType(map0.MapType.IMAGE);
- }
.MapType.VECTOR和.MapType.IMAGE是API中定义的两个常量,分别用来代表“矢量”与“影像”,用来做.SetMapType()的参数;
两个常量的具体取值可以在tdtAPI.js中找到
~~~~~v0.01发布结束~~~~~
~~~~~v0.02版~~~~~