一直在做遥感图像处理的东西,多是一些数字图像处理的分类算法,忘了自己竟是学地学这块的,现在连基本的经纬线都忘了,真是惭愧!现补充如下,以备后用。
关于经纬度的相关定义:
经线:
经线也称子午线,是人类为度量方便而假设出来的辅助线,定义为地球表面连接南北两极的大圆线上的半圆弧。任两根经线的长度相等,相交于南北两极点。每一根经线都有其相对应的数值,称为经度。经线指示南北方向。
本初子午线 :
本初子午线又称“首子午线”或“零子午线”,是计算东西经度的起点,以经过英国伦敦东南格林尼治的经线为本初子午线,作为计算地理的起点和世界标准“时区”的起点。本初子午线以东为东经,以西为西经,全球经度测量均以本初子午线与赤道的交点E点作为经度原点。
子午线命名的由来:
某一天体视运动轨迹中,同一子午线上的各点该天体在上中天(午)与下中天(子)出现的时刻相同。
纬线:
纬线是人类为度量方便而假设出来的辅助线,定义为地球表面某点随地球自转所形成的轨迹。纬线平行于赤道,经线垂直于赤道,任何一根纬线都是圆形而且两两平行。纬线的长度是赤道的周长乘以纬线的纬度的余弦,所以赤道最长,离赤道越远的纬线,周长越短,到了两极就缩为0。纬线指示东西方向。
北回归线(23°26' 22" N)
太阳在北半球能够直射到的离赤道最远的位置,其纬度值为黄赤交角,是一条纬线,大约在北纬23度26分的地方。
赤道(0°N)
通过地球中心划一个与地轴成直角相交的平面,在地球表面相应出现一个和地球的极距离相等的假想圆圈。赤道的纬度是0°。是地球表面的点随地球自转产生的轨迹中周长最长的圆周线,赤道半径 6378.137Km ;两极半径 6359.752Km;平均半径 6371.012Km ;赤道周长 40075.7Km。如果把地球看做一个绝对的球体的话,赤道距离南北两极相等,是一个大圆。它把地球分为南北两半球,其以北是北半球,以南是南半球,是划分纬度的基线,是南北纬线的起点。
南回归线(23° 26' 22" S)
太对应于北回归线,阳在地球上的直射点在一年内到达的最南点所在的纬线。
经度:
是地球上一个地点离一根被称为本初子午线的南北方向走线以东或以西的度数。它是通过某地的经线面与本初子午面所成的二面角,在本初子午线以东的经度叫东经,在本初子午线以西的叫西经。东经用“E”表示,西经用“W”表示。比如:E116.33533°,W116.33533°.经度的每一度被分为60角分,每一分被分为60秒。也可以用小数点位表示。有时西经也被写成负数,如:-116.33533°。
纬度
是指某点与地球球心的连线和地球赤道面所成的线面角,其数值在0至90度之间。位于赤道以北的点的纬度叫北纬,记为N;位于赤道以南的点的纬度称南纬,记为S。
纬度数值在0至30度之间的地区称为低纬度地区;纬度数值在30至60度之间的地区称为中纬度地区;纬度数值在60至90度之间的地区称为高纬度地区。赤道是0°纬线,北纬度的最大值为90°,即北极点;南纬度的最大值为90°,即南极点。
地面法线
垂直于某地参考椭球体表面的线。
经纬度坐标系统:
是经度与纬度的合称组成一个坐标系统。又称为地理坐标系统,它是一种利用三度空间的球面来定义地球上的空间的球面坐标系统,能够标示地球上的任何一个位置。
一个经度和一个纬度一起确定地球上一个地点的精确位置。一个完整的图面地理坐标系统由一个完整的参考椭球体系和一个完整的投影体系组成。
天文地理坐标系统和大地坐标系统
由经线和纬线构成两组互相正交的曲线坐标网叫地理坐标网。由经纬度构成的地理坐标系统又叫地理坐标系。地理坐标分为天文地理坐标和大地地理坐标。天文地理坐标是用天文测量方法确定的,大地地理坐标是用大地测量方法确定的。我们在地球椭球面上所用的地理坐标系属于大地地理坐标系,简称大地坐标系。
经纬度网
大地坐标系是以以参考椭球面为基准面的坐标,地面点P的位置用大地经度L、大地纬度B和大地高H表示。当点在参考椭球面上时,仅用大地经度和大地纬度表示。虽然如此,但是,大地坐标系与经纬度网并不一致,大地坐标系以球面的形式描述了真实的地球坐标,而经纬度网则是在制图时,为满足平面作图的需要(即地图投影),参照一定的投影公式制作成平面地图,并在图上套上经纬线。常用作世界地图的投影有墨卡托投影、高尔投影、摩尔威特投影、等差分纬线多圆锥投影、格灵顿投影、桑森投影、乌尔马耶夫投影等。而横轴墨卡托投影即为高斯-克吕格投影,一般用于我国的地理制图。
我国的高斯-克吕格投影体系
它是一种横轴、椭圆柱面、等角投影。其投影过程可简述如下:椭圆柱面与地球椭球在某一子午圈上相切,这条子午圈叫做投影的中央子午线,又称轴子午线,它也是高斯投影后的平面直角坐标系的纵轴(一般定义为x轴);地球的赤道面与椭圆柱面相交成一条直线,这条直线与中央子午线正交,它是平面直角坐标系的横轴(y轴);把椭圆柱面展开,就得出以(x,y)为坐标的平面直角坐标系。按一定经差将地球椭球面划分成若干投影带,这是高斯投影中限制长度变形的最有效方法。分带时既要控制长度变形使其不大于测图误差,又要使带数不致过多以减少换带计算工作,据此原则将地球椭球面沿子午线划分成经差相等的瓜瓣形地带,以便分带投影。通常按经差6度或3度分为六度带或三度带。六度带自0度子午线起每隔经差6度自西向东分带,带号依次编为第1、2…60带。三度带是在六度带的基础上分成的,它的中央子午线与六度带的中央子午线和分带子午线重合,即自1.5度子午线起每隔经差3度自西向东分带,带号依次编为三度带第 1、2…120带。我国的经度范围西起73°东至135°,可分成六度带十一个,各带中央经线依次为75°、81°、87°、……、117°、123°、129°、135°,或三度带二十二个。
经纬度格式
经纬度格式分为三种:度、度-分、度-份-秒
1. ddd.ddddd °【度 . 度 格式】的十进制小数部分(5位)
2. ddd°mm.mmm’ 【度 . 分 . 分 格式】的十进制小数部分(3位)
3. ddd°mm’ss’’ 【度 . 分 . 秒 格式】
转换公式
度分转换:
将度分单位数据转换为度单位数据
度=度+分/60
例如:
经度 = 116°20.12’
纬度 = 39°12.34’
经度 = 116 + 20.12 / 60 = 116.33533°
纬度 = 39 + 12.34 / 60 = 39.20567°
度分秒转换:
将度分秒单位数据转换为度单位数据
度 = 度 + 分 / 60 + 秒 / 60 / 60
例如:
经度 = 116°20’43”
纬度 = 39°12’37”
经度 = 116 + 20 / 60 + 43 / 60 / 60 = 116.34528°
纬度 = 39 + 12 / 60 + 37 / 60 / 60 = 39.21028°
在实际的处理中,计算相应像元点的地理坐标:
GDAL数据集有两种模式描述栅格位置(用点/线坐标系)以及地理参考坐标系之间的关系:首要的也是最普遍的是使用仿射转换,另一种则是GCPs(多控制点定位方式)
仿射变换
1用GDAL获取四个角点的地理坐标 GDALDataset::::GetGeoTransform() 声明一个存储变量: double geoTransform[6]; geoTransform[0]是左上角像元的东坐标; geoTransform[3]是左上角像元的北坐标; geoTransform[1]是影像宽度上的分辨率; geoTransform[5]是影像高度上的分辨率; geoTransform[2]是旋转, 0表示上面为北方; geoTransform[4]是旋转, 0表示上面为北方; 2相应的放射变换公式: Xp = geoTransform [0] +Xpixel*geoTransform [1]+Yline*geoTransform [2]; Yp = geoTransform [3] + Xpixel*geoTransform [4] + YlineL*geoTransform [5]; 其中Xpixel、YlineL分别地物表示单纯地影像上图像遍历时(x,y)坐标表示,点/线坐标系是从左上角(0,0)点到右下角,也就是坐标轴从左到右增长,从上到下增长的坐标系。 2 GCPs控制点坐标变换: int nGCPs=poDataset->GetGCPCount(); //获得控制点数目 const GDAL_GCP* pGCPs = poDataset->GetGCPs(); //获得GCP控制点,是一个字段 double *geoTransform ;//与前面的仿射变换的相似 GDALGCPsToGeoTransform( nGCPs, pGCPs, geoTransform, TRUE ); //由GCPs获得仿射变换参数 int x,y;//任意点影像行列数 double xx,yy; //任意点影像对应的地理坐标 double ex[nGCPs];//不同控制点算出的地理坐标X double ey[nGCPs];//不同控制点算出的地理坐标Y double pRadio[nGCPs]; //任意点相对与控制点的权值 double total=0; //权值和 double sx=0; //pRadio[i]*ex[i] double sy=0; //pRadio[i]*ey[i] for(int num=0;num<nGCPs;num++) { double gX,gY,tX,tY; tX=pGCPs[num].dfGCPPixel; //GCP位置X tY=pGCPs[num].dfGCPLine; //GCP位置Y gX=pGCPs[num].dfGCPX; //地理位置X gY=pGCPs[num].dfGCPY; //地理位置Y pRadio[num]=1/(double)(sqrt((tX-x)*(tX-x)+(tY-y)*(tY-y))); total+=pRadio[num]; ex[num]=gX+(x-tX)*geoTransform[1]; ey[num]=gY+(y-tY)*geoTransform[5]; sx+=pRadio[num]*ex[num]; sy+=pRadio[num]*ey[num]; } xx=sx/total; yy=sy/total;
对于遥感图像而言,如果想显示在屏幕上,由于图像过大或者屏幕的关系,常常做成金字塔影像,或者拉伸图像数据,使图像产生变形以此来满足显示的需求。
假如已经将经纬度转换成小数点位,即以度为单位,已知道屏幕的高(y)和宽(h),地理坐标区域的范围(maxLon,minLon,maxLat,minLat)..这里我们知道了这些已知的参数
我们可以算出每像素所代表的经度和纬度(有人称这个为比例因子): 公式:scaleX = h/((maxLon-minLon)*3600) ----------X轴上每像素代表的经度秒数; 公式:scaleY = y/((maxLat-minLat)*3600) -----------Y轴上每像素代表的纬度秒数; 算出该地理坐标区域中的任何一点(lon,lat)在屏幕上的坐标 公式:screenX = lon*3600/scaleX; ---------屏幕坐标X轴坐标 公式:screenY = lat*3600/scaleY; ----------屏幕坐标Y轴坐标, lon和lat为任意地点的地理坐标,前面的仿射变换已经算出 假如需要占满整个屏幕: 公式:minX = minLon*3600/scaleX; 区域左边置最左端 公式:minY = minLat*3600/scaleY; 区域上面置最上端 当地地理范围区域占满整个屏幕时,我们需要用到第三步计算出来的 screenX和screenY两个参数 该区域中的任何一点的公式如下: 公式:X = screenX - minX = (lon - minLon)*3600/scaleX; 由于纬度的方向和屏幕Y轴是相反的, 公式:screenMaxLat = (maxLat - minLat)*3600/scaleY; 公式:screenLat = (lat - minLat)*3600/scaleY; 公式:Y = screenMaxLat - screenLat = (maxLat - lat)*3600/scaleY;