Gis 学习 OpenLayers 疑惑总结

坐标系(coordinate system、CS):由两个、三个甚至更多个坐标轴,单位标度等组成,使得可利用数学法则计算距离、角度或其他几何元素。如坐标轴相互垂直的笛卡尔(Cartesian)坐标系;坐标轴不必相互垂直的仿射(affine)坐标系;用经纬度、高程来确定点位置的椭球面(ellipsoidal)坐标系等。

坐标参照系(coordinate reference system、CRS):通过基准面(datum)与真实世界或者说地球相关联的坐标系即坐标参照系。基准面是椭球体用来逼近某地区用的,因此各个国家都有各自的基准面。我们常用的基准面有:BEIJING1954,XIAN1980,WGS1984等。尽管两者有所不同,但由于人懒,在GIS中提及坐标系一般也指坐标参照系。坐标参照系有许多主要子类和辅助类,例如地理坐标系、投影坐标系、地心坐标系、时间坐标系等。

地心坐标系(geocentric cs、GEOCCS):以地球中心为原点,直接用X、Y、Z来进行位置的描述,无需模拟地球球面,常用在GPS中。

地理坐标系(geographic cs、GEOGCS):带Datum的椭球面坐标系,单位经度、纬度,高程用作第三维。参数:椭球体、基准面。

投影坐标系(projected cs、PROJCS):平面坐标系,单位米、英尺等,它用X(Easting)、Y(Northing)来描述地球上某个点的位置。它对应于某个地理坐标系,在UML中表示属于1对多的关系,1个地理坐标系经过不同的投影方式可产生多个投影坐标系。参数:地理坐标系、投影方式。

    

Web墨卡托投影坐标系:

Web墨卡托投影

Google Maps、Virtual Earth等网络地理所使用的地图投影,常被称作Web Mercator或Spherical Mercator,它与常规墨卡托投影的主要区别就是把地球模拟为球体而非椭球体。

什么是墨卡托投影?

墨卡托(Mercator)投影,又名“等角正轴圆柱投影”,荷兰地图学家墨卡托(Mercator)在1569年拟定,假设地球被围在一个中空的圆柱里,其赤道与圆柱相接触,然后再假想地球中心有一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体展开,这就是一幅标准纬线为零度(即赤道)的“墨卡托投影”绘制出的世界地图。从球到平面,有个转换公式,这里就不再罗列。

Google们为什么选择墨卡托投影?

墨卡托投影的“等角”特性,保证了对象的形状的不变行,正方形的物体投影后不会变为长方形。“等角”也保证了方向和相互位置的正确性,因此在航海和航空中常常应用,而Google们在计算人们查询地物的方向时不会出错。

墨卡托投影的“圆柱”特性,保证了南北(纬线)和东西(经线)都是平行直线,并且相互垂直。而且经线间隔是相同的,纬线间隔从标准纬线(此处是赤道,也可能是其他纬线)向两级逐渐增大。

但是,“等角”不可避免的带来的面积的巨大变形,特别是两极地区,明显的如格陵兰岛比实际面积扩大了N倍。不过要是去两极地区探险或科考的同志们,一般有更详细的资料,不会来查看网络地图的,这个不要紧。

为什么是圆形球体,而非椭球体?

这说来简单,仅仅是由于实现的方便,和计算上的简单,精度理论上差别0.33%之内,特别是比例尺越大,地物更详细的时候,差别基本可以忽略。

以整个世界范围,赤道作为标准纬线,本初子午线作为中央经线,两者交点为坐标原点,向东向北为正,向西向南为负。

X轴:由于赤道半径为6378137米,则赤道周长为2*PI*r = 2*20037508.3427892,因此X轴的取值范围:[-20037508.3427892,20037508.3427892]。

这就是底图为什么赋值是如下数据的原因 
maxExtent: new OpenLayers.Bounds(-20037508.34f, -20037508.34f, 20037508.34f, 20037508.34f)

Y轴:由墨卡托投影的公式可知,同时上图也有示意,当纬度φ接近两极,即90°时,y值趋向于无穷。这是那些“懒惰的工程师”就把Y轴的取值范围也限定在[-20037508.3427892,20037508.3427892]之间,搞个正方形。

因此在投影坐标系(米)下的范围是:最小(-20037508.3427892, -20037508.3427892 )到最大 (20037508.3427892, 20037508.3427892)。

对应的地理坐标系:

经度:这边没问题,可取全球范围:[-180,180]。

纬度:上面已知,纬度不可能到达90°,懒人们为了正方形而取的-20037508.3427892,经过反计算,可得到纬度85.05112877980659。因此纬度取值范围是[-85.05112877980659,85.05112877980659]。其余的地区怎么办?没事,企鹅们不在乎。

因此,地理坐标系(经纬度)对应的范围是:最小(-180,-85.05112877980659),最大(180, 85.05112877980659)

OpenLayers.Map 初始化时候赋值地理坐标系

this.maxExtent = new OpenLayers.Bounds(-180, -90, 180, 90); 

二、相关坐标计算

 

 

1 OpenLayers  resolution 设置值的来源

Ground Resolution,地面分辨率,类似Spatial Resolution(空间分辨率),我们这里主要关注用象元(pixel size)表示的形式:一个像素(pixel)代表的地面尺寸(米); Level为0时256*256 赤道周长/256=156543.03 ,Level为1时,图片大小为512*512(4个Tile),那么赤道空间分辨率为:赤道周长/512=78271.51695312。Level为2时,赤道的空间分辨率为 赤道周长/1024,其他纬度为 纬度圈长度1024。很明显,Ground Resolution取决于两个参数,缩放级别Level和纬度latitude ,Level决定像素的多少,latitude决定地面距离的长短。地面分辨率的公式为,单位:米/像素:

ground resolution = (cos(latitude * pi/180) * 2 * pi * 6378137 meters) / (256 * 2level pixels)

2.OpenLayers Map Scale计算,即地图比例尺,图上距离比实地距离,两者单位一般都是米。在Ground Resolution的计算中,由Level可得到图片的像素大小,那么需要把其转换为以米为单位的距离,涉及到DPI(dot per inch),暂时可理解为类似的PPI(pixelper inch),即每英寸代表多少个像素。256 * 2level / DPI 即得到相应的英寸inch,再把英寸inch除以0.0254转换为米。实地距离仍旧是:cos(latitude * pi/180) * 2 * pi * 6378137 meters; 因此比例尺的公式为,一般都化为1:XXX,无单位:

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

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

其实,Map Scale 和 Ground Resolution存在对应关系,毕竟都和实地距离相关联,两者关系:map scale = 1 : ground resolution * screen dpi / 0.0254 meters/inch

同一张地图图片,在不同的电脑上,显示出来的比例尺可能是不一样的。所以用比例尺Scale去获取图片是不准确的。

这个现象的解决办法很容易,即用分辨率去取图片。不管你如何调整屏幕分辨率,这张图片的(空间)分辨率是不变的。这个错误现象产生的原因也很容易想到,好多年前,并没有电脑等屏幕,都是纸质地图,图上距离与实地距离之比就是比例尺,一点问题都没有。然而有了电脑等屏幕后,屏幕上的像素是可以调整的,也即DPI或PPI是变化的,就造成了比例尺的不确定性。但只要图片固定,每一个像素代表多少实地距离,也即分辨率是不变的,这也是为什么遥感影像的精度用(空间)分辨率来衡量的原因。

LonLat lonLat = xy.transform(new Projection("EPSG:4326"), map.getProjectionObject());

// "Converts given lat/lon in WGS84 Datum to XY in Spherical Mercator EPSG:900913"

 EPSG:4326常常被认为是地图投影中最简单的投影方式。然而这句话本身就是不准确的,EPSG:4326只是一个地理坐标系(GEOGCS),而非投影坐标系(PROJCS)。OGC:WKT的表达方式如下:

GEOGCS["WGS 84",

    DATUM["WGS_1984",

        SPHEROID["WGS 84",6378137,298.257223563,

            AUTHORITY["EPSG","7030"]],

        AUTHORITY["EPSG","6326"]],

    PRIMEM["Greenwich",0,

        AUTHORITY["EPSG","8901"]],

    UNIT["degree",0.01745329251994328,

        AUTHORITY["EPSG","9122"]],

    AUTHORITY["EPSG","4326"]]

     

那么我们想当然的认为其等同于的投影,有个专有名词"Plate Carree",亦即没有投影的投影,球面坐标的经纬度直接投影为平面坐标的XY,即x = longitude,y = latitude。这种投影EPSG暂时没有固定的SRID,有个近似(单位是米而非经纬度)的EPSG:54001。因此准确的这种全球投影应该是长方形,宽(360°)是高(180°)的2倍

 


posted @ 2011-10-23 15:48  贝壳笨  阅读(3347)  评论(4编辑  收藏  举报