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

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

百度与谷歌地图瓦片组织方式对比_百度地图

 

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

百度与谷歌地图瓦片组织方式对比_数据_02

 

在第2级时,百度地图(中心点右上部分)分为2块,

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

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

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

因此在第2级百度地图(中心点右上部分)有2块瓦片。

百度与谷歌地图瓦片组织方式对比_数据_03

 

瓦片编号类似于Excel表格单元格编号,原点向上和向右为正,向下和向左为负。单元格X,Y编号从0开始,如右上角第一格X=0,Y=0,X是指向右方向即水平,Y是指向上方向即垂直。

而谷歌地图在第2级将世界地图分为4块,瓦片编号是向右和向下,没有负数。

在经纬度(0,0) 的右上角部分即中国区,只有1块瓦片,而百度却是2块。这是为何呢?

这是由于两者在这级的分辨率不同导致的。

经纬度(0,0)右上角瓦片计算:

百度瓦片个数=20037508.34/(65536*256)=1.19,取最大整数为2块。

谷歌瓦片个数=20037508.34/( 78271.5169639999*256)=1块。

百度分辨率计算公式:

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)

百度与谷歌地图瓦片组织方式对比_百度_04

 

ArcGISServer的瓦片组织方式与谷歌类似。如果想在AGS for Flex中采用百度地图作为底图,且想将百度地图下载为离线数据,并发布瓦片地图服务供flex 调用,有什么方法?

以下提供一种解决方案:

1) 开发一个工具,下载百度地图成离线数据。

2) 开发一个工具,将百度地图瓦片编号转成AGS地图瓦片编号。当然这样做的话底图数据就与谷歌地图无法吻合。但我们假设底图只用百度地图,业务图坐标也是从百度中采集的情况。

3) 如何将百度的瓦片编号转成AGS瓦片编号,这个没有什么公式,我建议固定一个经纬度点,并计算该点的百度和谷歌的瓦片编号,做为瓦片转换的参照目标。

以北京天安门的地理坐标点(116.407945,39.91349)计算出百度与谷歌各层瓦片编号。

百度

谷歌

级别

级别

1

0

0

0

0

0

2

0

0

1

1

0

3

1

0

2

3

1

4

3

1

3

6

2

5

6

2

4

13

5

6

12

4

5

26

12

7

24

9

6

52

24

8

49

18

7

105

48

9

98

36

8

210

97

10

197

73

9

421

194

11

395

147

10

843

387

12

790

294

11

1685

776

13

1581

589

12

3372

1551

14

3163

1178

13

6744

3103

15

6327

2356

14

13489

6207

16

12654

4712

15

26979

12415

17

25308

9425

16

53958

24830

18

50617

18851

17

107917

49661

4) 有了这张对照表,我们就可以通过百度的瓦片编号来计算对应的谷歌瓦片编号。

计算公式如下:

谷歌瓦片行编号=[谷歌参照瓦片行编号+(百度行编号 – 百度参照瓦片行编号)] //向右,行为递增

谷歌瓦片列编号=[谷歌参照瓦片列编号- (百度列编号 – 百度参照瓦片列编号)] //向上,列为递减