用心计较般般错 安心自守事事宽

cgl 坚持、努力终有所获
posts - 103, comments - 20, trackbacks - 0, articles - 1
  新随笔 :: 管理

百度与谷歌地图瓦片组织方式对比 (修正)

Posted on 2013-11-26 16:47 用心计较般般错 安心自守事事宽 阅读(...) 评论(...) 编辑 收藏

下述博客转自:

http://www.cnblogs.com/janehlp/archive/2012/08/27/2658106.html

不过本人经过实验,发现其最后的对照表有少许错误,因此对其修正。纠正过后,瓦片拼接最终图,需要再次纠偏。

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

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

图1-1

 

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

图1-2

 

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

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

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

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

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

图1-3

 

瓦片编号类似于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)

图1-4

 

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) 有了这张对照表,我们就可以通过百度的瓦片编号来计算对应的谷歌瓦片编号。

计算公式如下:

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

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

经过实验,发现上述对照表中有少许问题,于是对上述对照表进行修正。

修正上述对照表:

百度

谷歌

级别

级别

0

0

0

0

0

0

1

0

0

1

1

0

2

0

0

2

3

1

3

1

0

3

6

2

4

3

1

4

13

5

5

6

2

5

26

12

6

12

4

6

52

24

7

24

9

7

105

48

8

49

18

8

210

97

9

98

36

9

421

194

10

197

73

10

843

387

11

395

147

11

1685

776

12

790

294

12

3372

1551

13

1581

589

13

6744

3103

14

3163

1178

14

13489

6207

15

6327

2356

15

26978

12415

16

12654

4712

16

53957

24832

17

25308

9425

17

107913

49665

18

50617

18851

18

215829

99328

 瓦片拼接后,需要进行纠正。