[转载]投影问题总结
2018-08-11 20:15阅读:
地图坐标
大地坐标系:在地面上建立一系列相连接的三角形,量取一段精确的距离作为起算边
,在这个边的两端点,采用天文观测法确定点(经纬度、方位角),用精密测角一起测定各三角形的角值,根据起算边的边长和点位可算出其他点得坐标。我国一般使用北京
54和西安80
二、
Gauss-Kruger
2.1、
简介
又名'等角横切椭圆柱投影”,
该投影按照投影带中央子午线投影为直线且长度不变和赤道投影为直线的条件,确定函数的形式,从而得到高斯一克吕格投影公式。投影后,除中央子午线和赤道为直线外,
其他子午线均为对称于中央子午线的曲线。设想用一个椭圆柱横切于椭球面上投影带的中央子午线,按上述投影条件,将中央子午线两侧一定经差范围内的椭球面正形投影于椭圆柱面。将椭圆柱面沿过南北极的母线剪开展平,即为高斯投影平面。取中央子午线与赤道交点的投影为原点,中央子午线的投影为纵坐标x轴,赤道的投影为横坐标y轴,构成高斯克吕格平面直角坐标系。
高斯-克吕格投影在长度和面积上变形很小,中央经线无变形,自中央经线向投影带边缘,变形逐渐增加,变形最大之处在投影带内赤道的两端。由于其投影精度高,变形小,而且计算简便(各投影带坐标一致,只要算出一个带的数据,其他各带都能应用),因此在大比例尺地形图中应用,可以满足军事上各种需要,能在图上进行精确的量测计算。
2.2、
投影分带
按一定经差将地球椭球面划分成若干投影带,这是高斯投影中限制长度变形的最有效方法。分带时既要控制长度变形使其不大于测图误差,又要使带数不致过多以减少换带计算工作,据此原则将地球椭球面沿子午线划分成经差相等的瓜瓣形地带,以便分带投影。通常按经差6度或3度分为六度带或三度带。六度带自0度子午线起每隔经差6度自西向东分带,带号依次编为第
1、2…60带。三度带是在六度带的基础上分成的,它的中央子午线与六度带的中央子午线和分带子午线重合,即自
1.5度子午线起每隔经差3度自西向东分带,带号依次编为三度带第
1、2…120带。我国的经度范围西起 73°东至135°,可分成六度带十一个,各带中央经线依次为75°、81°、87°、……、117°、123°、129°、135°,或三度带二十二个。六度带可用于中小比例尺(如
1:250000)测图,三度带可用于大比例尺(如 1:10000)测图,城建坐标多采用三度带的高斯投影。
2.3、
坐标
高斯- 克吕格投影是按分带方法各自进行投影,故各带坐标成独立系统。以中央经线投影为纵轴(x), 赤道投影为横轴(y),两轴交点即为各带的坐标原点。纵坐标以赤道为零起算,赤道以北为正,以南为负。我国位于北半球,纵坐标均为正值。横坐标如以中央经线为零起算,中央经线以东为正,以西为负,横坐标出现负值,使用不便,故规定将坐标纵轴西移500公里当作起始轴,凡是带内的横坐标值均加 500公里。由于高斯-克吕格投影每一个投影带的坐标都是对本带坐标原点的相对值,所以各带的坐标完全相同,为了区别某一坐标系统属于哪一带,在横轴坐标前加上带号,如(4231898m,21655933m),其中21即为带号。
三、
UTM
UTM投影全称为“通用横轴墨卡托投影”UNIVERSAL TRANSVERSE MERCATOL PROJECTION
,是一种“等角横轴割圆柱投影”,椭圆柱割地球于南纬80度、北纬84度两条等高圈,投影后两条相割的经线上没有变形,而中央经线上长度比0.9996。UTM投影是为了全球战争需要创建的,美国于1948年完成这种通用投影系统的计算。与高斯-克吕格投影相似,该投影角度没有变形,中央经线为直线,且为投影的对称轴,中央经线的比例因子取0.9996是为了保证离中央经线左右约330km处有两条不失真的标准经线。
UTM投影分带方法与高斯-克吕格投影相似,将北纬84度至南纬80度之间按经度分为60个带,每带6度.从西经180度起算,两条标准纬线距中央经线为180KM左右,中央经线比例系数为0.9996
四、
Gauss—Kruger与UTM区别
UTM投影与高斯投影的主要区别在南北格网线的比例系数上,高斯-克吕格投影的中央经线投影后保持长度不变,即比例系数为1,而UTM投影的比例系数为0.9996。UTM投影沿每一条南北格网线比例系数为常数,在东西方向则为变数,中心格网线的比例系数为0.9996,在南北纵行最宽部分的边缘上距离中心点大约 363公里,比例系数为 1.00158。
高斯-克吕格投影与UTM投影可近似采用 Xutm=0.9996 * X高斯,Yutm=0.9996 * Y高斯进行坐标转换。
五、
以中国为例
我国一般采用Gauss—Kruger,在比例尺 1:2.5万-1:50万图上采用6°分带,对比例尺为 1:1万及大于1:1万的图采用3°分带。我国规定将各带纵坐标轴西移500公里,即将所有y值加上500公里,坐标值前再加各带带号以18带为例,原坐标值为y=243353.5m,西移后为y=743353.5,加带号通用坐标为y=18743353.5
六、
大地基准面datum
概念:精致海水面向大陆延伸形成的不规则封闭曲面。(我国常用北京54和西安80)
七、
椭球体spheriod
参考椭球体和大地基准面的相对关系可用3个平移、3个旋转、1个缩放来描述。每个椭球体对应哪个一个活多个大地基准面
名称
|
年份
|
长半轴
|
短半轴
|
扁率
|
WGS84
|
1984
|
6378137
|
6456752.3
|
1:298.257
|
Krasovsky
|
1940
|
6378245
|
6356863
|
1:298.3
|
IAG-75
|
1975
|
637814
|
6356755.3
|
1:298.257
|
八、
常用大地坐标系
名称
|
投影
|
椭球体spheriod
|
基准面datum
|
北京54
|
Grass-Kruger/UTM
|
Krassovsky
|
北京54
|
西安80
|
Grass-Kruger/UTM
|
IAG75
|
西安80
|
WGS84
|
UTM
|
WGS
|
|
注:很多软件将datum北京54近似为Krassovsky
九、
ENVI中定义以上坐标
HOMEITTIDL7.0|productsenvi4.5map_proj文件
其中有
Eclipse.txt:椭球体
Datum.txt:基准面
Map_proj.txt:坐标系参数
|
9.1、
添加椭球体
Krasovsky, 6378245.0,
6356863.0
IAG-75, 6378140.0,
6356755.3
WGS84,
6378137
加入到eclipse.txt末端
9.2、
添加基准面
Beijing-54, Krasovsky,
-12, -113, -41
Xi’an-80, IAG-75, 0,
0
加入到datum.txt末端
9.3、
定义坐标系
若投影为UTM,则map-customize map
projection,投影类型选Transverse
Mercator,其中Scale
Factor填0.9996, False
easting填500000并保存。在map-proj.txt可看到自动添加该坐标系。
十、
ENVI/IDL的主要投影函数
10.1、
主要投影函数
·
获取投影:envi_get_map_info(fid=fid)
·
创建投影:envi_proj_create()
举例:eg1创建经纬度投影:envi_proj_create(/geographic)
eg2创建UTM投影:units=envi_translate_projection_units(‘meters’)
envi_proj_create(/UTM,Zone=49,units=units)
eg3创建Albers投影: name='China'
datum='WGS84'
params=[6378137.0,6356752.3,0.00000000,105.00000,0.0000000,0.00000000,25.0000000,47.000]
units=envi_translate_projection_units('meters')
proj=envi_proj_create(name=name,datum=datum,param&s=params,type=9,units=units)
·
创建地图坐标:envi_map_info_create(name,datum,params,proj,units,mc,ps,type)
注:mc[0],mc[1]是图像左上角第一个像素坐标;mc[2],mc[3]是该点的地理坐标
ps是图像分辨率
举例:
eg4创建Albers投影下的地理坐标:Params=[6378137.0,6356752.3,0.00000000,105.00000,0.0000000,0.00000000
$,25.0000000,47.000];
ps=[1000,1000];
mc=[0,0,oxmap,oymap]
datum='WGS-84';
name='Albers';
map_info=envi_map_info_create(name=name,datum=datum,params=params,mc=mc,ps=ps,type=9)
eg5创建经纬度投影下的地理坐标:
Ps=[2,2]
Mc=[0.5D,0.5D,-180,90]
;0.5D是图像起始点中心位置,[-180,90]是该点地理坐标,这里为全球
Map_info=envi_map_info_create(name=’geographic’,mc=mc,ps=ps,proj=proj,/geographic)
eg6创建UTM投影下的地理坐标:
units = ENVI_TRANSLATE_PROJECTION_UNITS('km')
datum = 'North America
1983'
mc = [0D, 0,
177246, 8339330]
ps=[30, 30]
map_info =
ENVI_MAP_INFO_CREATE(/UTM, ZONE=23, /SOUTH,DATUM = datum, UNITS =
units, MC = mc, $PS = ps)
·
转换投影、坐标:图像坐标、空间坐标互转:envi_convert_file_coordinates
投影互转:envi_convert_projection_coordinates
单位转换:envi_translate_projection_units(‘val’)
举例:
eg7图像坐标到经纬度坐标的正/逆计算:
;输入坐标[10,100],[20,200],[30,300]
Xf=[10,20,30];x方向坐标点
Yf=[100,200,300];y方向坐标点
envi_convert_file_coordinates,fid,xf,yf,xmap,ymap,/to_map;加/to_map是将文件坐标转化为经纬度坐标
print,xmap,ymap;打印输出结果
102.74526
102.74551
102.74575
25.342574
25.340317
25.338060
;逆运算,不加/to_map则将xmap,ymap对应的经纬度转换为文件坐标
;x方向放到xfile,y方向放到yfile
envi_convert_file_coordinate,fid,xfile,yfile,xmap,ymap
print,xfile,yfile;打印输出结果
10.000000
20.000000
30.000000
100.000000
200.000000
300.000000
eg8投影互转:
;将经纬度投影坐标转化为UTM投影坐标并输出结果
iproj=envi_proj_create(‘/geographic)
oproj=envi_proj_create(‘/UTM,Zone=49,units=units)
envi_convert_projection_coordinates(xlong,ylat,iproj,xmap,ymap,oproj)
print,xmap,ymap
eg9单位转换:
;
Val can
be either an integer or a string. If Val is an integer, the
function returns the string-format description of the projection
units. If Val is a string, the function returns the integer code
describing the projection units
;val可以是integer或者string,该函数用于两者的互相转换,返回值是投影单位,一般是令val为string,返回值得到integer,比如geographic用’degree’,State
Plane用’feet’,其他都是’meters’或者’km’
10.2、
练习
Q1:在经纬度以外的投影下使用conver_file函数,则xmap和ymap结果均为米单位的坐标(例如33320.9,44937.0),如何得到经纬度坐标?
A1:思路:
1用envi_convert_file_coordinates将行列号转换为空间坐标(单位:meter);2用envi_proj_create创建经纬度投影;3用envi_convert_projection_coordinates将原始图像投影转换为经纬度,此时显示的空间坐标则以degree为单位;4检查转换是否正确再用一次1回到行列号
代码:
;输入坐标
xf=[0,1]
yf=[0,0]
;转换为空间坐标
envi_convert_file_coordinates,fid,xf,yf,xmap,ymap,/to_map
print,xmap,ymap
;创建经纬度投影
oproj=envi_proj_create(/geographic)
Albers_map_info=envi_get_map_info(fid=fid)
proj=Albers_map_info.proj
;转换为经纬度
envi_convert_projection_coordinates,xmap,ymap,proj,oxmap,oymap,oproj
print,oxmap,oymap
;将经纬度转换回地图坐标
envi_convert_file_coordinates,fid,xfile,yfile,xmap,ymap
print,xfile,yfile
;输出结果为:
971755.83
972755.83
3961681.8
3961681.8
116.07545
116.08675
36.527518
36.526532
0.00000000
1.0000000
0.00000000
0.00000000
Q2:有组代码为envi_convert_file_coordinates, fid,
xf, yf, x, y
for i=0,num-1 do begin
value(i)=data(xf(i),yf(i))
endfor
但问题是提取的结果和用envi自带的pixel
locator找到的像元点不是同一个,而把代码改为value(i)=data(xf(i),yf(i)+1)后反而对了,为什么?
A2:注意看第一个练习可知convert_file图像坐标的输出结果并不是[0,0][1,0],所以要用round取整
即value =
data[round(xf),round(yf)]