Bing地图切片系统

  Bing地图提供了一个可以直接平移和缩放的世界地图。为了让地图操作更加平滑和及时响应,我们选择提前渲染地图不同层级的细节,并把每个层级的地图切割成为瓦片以便快速的还原展示。这篇文档描述了,投影,坐标系统和地图瓦片编码的方案,这些统称为Bing地图的切片系统。

地图投影

  为了确保地图中来自不同航拍影像的排版没有缝隙,我们不得不对整个地球进行投影,我们选择使用墨卡托投影,如下图所示:

  尽管墨卡托投影极大的扭曲了地图比例和面积(特别是在极点附近),但它具有两个重要特征,这两个重要特征超过了它的比例失真带来的问题。

  1. 他是一个保持形状的投影,这意味着它保留了相对较小物体的形状。这在我们展示航拍影像的时候尤为重要,我们希望避免航拍影像中建筑物的形状不被扭曲,建筑物的形状应该是方形,而不是矩形。
  2. 他是一个圆柱投影,这意味着南北方向总是直上直下,东西总是左右延伸。

  因为墨卡托投影在极点方向无穷大的特性,所以它没有真正展示整个世界。用一个方形宽高比来讲,最大唯独约为85.05度。

  为了简化计算,我们使用球形来进行这种投影的,而不用椭球形式。由于投影仅用来显示地图,而不用来显示数字坐标,因此我们不需要对椭球投影带来的额外精度。球形投影在Y方向上大约会引起0.33%的比例失真,这在视觉上不明显。

地图分辨率和地图比例尺


  除了地图投影外,在渲染地图之前地图分辨率和地图比例尺必须指定。在最低的地图层级(Level1),地图是512X512像素,在各个连续的地图层级,地图的宽度和高度以2的level次方形式增长,Level2 是1024X1024像素,Level3是2048X2048像素,等等。总之地图的宽度和高度可以通过以下方式计算:

地图 width = 地图 height = * 2level 像素

  地图分辨率表示地图上一像素代表的实际距离,例如,地图分辨率为10m/pixel,表示地图上没像素代表真实距离10米。地图分辨率是通过地图层级(Level)和纬度来计算的。使用地球半径6378137米,地图的分辨率可以通过如下方式计算:

地图 resolution = cos(latitude * pi/180) * 地球周长 / map width =(cos(latitude * pi/180) * 2 * pi * 6378137 meters) / (256 * 2level 像素)

  地图的比例尺表示了在同一个单位体系下地图上距离和地面距离的比值。举个例子,地图比例尺1::100000每英寸表示,地图上一英寸表示实际距离100000英寸。类似地图分辨率,地图比例尺也是通过地图层级和纬度确定的。通过给定了屏幕分辨率(通常96dpi),则可以根据地图分辨率计算得出:

scale = 1 : resolution * screen dpi / 0.0254 meters/inch

= 1 : (cos(latitude * pi/180) * 2 * pi * 6378137 * screen dpi) / (256 * 2level * 0.0254)

  以下表格展示了从赤道出计算的每个层级上面的具体地图长宽、分辨率和比例尺信息。

层级

地图高度和宽度 (pixels)

地图分辨率(meters / pixel)

地图比例尺(at 96 dpi)

1

512

78,271.5170

1 : 295,829,355.45

2

1,024

39,135.7585

1 : 147,914,677.73

3

2,048

19,567.8792

1 : 73,957,338.86

4

4,096

9,783.9396

1 : 36,978,669.43

5

8,192

4,891.9698

1 : 18,489,334.72

6

16,384

2,445.9849

1 : 9,244,667.36

7

32,768

1,222.9925

1 : 4,622,333.68

8

65,536

611.4962

1 : 2,311,166.84

9

131,072

305.7481

1 : 1,155,583.42

10

262,144

152.8741

1 : 577,791.71

11

524,288

76.4370

1 : 288,895.85

12

1,048,576

38.2185

1 : 144,447.93

13

2,097,152

19.1093

1 : 72,223.96

14

4,194,304

9.5546

1 : 36,111.98

15

8,388,608

4.7773

1 : 18,055.99

16

16,777,216

2.3887

1 : 9,028.00

17

33,554,432

1.1943

1 : 4,514.00

18

67,108,864

0.5972

1 : 2,257.00

19

134,217,728

0.2986

1 : 1,128.50

20

268,435,456

0.1493

1 : 564.25

21

536,870,912

0.0746

1 : 282.12

22

1,073,741,824

0.0373

1 : 141.06

23

2,147,483,648

0.0187

1 : 70.53

像素坐标


  再通过使用地图层级确定分辨率和比例尺后,我们可以将地理坐标转换成为像素坐标。由于地图的高度和宽度在不同地图层级不一样,所以像素坐标也是如此。像素坐标在左上角总是(0,0),地图右上角为(width-1,height-1),或者参考之前的计算公式为:(256X2level-1,256X2level-1),举个例子,如果地图级别为3,则像素坐标从(0,0),到(2047,2047),如下:

  给定经度纬度和地图缩放级别,像素坐标可以通过以下方式进行计算:

  sinLatitude = sin(latitude * pi/180)

  pixelX = ((longitude + 180) / 360) * 256 * 2level

  pixelY = (0.5 – log((1 + sinLatitude) / (1 – sinLatitude)) / (4 * pi)) * 256 * 2level

  其中经度纬度假设是在WGS84参考系统下的。即使Bing地图使用的是球形投影,将所有地理坐标转换为常用的椭球坐标也很重要,这里我们选择WGS84椭球坐标。我们假设经度范围从-180到+180度,纬度必须限制在-85.05112878到+85.05112878之间。这避免了投影到极点的严重变形,并且使得投影能是正方形。、

切片坐标和Quadkeys


  为了优化地图检索和显示性能,每个层级渲染的地图都被切割成若干个256X256像素的瓦片。由于每个地图级别的像素数量不相同,因此切片的数量也是不同;

  map width = map height = 2level tiles

  所有切片给定了XY坐标,从左上角的(0,0)到右下角的(2level-1,2level-1)。例如,Level3切片坐标从(0,0)到(7,7),如图:

  给定一个像素坐标,你可以根据以下公式很快的计算出包含该坐标的瓦片的XY坐标。

tileX = floor(pixelX / 256)

tileY = floor(pixelY / 256)

  为了优化瓦片的所有和存储,二位瓦片坐标被组合成为四叉树的以为字符串,简称为“QuadKeys”。每个quadkey以特定的地图级别来唯一表示一个瓦片。并且可以将其用作常用的数据库B-tree索引中的键。为了将瓦片坐标转换成为quadkey,y和x坐标转换成二进制(补齐位数为最长结果二进制位数),然后依次从y到x的二进制位数由高到底组合成一个新的二进制数字。然后将其转为四进制字符串,过程如下:

tileX = 3 =011(二进制)
tileY = 5 =101(二进制) quadKey = 100111(二进制) = 213(四进制) = “231”

  quadKey有一些很有趣的特性:

  第一:quadKey的长度(组成quadKey的数字的个数)等于相应瓦片所对应的地图级别。

  第二:任何一个瓦片的quadKey的前面几位都是他所在父瓦片(上一级别中包含该瓦片的瓦片)的前几位。

  如下所示:瓦片2 瓦片20到23的父瓦片,瓦片13 是瓦片130到133的父瓦片。

  最后,quadkeys提供了一个可以保留xy空间中所在切片位置的一维索引的关键字,换句话说,也就是,具有连接x,y坐标的两个瓦片通常具有相对靠近在一起的四个秘钥,这对于优化数据库性能非常重要,因为通常辉耀组的形式请求相邻的瓦片,并且希望将这些瓦片保留在想通的磁盘上,以尽量减少磁盘的读取次数。

Sample Code

文章翻译自:Bing Maps Tile System

Bing地图切片原理的更多相关文章

  1. Bing Maps进阶系列九:使用MapCruncher进行地图切片并集成进Bing Maps

    Bing Maps进阶系列九:使用MapCruncher进行地图切片并集成进Bing Maps 在Bing Maps开发中,由于各种应用功能的不同,更多的时候用户可能需要将自己的一部分图片数据作为地图 ...

  2. Google 地图切片URL地址解析

    一.Google地图切片的投影方式及瓦片索引机制 1.地图投影 Google地图采用的是Web墨卡托投影(如下图),为了方便忽略了两极变形较大的地区,把世界地图做成了一个边长等于赤道周长的正方形(赤道 ...

  3. 百度地图瓦片原理 | 百度map使用教程

    百度地图瓦片原理: http://blog.csdn.net/mygisforum/article/details/22997879 百度map使用教程: http://www.myexception ...

  4. ArcGis(01)——地图切片以及发布底图服务

    ArcGis(01)——地图切片以及发布底图服务 环境 操作系统:win10_x64 Gis版本:Arcis server 10.2 准备 1.tif格式地图资源 2.Arcis server 10. ...

  5. silverlight调用bing地图 和 显示中文地图

    bing地图sdk: https://msdn.microsoft.com/en-us/library/ff428643.aspx 引用dll:https://www.microsoft.com/en ...

  6. 翻译:Bing地图瓦片体系

    Bing Maps Tile System Bing地图瓦片体系 原文链接:http://msdn.microsoft.com/en-us/library/bb259689.aspx Bing Map ...

  7. golang slice 切片原理

    golang 中的 slice 非常强大,让数组操作非常方便高效.在开发中不定长度表示的数组全部都是 slice .但是很多同学对 slice 的模糊认识,造成认为golang中的数组是引用类型,结果 ...

  8. python获取bing地图发布自己的TMS服务(一)下载瓦片

    部分结果 bing地图瓦片使用QuadKey作为命名方式. QuadKey简介 如何计算quadkey 在给定level下,把行号tileY和列号tileX转换为2进制,然后行列交叉存储,再转换为4进 ...

  9. ArcMap 制作广州 18 级地图切片需要多少时间?

    制作地图切片包会随着级别的上升,瓦片数量会指数级地上升,所需的计算时间也是指数级的. 但是 ArcMap 并不会提示时间信息,只有一个圈没完没了地转... 就在这无聊地等待中,我写了这篇帖子. 电脑配 ...

随机推荐

  1. cogs 306. [SGOI] 糊涂的记者

    306. [SGOI] 糊涂的记者 ★★★   输入文件:sign.in   输出文件:sign.out   评测插件时间限制:1 s   内存限制:128 MB [问题描述] 在如今的信息社会中,时 ...

  2. Ruby中使用patch HTTP方法

    Ruby中使用patch HTTP方法 如果使用patch,在后台可以看到只更新了改动的部分: Started PATCH "/ads/5/update" for ::1 at 2 ...

  3. jQuery动画animate()的使用

    自己定义动画效果: 使用方法:animate(js对象,运行时间.回调函数): js对象:{ }描写叙述动画运行之后元素的样式 运行时间:毫秒数 回调函数:动画运行结束后要运行的函数 html代码: ...

  4. Mysql第四天 数据库设计

    不考虑主备.集群等方案,基于业务上的设计主要是表结构及表间关系的设计. 而关于表中字段主要是依据业务来进行定义,我们能够指定的大概有这么几项: 存储引擎 一般用InnoDB,特殊需求特殊选用 字符集和 ...

  5. NEU 1009 Happiness Hotel

    1009: Happiness Hotel 时间限制: 1 Sec  内存限制: 128 MB提交: 173  解决: 19[提交][状态][讨论版] 题目描述 The life of Little ...

  6. 动态连通性问题:union-find算法

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  7. ROS-Rviz-turtlebot3仿真信息查看

    前言:Rviz是ROS自带的一种3D可视化工具. 一.安装turtlebot3功能包 1.1 安装依赖包 sudo apt-get install ros-kinetic-joy ros-kineti ...

  8. Spark Streaming概念学习系列之Spark Streaming的竞争对手

    不多说,直接上干货! Spark Streaming的竞争对手 Storm 在Storm中,先要设计一个用于实时计算的图状结构,我们称之为拓扑(topology).这个拓扑将会被提交给集群,由集群中的 ...

  9. Building Block[HDU2818]

    Building Block Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...

  10. vue-cli搭建项目结构及引用bootstrap

    vue-cli脚手架工具快速构建项目架构: 1.首先默认了有已经安装了node,然后依次执行以下命令: npm install -g vue-cli                   全局安装vue ...