坐标转换和插值之matlab程序

标签:
matlabnetcdf网格文件坐标转换 |
分类: matlab |
坐标转换和插值之matlab程序
Matlab版本:8.1.0.604 (R2013a)
这里需要用到的命令有:maps, defaultm, projfwd, projinv
Matlab版本:8.1.0.604 (R2013a)
1,
运行maps查看有哪些投影方式
>> maps
MapTools Projections
CLASS
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Cylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Pseudocylindrical
Conic
Conic
Conic
Conic
Conic
Conic
Conic
Conic
PolyConic
PolyConic
PolyConic
PseudoConic
PseudoConic
Azimuthal
Azimuthal
Azimuthal
Azimuthal
Azimuthal
Azimuthal
Azimuthal
Azimuthal
Azimuthal
Pseudoazimuthal
Modified Azimuthal
Modified Azimuthal
Modified Azimuthal
* Denotes availability for sphere only
2,
这里对mercator投影结构进行定义,然后对mstruct进行补全
>>mstruct=defaultm('mercator');
>>mstruct.geoid=almanac('earth','wgs84','meters');
>>mstruct=defaultm(mstruct);
3,
地理坐标投影到直角坐标:
>>[x,y] =projfwd(mstruct,lat,lon);
直角坐标投影到地理坐标:
>>[lat,lon]=projinv(mstruct,x,y);
4,例子:读取netcdf地形文件,并转换到Mercator投影的直接坐标系中,由于转换后坐标间隔变成非均匀的,不利于某些程序处理,这里进行了均匀插值。
首先准备好地形网格文件,该文件是利用GMT软件的grdcut从gebco_08中截取的,该文件信息如下。
>> ncdisp('data\topo.nc');
Source:
Format:
Global Attributes:
Dimensions:
Variables:
主程序:
clear;
%% add paths for functions
addpath BasicFunctions
clear;
%定义读取经纬度范围(degree)
latMin=25;
latMax=35;
lonMin=112;
lonMax=122;
%%读取地形网格文件
%降采样率
samp=1;%不降采样
%samp=2;%每两个点采样一个点
%文件位置
topoGridFile = 'Data\topo.nc';
%读取变量
[topoGrid,lon,lat] = getcdf(topoGridFile, samp,[ lonMin lonMax latMin latMax ]);
%%坐标系变换并均匀插值
%定义变换方式
mstruct=defaultm('mercator');
%定义地球坐标系
mstruct.geoid=almanac('earth','wgs84','meters');
mstruct=defaultm(mstruct);
%坐标系变换
[lon,lat]=meshgrid(lon,lat);
[x,y] =projfwd(mstruct,lat,lon);
%定义直角坐标范围(m)和插值点间隔
xMin=x(1,1);
xMax=x(1,end);
yMin=y(1,1);
yMax=y(end,1);
dx=1000;%m
dy=1000;%m
%dx=5000;%m
%dy=5000;%m
%重新插值成均匀网格
X=xMin:dx:xMax;
Y=yMin:dy:yMax;
[X,Y]=meshgrid(X,Y);
topoGrid_merc=interp2(x,y,topoGrid,X,Y,'linear');
% topoGrid_merc=interp2(x,y,topoGrid,X,Y,'spline');
X=X-xMin;
Y=Y-yMin;
subplot(1,2,1);
ll=[-500,-100,0,50,100,150,500,1000,1500,2000];
contour(X,Y,topoGrid_merc,ll);
caxis([-500,2000]);
colorbar('location','SouthOutside');
subplot(1,2,2);
contour(lon,lat,topoGrid,ll);
colorbar('location','SouthOutside');
其中用到的BasicFunctions中的子程序getcdf:
function [t,x,y] = getcdf(file,Sampling,Dims);
% [t,x,y] = getcdf(file,Sampling,Dims);
%
%
%
end
转换和插值结果:
http://s4/mw690/004f6djqgy6KOWPQ9Pl63&690图一:左图是坐标系转换和线性插值到1km后的结果,右边是原坐标系未插值的结果。
http://s14/mw690/004f6djqgy6KOWU29el4d&690图二:左图是坐标系转换和线性插值到5km后的结果,右边是原坐标系未插值的结果。
http://s16/mw690/004f6djqgy6KOWVjAar4f&690
图三:左图是坐标系转换和样条插值到5km后的结果,右边是原坐标系未插值的结果。
该坐标转换程序为自己摸索,本例使用的是正轴墨卡托投影和WGS84坐标系,并非北京54坐标系/西安80坐标系/UTM投影,其他坐标系和投影方式还须进一步探索