Google Map API使用详解(八)——Google Map坐标系统总结(上)
要在地图中定位一个点,最常见的就是使用一个地理坐标来定位。但是,谷歌地图API还提供了不同于地理坐标的多套坐标系统,方便我们在需要的时候使用不同的坐标来定位在地图上显示的信息。
这些坐标系统可以简单的总结如下:
1、 地理坐标系统
地理坐标纵向以赤道所在纬度线为原点,分别向南北极延伸,最大值为90。横向以格林威治天文台旧址所在的经度线(本初子午线)为原点,分别向东西延伸,最大值为180。海拔坐标在这里就暂时忽略。
地理坐标的表示方式主要有两种:一种是以度分秒/度分的方式表示,比如(39°56'N,116°20'E);还有一种是使用十进制数的方式表示,比如(39.9333,116.3333)。在表示一个地理坐标的时候,习惯上都使用先纬度后经度的顺序来描述一个坐标,并且,对前一种坐标,是使用追加字母缩写的方式表示方向,而在后一种方式中,一般会使用X轴表示经度,Y轴表示纬度,按照上北下南左西右东的的原则来给坐标加上对应的符号,所以,对(39.9333,116.3333)我们通常就理解为北纬39.9333度、东经116.3333度。
在谷歌地图API中使用后一种方式来表示地理坐标,并使用GLatLng这个类来规范的定义一个地理坐标,该类的构造函数中,第一个参数是纬度,第二个参数是经度。需要注意的是,这两个参数的顺序不同于我们在坐标系中先X后Y的表达方式,而是按照地理坐标先纬度后经度的习惯来表示一个地理坐标,这个原则基本适用于地图API中所有需要表达地理坐标的地方。
2、 图块坐标系统
谷歌地图是使用一系列的大小相同的图片拼接起来的,这些图片在谷歌地图中称之为图块(Tile)。所以,你可以把谷歌地图理解为是使用图块/图片填充起来的一系列网格,在不同的缩放级别,地图被分解为不同数目的网格。详细的说,在缩放级别为0的时候,整个世界地图只有一个网格,缩放级别每增大一级,所有的网格在横向和纵向就分割一次,也就是说,对应于某一特定的缩放级别N,网格的数目就是4的N次方,即4N。这些网格所组成的坐标系统,就是图块坐标系统。
在图块坐标系统中,以缩放级别为0时的世界地图为原点,在缩放级别增大的时候分别向下(Y轴)和向右(X轴)延伸,这样,在指定的缩放级别,我们就可以用一个坐标来指定特定的图块了,如果你有意用你自己的图片替换掉地图中的某个图块,这个坐标系统就能派上用场了。谷歌地图API中还没有一个直接的方法可以取得图块的坐标,再下面的像素坐标系统中介绍了一种方法。
3、 像素坐标系统
上面说到谷歌地图是由一系列大小相同的图片拼接起来的,其实这些图块的大小也是固定的,都是256×256像素大小,所以,在不同的缩放级别,世界地图的像素大小也是固定,比如在缩放级别为0的时候,世界地图的像素大小就是256×256×40。这样,在特定的缩放级别,因为世界地图的像素大小是固定的,组成世界地图的所有像素点就可以形成了一个完整的坐标系统,我们也就可以用像素坐标代替地理坐标指定地图上的某个点,这个坐标系统就是像素坐标系统。
像素坐标系统以缩放级别为0时的世界地图的左上角为原点,使用与图块坐标系统相同的X轴和Y轴,在缩放级别增大的时候分别向下和向右延伸。像素坐标与地理坐标可以相互转换,他们之间的主要区别在于,像素坐标是平面的二维坐标,而地理坐标是曲面的二维坐标(不考虑海拔坐标)。
在谷歌地图API中,可以使用GProjection.fromLatLngToPixel(latlng, zoom)这个方法通过地理坐标得到对应的像素坐标,相反的,可以使用GProjection.fromPixelToLatLng(pixel, zoom)这个方法由像素坐标得出对应的地理坐标。
现在,我们再看看如何通过像素坐标获取对应的图块坐标。上面已经提到每个图块都是256×256像素的固定大小,所以,使用像素坐标值除以256并取整,就可以得到这个像素坐标所在的图块坐标了。使用代码说话:
Math.floor(x / 256),x就是像素坐标的x值,这个表达式得到的结果就是像素所在图块的横坐标,纵坐标算法相同。
(待续)