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倍