模仿谷歌地图显示原理做了一个地图显示模块

时间:2021-08-20 03:52:50

关于如何将地球经纬度坐标系统转换成措施中常用到的平面2D坐标系统,网上的文章很多,参考(本文图1 图3来自此处).谷歌舆图给与的投影方法为“墨卡托投影法”(*网址),概略意思就是将地球放在一个圆柱中,让地球赤道和圆柱壁相接触,在地球中心放一盏灯,地球上的图像在圆柱壁上会孕育产生暗影,然后将圆柱壁展开,得到的一张“长方形舆图”即为转换之后的平面2D舆图,描述很简单,实际展开后的舆图还进行了其他措置惩罚惩罚。

模仿谷歌地图显示原理做了一个地图显示模块

图1

可以想象到,地球上的经度颠末灯光的照射之后,在圆柱壁上生成的暗影应该是均匀分步的,而纬度就不一样了,纬度颠末灯光照射之后,离赤道越近的漫衍越密,离赤道越远的分步越稀,到了地球两极(南极和北极),就会趋向无穷稀,因此谷歌舆图并没有包罗地球两极的区域(北边到北纬85度,南边到南纬85度,概略)。

谷歌舆图包罗的地球范畴为 经度:0度~东经180,0度~西经180(共360度),纬度:0度~北纬85,0度~南纬85(共170度)。注:以上0经度暗示通过英国的本初子午线,0纬度指赤道。转换成平面2D图之后,原点(0,0)在左上方(跟措施中一致),用像素作为单位,这样一来,地球上任何一个点(经度,纬度)都能转换成平面2D坐标系统中的一个点(x,y),转换算法已经供给了,直接可以拿来使用。前面说到,经度和纬度在圆柱壁上的暗影分步密度差别,纬度远离赤道分步越稀,因此,虽然经度范畴为360度(-180~180,西经为负,东经为正,自西往东,经度越来越大),远远大于纬度170度(-85~85,南纬为负,北纬为正),但是映射到圆柱壁之后生成的图片的长宽倒是相等的(这个也有后期颠末措置惩罚惩罚的原因),本色上,谷歌舆图的长宽确实是不异的。

由于平面舆图是可以放大缩小的,因此舆图不成能使用同一张图,这样放大后就会掉真,,谷歌舆图的做法就是给舆图预先界说缩放品级(0级~22级,常用的0~17),每一个缩放级别均对应许许多多的小方块图片(称为瓦片),这些小方块都是256*256像素,然后将这些瓦片拼接起来生成一张大的清晰的舆图。谷歌舆图的缩放级别与瓦片数目有一个对应关系:瓦片数目=2的n次方*2的n次方(n为缩放级别)。也就是说,当缩放级别为0时,整个世界舆图只1*1张256*256的图,当缩放级别为1,整个世界舆图包罗2*2张256*256巨细的图,当缩放级别为2,整个世界舆图包罗4*4张256*256巨细的图。下图为缩放级别为0时,坐标对应关系:

模仿谷歌地图显示原理做了一个地图显示模块

图2

当缩放级别转变时,整个世界舆图构成变革如下图:

模仿谷歌地图显示原理做了一个地图显示模块

图3

谷歌舆图配景显示道理就是将每个缩放级别下的瓦片下载下来,然后拼接在一起,如果我们知道了下载瓦片的要领,那么我们也能模拟一个类似谷歌舆图的显示界面。下面供给的一个demo演示了如何按照你供给的两个经纬度点(左上角,右下角),以及缩放级别,下载这两点包罗区域的瓦片,最后拼接起来。

demo不做过多说明,代码中注释很详细,注意一下几点:

谷歌舆图供给API,通过http请求,给出瓦片的列、行以及缩放级别,就可以下载对应的瓦片,

国内地点:[email protected]&hl=zh-CN&gl=CN&src=app&x=0&y=0&z=0

国外地点:?lyrs=m&x=0&y=0&z=0

此中,地点前面的mt0可以是mt1、mt2、mt3,分袂为差别处事器,对应的,mts0可以为mts1、mts2、mts3。x、y、z分袂暗示瓦片的列号、行号以及缩放级别。

lyrs暗示舆图类型:

m:路线图

t:地形图

p:带标签的地形图

s:卫星图

y:带标签的卫星图

demo中填写的左上角和右下角点的经纬度范畴分袂为(-180~180)和(-85~85),而且左上角点的经度必然要小于右下角的经度,左上角的纬度必然要大于右下角的纬度,至于为什么,原因就是必需能通过这两点确定一个区域。demo措施中未作判断。

不要选择区域过大,或者缩放级别过大,因为包罗的要下载瓦片太多,措施没做任何性能优化,可能呈现bug。线程不宜太多,太多反而速度慢。如果下载图片有掉败的,可以从头下载几次,可以完善一下,好比只下载上次掉败的图片。

demo针对google map,其他舆图类似。本人公司实际项目顶用到了从谷歌舆图中下载下来的这些瓦片,仿照谷歌舆图显示道理做了一个舆图显示模块。

效果图:

模仿谷歌地图显示原理做了一个地图显示模块

图4 demo主界面

模仿谷歌地图显示原理做了一个地图显示模块

图5 下载完成的瓦片

模仿谷歌地图显示原理做了一个地图显示模块

图6 拼接瓦片成一张大图

源码下载地点:

VS2010 win7调试通过,但愿有辅佐!