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 值,这个表达式得到的结果就是像素所在图块的横坐标,纵坐标算法相同。 
    4 
 DOM 相对坐标系统 
    
这里的 DOM 是指页面上装载地图的容器,一般是 div 元素。把这个坐标系统看作是基于 DOM 元素而不是基于地图的坐标系统或许更易于理解,这个系统里的坐标指定的是某个点在这个 DOM 容器里的位置,以这个容器的左上角为原点,分别向下( Y轴)和向右( X 轴)延伸。所谓相对坐标,是指这个坐标系统相对地图是固定的,原点不会随地图的拖拽而变化。 
    
在谷歌地图 API 中,使用 GMap2.fromLatLngToContainerPixel(latlng) 可以取得地图上某个点在 DOM 容器中的位置,相反,你可以通过 GMap2.fromContainerPixelToLatLng(pixel) 方法来获取 DOM 容器中某个位置在当前地图上的坐标。 这个坐标系统在你需要在 DOM 容器上添加一些自定义控件并与地图交互的时候可能会有用。 
    5 
 DOM 绝对坐标系统 
    
这个坐标系统是相对上一个系统来说的,从字面可以理解为这是定位在地图上而不是相对地图的坐标系统,如果你在加载地图后只是缩放而没有拖拽地图,那么你会发现这个坐标系统和 DOM 相对坐标系统是重合的。但是,一旦你拖拽地图,就会发现他们的差别了,实际效果你可以在右边的地图里试试。结论就是,这个坐标系统的原点是与 DOM 容器的左上角重合的地图上的点,在拖拽地图的时候原点会随着地图变化,原点左边和上面的点使用负值表示。 
    
这个坐标系统中的坐标和地图上的地理坐标可以用 GMap2.fromLatLngToDivPixel(latlng)  GMap2.fromDivPixelToLatLng(pixel) 这两个方法实现相互转换,在你自定义地图上的叠加层的时候,这两个方法就可以派上用场了。 
    
有一个问题我还没完全理清,就是在 DOM 容器里出现多个世界地图的时候,也就是 DOM 容器足够大的容纳下多个世界地图的图块时, DOM 相对坐标和 DOM 绝对坐标这两个系统显示的坐标似乎有点紊乱,如果你理清了,找出了规律,欢迎共享出来。 
   
最后提一下 GSize ,在说到地理坐标系统的时候我提到了 GLatLng ,这是在谷歌地图 API 里对地理坐标的规范表达,而在表示非地理坐标的时候,就需要用 GSize 这个类了,这是对以像素为单位的坐标的规范表达,和 GLatLng 不同的是,它的构造函数中第一个参数表示 X 轴的坐标,第二个参数表示 Y 轴的坐标。

来源:http://blog.csdn.net/jiali765/archive/2010/03/02/5338469.aspx

加支付宝好友偷能量挖...


评论(0)网络
阅读(169)喜欢(0)Google Maps开发