Hi,欢迎来 小猪地图, 请【登录】或【注册

首页> 站点公告> 文章内容

百度地图瓦片、经纬度、平面坐标系、算法分析

2017-05-05 15:50

目前地图制作软件很多,大部分软件都是收费的,并且下载的数据不准确,精度不高,本人通过对百度瓦片解释、坐标依移及坐标解算等方面进行分析,自主完成下载、拼接以及坐标解算等,并能够与完美拼接百度地图。

一、我们先来看一下百度瓦片定义

(1)经纬度

这个就不多说了,不熟悉的可以翻翻地理书。但需要注意的是即便同是经纬度坐标也可能属于不同的坐标体系。一般GPS设备获取的经纬度属于WGS84坐标系,这是一个比较通用的坐标体系。由于某些原因国内不能直接使用WGS84坐标,因此百度地图API的经纬度是经过加密偏移的。

(2)平面坐标

前面说过,球面上的形状需要经过投影才能变换为平面上的形状,变换后就需要有一个平面坐标系统来描述地图上某个位置。百度地图API默认使用墨卡托投影(Mercator Projection),同样需要注意的是由于投影参数不同,同样是墨卡托投影也会有所差别。

平面坐标系的原点与经纬度的原点一致,即赤道与0度经线相交的位置:


在百度地图API中,平面坐标是以最大级别18级为基准的。就是说在18级下,平面坐标的一个单位就代表了屏幕上的1个像素。平面坐标与地图所展示的级别没有关系,也就是说在1级和18级下,天安门位置的平面坐标都是一致的。

(3)像素坐标

在第18级下,我们直接将平面坐标向下取整就得到了像素坐标,而在其他级别下可以通过如下公式进行换算(这里取整为向下取整)像素坐标= |平面坐标 ×2 zoom-18|

(4)图块坐标(瓦片编号)

百度地图API在展示地图时是将整个地图图片切割成若干图块来显示的,当地图初始化或是地图级别、中心点位置发生变化时,地图API会根据当前像素坐标计算出视野内需要的图块坐标(也叫图块编号),从而加载对应的图块用以显示地图。

百度地图的图块坐标原点与平面坐标一致,从原点向右上方开始编号为0, 0:


如何知道某个位置的图块坐标呢?通过如下公式计算即可(这里为向下取整):

	
		图块坐标 = |像素坐标 ÷ 256| 

256实际上是每个图块的宽度和高度,我们用像素坐标除以这个数就知道图块坐标了。还以天安门为例,在第4级下天安门所在的图块编号为:3, 1,而在第18级下,图块编号为:50617, 18851

2、百度与GOOGLE分块的比较

百度是从中心点经纬度(0,0)度开始计算瓦片,在第1级时百度将世界地图分为4块。

(1)编号规则不同

中心点右上部分(中国地区)占1块。

谷歌是从左上角经纬度(-180,85.00..)度开始计算瓦片,在第1级时谷歌将世界地图分为1块。

(2)图幅分辨率不同

百度分辨率计算公式:

Double res = math.pow(2,(18 - n)) // n为层数(1-18)

谷歌分辨率计算公式:

Double tileSize=256 //瓦片尺寸(256*256)

Double initialResolution = 2 * math.pi * 6378137 / tileSize //6378137为球体半径

Double res = initialResolution /math.pow(2,zoom) //zoom为层数(0-21)


这是因为在这级百度的地图分辨率为65536米/像素,分辨率=math.pow(2,(18 - n))。

WGS84球体周长:40075016.685578488,球体周长一半为20037508.34米。

瓦片个数=20037508.34/(65536*256)=1.19。


因此GOOGLE 与百度的瓦片基本上对不上号,同一层每一图块的地理范围也不同。


(3)百度地理坐标与实际投影平面坐标不一至

如图,相应的经纬度在地图上对应的平面坐标与实际计算值相关较大,此位置大约2公里,不同的位置还不一样,赤道位置为0。因此要正确使用百度地图首先要改正百度地图本身的坐标位置偏移。

(3)地理位置的误差

在消除上述误差后,所获取的地理坐标与实际位置地理坐标还不一样,这就是国内所谓的BM要求,加入了位置偏差,大约一百多米,要经过计算消除。下图为13层图像拼接坐标改正后与GPS数据的叠加效果。

3、百度地图的拼接软件

百度地图的拼接软件很多,基本都收费,在线免费百度地图拼接的却只有【小猪地图】一家。

 


上一篇: 新版百度地图拼接控制面板已升级 下一篇: 地图瓦片如何实现无缝拼接