地图和图块坐标

请选择平台: Android iOS JavaScript

Maps SDK for Android 使用以下坐标系:

  • 纬度和经度值,对应地球上唯一的一个点(Google 使用世界大地测量系统 WGS84 标准)。
  • 世界坐标,对应地图上唯一的一个点。
  • 像素坐标,对应特定缩放级别地图上的特定像素。
  • 图块坐标,对应特定缩放级别地图上的特定图块。

世界坐标

每当 API 需要将真实世界中的位置转换为地图上的位置时,它首先会将纬度和经度值转换为世界坐标。API 使用墨卡托投影法执行这种转换。

为便于计算像素坐标(见下文),我们假定地图在缩放级别为 0 时只包含一个基础尺寸的图块。然后,我们在缩放级别 0 定义像素坐标对应的世界坐标,使用投影将纬度和经度转换为此基础图块上的像素位置。该世界坐标是从地图投影原点到特定位置测量的浮点值。请注意,由于该值为浮点值,因此可能远比显示的地图图像的当前分辨率精确。换言之,世界坐标与当前缩放级别无关。

Google 地图中的世界坐标是以墨卡托投影的原点(即地图西北角,经度为 180 度,纬度约 85 度)为起点测量的,在 x 轴上向东(右)递增,在 y 轴上向南(下)递增。由于基础的墨卡托 Google 地图图块为 256 x 256 像素,因此,可用的世界坐标空间为 {0-256}, {0-256}

请注意,墨卡托投影法在经度方向上的宽度有限,但在纬度方向上的高度无限。我们利用墨卡托投影法在大约 +/-85 度处将基本地图图像截断,使制作出的地图呈方形,从而简化图块选择逻辑。请注意,投影可能在基本地图的可用坐标空间之外生成世界坐标,例如您在离极点非常近的地方绘制时。

像素坐标

像素坐标对应特定缩放级别地图上的特定像素,而世界坐标反映的是指定投影上的绝对位置。像素坐标采用以下公式进行计算:

pixelCoordinate = worldCoordinate * 2zoomLevel

请注意,根据上述公式,缩放级别每增大一级,xy 轴上的尺度均会翻倍,因此分辨率将是前一个级别的四倍。例如,在缩放级别 1,地图包含 4 个 256x256 像素图块,因此像素空间为 512x512。在缩放级别 19,地图上的每个 xy 像素可使用 0 到 256 * 219 之间的值来定位。

世界坐标建立在地图的图块大小基础之上,因此,像素坐标整数部分的作用是标识该位置在当前缩放级别下的确切像素。请注意,对于缩放级别 0,像素坐标等于世界坐标。

现在,我们可以在每个缩放级别精确表示地图上的每个位置。Maps SDK for Android 会根据指定的地图中心点(采用 LatLng 形式)缩放级别和外围 DOM 元素的大小来构造视口,并将此边界框转换为像素坐标。然后,API 从逻辑上确定位于指定像素边界内的所有地图图块。每个地图图块均使用图块坐标来定位,这大大简化了地图图像的显示。

图块坐标

对于较高的缩放级别,API 无法一次加载所有地图图像。相反,API 将各缩放级别的图像分解成一组在逻辑上以便于应用理解的顺序排列的地图图块。当地图滚动至新位置,或者切换到新的缩放级别时,API 会使用像素坐标确定需要哪些图块,然后将这些值转换为需要检索的一组图块。这些图块坐标采用特殊的分配架构,使得在逻辑上更容易确定哪个图块包含指定位置点的图像。

Google 地图中的图块从与像素原点相同的位置开始编号。为了便于 Google 实现墨卡托投影法,原点图块始终位于地图的西北角,x 值从西向东增加,y 值从北向南增加。系统使用基于该原点的 x,y 坐标为图块建立索引。例如,缩放级别为 2 时,地球分成 16 个图块,每个图块都可通过唯一的 x,y 来定位。

分为四行和四列图块的世界地图。

请注意,通过将像素坐标除以图块大小 (256) 并取结果的整数部分,可以生成当前缩放级别的图块坐标。

示例

下例显示了伊利诺州芝加哥市的坐标:纬度/经度值、世界坐标、像素坐标以及图块坐标。使用缩放控件可查看不同缩放级别的坐标值。

如需了解这些坐标的计算方式,请查看此处的代码