m_map中文文档

参考备用


M_Map工具箱是为matlabv5及更高版本所写的地图工具,主要包括:

1、用19种不同的椭球投影方式将数据进行投影的过程(及其逆过程)

2、用经纬度的形式或者二维XY坐标的形式表达数据的格网生成过程

3、海岸线数据库(1/4°分辨率)

4、全球高程数据库(1°分辨率)

5、免费获得高分辨率海岸线和水深数据库的方法

v1.4g具有的新功能如下:

1.      m_ellipse.m绘制潮汐椭圆(例如:T_Tide)

2.      提供使用十进制度或者度分秒形式作为坐标轴标签的选择

3.      Matlab2013b在坐标纵横比轴属性方面有很大问题,它会影响到几乎所有图形的显示,这个版本的m_map在绝大多数工作区都是可以使用的,但还是尽量避免使用Matlab2013b

v1.4f具有的新功能如下:

1.      m_shaperead.m可以读shp文件,(所以在其他多种选择中NaturalEarth可以作为政治界线而不是DCW)

2.      支持GSHHS v 2

3.      部分兼容OCTAVE

v1.4e具有的新功能如下:

1.      GSHHS目前提供世界河流和地理边界数据库,通过m_gshhs.m将这些数据联系起来的功能也被添加了进来

2.      新加了Ellipsoidal Albers和Lambert conic两种投影方式

v1.4d具有的新功能如下:

1.      修正了matlab7中廓线的一些问题

2.      增加了Robinson 投影

3.      当前版本matlab的一些兼容性报告

4.      升级了一些数据库的HOOKs

v1.4b具有的新功能如下:

1.      m_hatch:处理数据块

2.      过时的斑化海岸线

3.      m_lldist

4.      m_fdist

v1.4具有的新功能如下:

1.      m_pcolor

2.      m_coord(地理或地磁坐标系统)

3.      修正了一些小的bug

4.      在地图中加入卫星图像数据的例子和方法

如何获得M_map

你可以下载任意一种格式的m_map,如gzipped tar-file或者zip archive,点击连接直接下载。如果你解压了文件,确保要解压它的子文件,两种文件都是650k,如果你已经到了这一步,阅读Getting started部分的User's guide 来正确安装m_map,第9节和10.1节将分别介绍安装TerrainBase 和 GSHHS 。

为了介绍m_map的功能,提供了很多例子,略图如上图1。

你也可以获得m_namebox,一套自动将名字添加到你的地图中的工具,从它的主页下载http://www.nersc.no/~even/ .

用户指南

1启动

首先,下载文件,任意一种格式,然后解压,如果你解压了.zip文件,确保同时解压它的子目录。现在,启动matlab,确保工具箱在你的路径中。可以通过cd改变到正确的目录

另一种方法,如果你解压文件到目录/users/rich/m_map下,你可以用下面的方式把它加入到你的搜索路径中:

path(path,'/users/rich/m_map');

或者是:

addpath /users/rich/m_map

注意:如果你想安装m_map,使他可以被所用用户使用,这样做:解压文件到matlab安装目录的toolbox文件里,将该路径添加到matlab的搜索路径中,更新缓存文件,语句如下:

rehash toolboxcache

安装高分辨率水深测量数据库的方法在第9节,安装高分辨率GSHHS海岸线数据库的方法在第10节。我们要检查一下,基本的安装是不是正确

看一个例图,如下:

m_proj('oblique mercator');

m_coast;

m_grid;

这是俄勒冈州/不列颠哥伦比亚海岸的地图,使用Oblique Mercator投影方式,一些复杂的地图可以通过使用m_demo来产生。例如:

>>m_demo(1);


第一行代码初始化投影,对于每一种投影都有设定的默认值,所以你可以很容易看出某一种特点的投影的样子,所有的投影都有一系列可选的参数,如果不使用默认值,你将使用到:

m_proj('obliquemercator','longitudes',[-132 -125],'latitudes',[5640],'direction','vertical','aspect',.5)

各个选项的准确含义在第2节介绍,然而要注意到,精度是用带符号的形式表示的-西经为负值,东经为正值,同时应注意到,使用的是十进制度的形式,即西经120°30′应该表示为-120.5°。

第二行代码是画海岸线,使用1/4°分辨率的海岸线数据,使用自己的数据库,可以画出更高分辨率的海岸线,参看第7节。

m_coast可以调用许多参数,如:

m_coast('linewidth',2,'color','r');可以画出一个更宽的红色的海岸线。

也可以填充海岸线,使用patch选项,

m_coast('patch',[.7.7 .7],'edgecolor','none');

 m_map中文文档_第1张图片

画出一个灰色填充没有边缘的海岸线

第3行叠加网格,尽管有许多可选的参数可以用来定制格网的外观,但经常还是使用默认值(像这几个例子一样),这些选项在第4节讨论,你可以使用GET语句获得选项表。

m_grid get

类似于在常规的画图中使用get(gca)语句的功能

最后,假使你想在129W,48 30'N.这个位置显示和标注一个mooring,

[X,Y]=m_ll2xy(-129,48.5);
line(X,Y,'marker','square','markersize',4,'color','r');//set(line)//查看line属性
text(X,Y,' M5','vertical','top'); /set(text)//查看text属性

m_112xy(以及它的逆m_xy112)的功能是将经纬度坐标转换为它对应的投影坐标(投影坐标转换成经纬度坐标),在转换成投影坐标系统中,可以使用各种选项,如果你愿意接受默认值,你可以使用内置的功能m_line和m_text(就不用转换成xy的样子了)

m_line(-129,48.5,'marker','square','markersize',4,'color','r');
m_text(-129,48.5,' M5','vertical','top');

最后,我们想稍微改变一下网格的细节,注意,一个给定的地图只能初始化一次。

clf

m_coast('patch',[.7 .7.7],'edgecolor','none');

m_grid('xlabeldir','end','fontsize',10);

m_line(-129,48.5,'marker','square','markersize',4,'color','r');

m_text(-129,48.5,' M5','vertical','top');

m_map中文文档_第2张图片

2指定投影

为了获得当前投影,使用:

m_proj get;

返回:

Current mapping parameters -

 Projection: Oblique Mercator  (function: mp_omerc)

 longitudes: -132 -125                            

 latitudes: 56 40                                

 Aspect ratio: 0.5                                

 Baseline direction ver   

或者:

m_proj(‘set’);

返回如何列表:

Available projectionsare:

     Stereographic

     Orthographic

     Azimuthal Equal-area

     Azimuthal Equidistant

     Gnomonic

     Satellite

     Albers Equal-Area Conic

     Lambert Conformal Conic

     Mercator

     Miller Cylindrical

     Equidistant Cylindrical

     Oblique Mercator

     Transverse Mercator

     Sinusoidal

     Gall-Peters

     Hammer-Aitoff

     Mollweide

     Robinson

     UTM

如果想要获得某个投影的细节,只要在上面的命令里加入投影名。

m_proj(‘set’,Stereographic);

得到:

'Stereographic'                                                           

    <,'lon',center_long>                                              

      <,'lat',center_lat>                                                

     <,'rad', ( degrees |[longitude latitude] ) | 'alt', alt_frac >

     <,'rec', ( 'on' | 'off' |'circle' )>       

你也可以获得当前投影的一些细节,例如,你想看一下sinusoidal投影的一些默认参数值,首先初始化投影方式,然后使用set

>> m_proj('set','stereographic')

>> m_proj get

Current mappingparameters -

 Projection: Sinusoidal  (function: mp_tmerc)

 longitudes: -90  30 (centered at -30)      

 latitudes: -65 65                         

 Rectangular border: off 

为了初始化投影,通常需要指定位置参数来定义投影的几何形状,纬度范围,中央经线等,以及一些能够确定地图范围的参数(可以是一个正交轴,能确定范围的边界点等),这些参数在投影之间略有差别。

两个比较有用的投影性能:

1)保持区域角度不变

2)保持区域面积不变的能力

第一种叫正形投影,第二种叫等积投影。没有哪种投影方式可以满足上述两种条件,许多全球性的投影则一个也满足不了,相反,人们正在尝试从审美的角度进行各种条件的平衡。

注意:大多数投影都是球形的而不是椭球的,UTM投影是椭球投影,兰伯特等角圆锥投影和阿尔伯特等积圆锥投影如果需要的话可以指定为椭球投影,当处理的数据是加拿大的省或者是美国的州的时候似乎有点用,通常使用其中一个投影,这不太可能成为一个正常使用的问题。

1方位投影

在方位投影中,地球上的点被投影到一个相切的平面上,使用这种投影得到的地图,中心点到任意点的方位角保持不变。穿过中心点的大圆弧投影后为直线,不经过中心点的圆弧投影后为弧线,这种地图经常在画圆形边界时使用,定义一个方位投影需要用到如下参数:

<,'lon',center_long>

<,'lat', center_lat>

这两个参数是定义地图的中心点,地图都是被校正了的,中央经线是垂直的,北端点在中心点上。

<,'rad',( degrees | [longitude latitude] )>

这个参数定义地图的范围,或者指定以度为单位的角距离(例如90度代表的是一个半球),或者指定边界上的一个点的坐标。

<,'rec',( 'on' | 'off' | 'circle' )>、

默认的是一个闭合的地图,圆形边界,但是也可以指定矩形边界,然而矩形边界的地图通常使用圆柱投影或者圆锥投影。

<,'rot',degrees CCW>

旋转图片使中央经线不垂直。

立体投影

立体投影是正形非等积投影,这种投影经常用在极地地区

正交投影

这种投影是等积非正形投影,但是类似于一个全球的视角

方位等积投影

有时候也可以叫做兰勃脱正形等积投影,这种投影是等积非正形投影。

方位等距投影

这种投影非等积非正形,但是所有点到中心点的方向和距离是不变的

点且投影

这种投影非等积非正形,地图上的所有直线都是大圆弧,在地图的边缘会出现很大的角度变形,所以最大角距应该控制在-20到30度之间。

卫星投影?

这是一个类似于在特定高度的一个卫星观察到的地球的透视图,不用指定地图的半径,只要指定视点高度。

<,'alt',altitude_fraction >

这个属性值代表的是以地球半径为单位的视点高度,如一个卫星在3倍地球半径的高度,则指定高度值为2

2圆柱投影或者伪圆柱投影

圆柱投影是通过将点投影到包裹着地球的一个面上形成的,只在某个大圆上与球相交,对于侧向跨度很大的区域,这种投影方式非常有效,在中纬度地区也广泛使用,在此也介绍两种伪圆柱投影,他们和圆柱投影有很大的相似性。

这种地图通常具有矩形边界(除了正弦投影以及横轴墨卡托投影)

1 墨卡托投影

正形投影,投影到与赤道相切的包裹地球的圆柱面上,投影面上的直线为等方位线,下面的一些属性能够影响这种投影的效果:

<,'lon',( [minmax] | center)>

或者定义精度范围,或者定义中央经线

<,'lat', ( maxlat| [min max])>

北纬或者南纬的范围经常设为一样的,可以用一个值来指定,但是如果需要,也可以指定不同的值。

2米勒投影

这种投影非正形非等积,但是对于世界地图看起来更好看,属性和上面的墨卡托投影一样。

3 等距圆柱投影

这种投影非正形非等积,它由等距的经纬线组成,经常用于数据的快速作图,这里简单介绍,以便这种地图能够充分利用这种格网生成程序,这种投影也被叫做改良普通圆柱投影,属性值和墨卡托投影一样。

4 倾斜墨卡托投影

当相切的圆比较随意时使用这种投影,在海岸线较长,形状不规则或者对齐的区域,这种投影非常有用。它是正形非等积投影,一下参数控制着投影效果:

<,'lon',[ G1 G2]>

<,'lat', [ L1 L2]>

两个点确定一个圆,也确定了地图的边界,这2个点(G1,L1)和(G2,L2)在地图的顶部或者底部,左侧或者右侧,当然这取决于direction属性。

3 圆锥投影

4 各种各样全球性的投影

5 我们该用哪种投影呢

6 比例尺

7 地图坐标系统-地理坐标和地磁坐标

3海岸线和深度测量

m_map 包含两个相当简单的海岸线和全球高程数据的数据库。高分辨率的数据库在这个版本中并不包含,因为它数据量大,处理耗时。如果需要更高分辨率的地图,第9节和第10节介绍了如何加载一些免费的高分辨率数据集。如果想要加载自己的数据,阅读第7节和第8节。

1海岸线选项

m_map包含1/4度分辨率的海岸线数据局。对于覆盖全球大范围区域的地图非常合适,但是对于一些大比例应用就显得太过粗糙。对这种区域地图不满意的用户可以阅读第7节和第10节,获得制作和使用高分辨率海岸线数据的信息。m_map的海岸线数据可以使用m_coast获得,海岸线被划为简单的线。使用:

m_coast('line',...optional line arguments );

或者:

m_coast( optional line arguments);

此处的参数选项都是指定线的属性的一些标准选项例如线条样式,线宽,颜色等。

海岸线也可以被填充:

m_coast('patch', ...optionalpatch arguments );

此处的参数选项都是指定填充的属性的一些标准属性,如:

m_coast('patch',[.7 .7.7],'edgecolor','g');//set(patch)查看颜色选项,help plot

绘制灰色填充,轮廓为绿色,当绘制了填充时,湖泊和内陆海洋给轴背景色。

许多老的海洋地图使用斑点土地边界,这种黑白相间的地图看起来非常漂亮,你可以可以做出这种效果:

m_coast('speckle', ....optionalm_hatch arguments);

它调用m_hatch,,如果图像中没有太多狭长岛屿和湖泊,它看起来将非常漂亮。注意:海岸线通常绘制非常迅速,填充海岸线将会花费相当长的时间(因为地图的边界不一定是矩形的,每一部分必须通过m文件绘制);

2地形水深选项

m_map可以得到1°分辨率的全球高程数据(通常该数据在MATLAB发布文件中,在$MATLAB/toolbox/matlab/demos/earthmap.m)。默认设置的等高线图可以用如下命令绘制:

m_elev;

还可以指定不同的级别:

m_elev('contour',LEVELS, optionalcontour arguments);

例如,如果你想要所有的等高线都是深蓝色,使用下面语句:

m_elev('contour',LEVELS,'edgecolor','b');

LEVELS未知变量,去掉之后的效果如上图。

也可以进行等高线填充

m_elev('contourf',LEVELS, optionalcontourf arguments);

最后,如果你想提取其中的高程值以备用,可以使用:

[Z,LONG,LAT]=m_elev([LONG_MINLONG_MAX LAT_MIN LAT_MAX]);

将会返回在经纬度各未知的z值得矩阵。(提取某经纬度范围的高程信息)

4个性化坐标轴

1格网线和标签

为了获得完美的格网,你可能想要尝试不同的格网选项,在此有两个非常有用的函数,m_grid是画格网的,m_ungrid是擦出当前格网的(留下海岸线和用户数据),尝试:

m_proj('Lambert');

m_coast;

m_grid;

获得了北美地区的兰勃脱投影,

现在输入:

m_ungrid;

海岸线还在但是格网消失,坐标显示为XY投影坐标的形式,现在,使用:

m_grid('xtick',10,'tickdir','out','yaxislocation','right','fontsize',7);

有许多选项可以改变。

       'box',( 'on' | 'off' | 'fancy' )

这个选项用来指定是否需要一个外轮廓。有三种外轮廓可供选择,on 默认值,就是简单的一条线,有两中fancy轮廓线可供使用,如果tickdir属性值是in,会有一个黑白相间的条纹

如果tickdir设置为out,会画出一个复杂的条纹,

这种边界只适用于以经纬度表示边界的地图上,不适用于方位投影,如果该功能选项设置的不合理则会给出警告信息。

'xtick',(num | [value1 value2 ...])

这条命令指定经度格网的位置和数值,如果只是给定了一个数,画出的格网线是近似等距的(这个数值是一个约数,因为m_grid总是想让间隔看起来更加好看),当使用位置向量可以指定准确的位置,,ytick与此类似。

'xticklabels',[label1;label2...]

指定标注的值,可以是数值,也可以使字符串,yticklabels与此类似。

'xlabeldir',( 'middle' | 'end' )

经度标签要么在格网线短点中间的位置(在格网线正交的位置),要么在这些格网线端点向外延伸位置,ylabeldir与此类似。(默认Middle);

end的样子:

'ticklen',value

指定标签的长度,类似plot中的width;

'tickdir',('in' | 'out' )

指定标记实在内部还是外部,如果box被设置为fancy,它有用来指定fancy的样式。

'tickstyle',('dd' | 'dm' )

指定坐标轴标注是用度的形式还是度分秒的形式,默认为度分秒的形式。

'color',colorspec

'linewidth',value

'linestyle',( linespec | 'none' )

'fontsize',value

'fontname',name

指定线或者文件的一些属性

'XaxisLocation',('bottom' | 'middle' | 'top' )

指定在哪里做X轴,是在最底部还是最顶部还是中间。Middle:

'YaxisLocation',('left' | 'middle' | 'right' )

指定Y轴是在最左边,中间,还是在最右面

2标题和轴标记

用title(‘’)和xlabel,ylabel可以为地图添加标题和坐标轴说明

3图例

可以用m_legend给一副地图添加图例,当前只有一部分图例的功能可以使用,通过使用鼠标可以拖动或者删除图例。

4比例尺

可以用m_ruler给一副地图添加比例尺,比例尺可以使垂直的或者水平的,并给添加一些看起来很好看的注记,尽管通过调用其他参数可以改变,位置使用规范化坐标,{0,1}之间,所以你可以注记调整它在地图中的位置,最好在调用了m_grid 之后调用他,因为m_grid重置了初始化值。

例如:

m_ruler([.1  .2],.1);

 

5添加自己的数据

工具包的目的是允许用户画出自己的数据,一旦你选择了格网和海岸线数据,你就可以使用内置的m_map绘图功能添加自己的线,文件或者是等高线。这些函数将经纬度坐标转换成投影坐标系的坐标。绘图功能与标准的matlab画图功能类似,将在下一部分进行讨论。

有时候,你并不想直接画出数据,而是想将你的数据再经纬度坐标和投影坐标之间进行转换,这通常发生在你想使用ginput交互式的选择一些点的时候,或者你想画出与屏幕上的某些特定点想联系的标签而不是一个具体的经纬度。投影转换程序在第5.2和5.3节讨论,一旦经纬度坐标被转换成投影坐标,matlab的标准绘图功能就可以使用了。

地图一般都要画在坐标轴的边界以内,因此它们的比例有时候是不一致的,如果你想画出一个给定比例尺的地图,如1:20000或者其他类似的比例,可以使用m_scale,参见第2.6节。数据单位为投影坐标系,表达成地球半径的一个分值,为了获得地图上两点之间的距离,使用投影坐标系下两点之间的笛卡尔距离然后乘以地球半径,通常为6370km(UTM投影不需要转换)

注意:由于经度值模棱两可,数据有时候在图上不能显示的问题经常出现,例如,如果精度范围是[-180 180],在圆柱或者圆锥投影钟,一个点的经度,比如说是200度,那将不能显示出来,这并不是一个bug,处理包裹曲面剪切需要增加点,而不是仅仅移动点,因此与许多应用部兼容?????

1画线、文本、箭头、填充、等高线等

大多数情况下,我们并不想要知道投影坐标是多少,我们仅仅是要画出特定经纬度坐标的一些东西。大多数情况下,我们做地图,也是指定一些经纬度坐标,而不是投影坐标。在m_map中,不再使用如plot,line,text,quiver,coutour,而是使用等价的可以识别经纬度的函数,添加m_前缀的函数名,如:

m_plot(LONG,LAT,...lineproperties)   % draw a line on a map(erase current plot)

 m_line(LONG,LAT,...line properties)  % draw a line on a map

 m_quiver(LONG,LAT,U,V,S)             % A quiver plot

 m_text(LONG,LAT,'string')            % Text

 m_patch(LONG,LAT,..patch properties) % Patches.

这些函数都可以内部进行坐标转换,如果需要的话还可以返回向量句柄。它和标准的matlab函数之间的差别在于前两个参数必须是经纬度。

使用m_patch的一个警告,出于兼容性的原因,他和海岸线填充使用的是相同的代码。海岸线要么是'islands',要么是'lakes',m_map通过假设曲线是有方向的来确定他们之间的差异,所以当我们沿着曲线走的时候,‘land’总在我们的右手方向,这和patch中经常填充内部区域的约定有一点不一致,在笛卡尔坐标系中,跟踪这种差异相对简单,但是在求坐标系中却不是那么容易。缺乏其他信息的情况下,m_patch努力实现正确的功能,但有时候也会处理不好,如果填充错了,试着使用命令flipud或者fliplr来扭转点的顺序。

以经纬度方式组织的格网数据也可以contoured:

m_contour(LONG,LAT,VALUES)

m_contourf(LONG,LAT,VALUES)

这个功能也可以返回图形对象句柄。例如画等高线??

[cs,h]=m_contour(LONG,LAT,VALUES)

clabel(cs,h,'fontsize',6);

2画images和p_color

3绘制航迹线

4绘制范围圆环和测地线

5将经纬度坐标转换成投影坐标

如果你想使用投影坐标(也许你想计算地图的面积,距离或者你想在地图的左上角画一个图例)下面的命令可以将经纬度坐标转换成投影坐标。

[X,Y]=m_ll2xy(LONG,LAT,...optional clipping arguments )

此处,LONG,LAT ,X, Y,都是相同大小的矩阵,在地图的中间,投影坐标和真实距离是基本相等的,表达成打球半径的分数的形式,为了获得这段距离,乘以地球半径就可以了,大约是6370km,UTM投影除外,她提供的是米。

可选的参数有:

'clip','off'

 

6将投影坐标转换成经纬度坐标

投影坐标转换成大地坐标非常直接:

[LONG,LAT]=m_xy2ll(X,Y)

没有其他选项。

7计算两点之间的距离

6更复杂的图

想要画更复杂的图,参加例子,这些图包含在m_demo中。

7从图像中移除数据

一旦地图包含很多元素,为了满足人们自然的需求,通常还会包含一些多于的东西,可以让图像看起来更加美观。如果图像包含的海岸线较为复杂,画起来要很长时间,如下面讨论的,快速绘图就变得非常耗时,m_ungrid可以用来选择性的移除图像的一些部分,例如:

m_proj('lambert','long',[-160-40],'lat',[30 80]);

m_coast;

m_range_ring(-123,49,[1e3:1e3:10e3],'color','r');

从我的公司,没1000公里画一个圆,但我对此不满意,想要仅仅使用200千米的增量重新画,我可以移除m_range_ring然后重新画:

m_ungrid range_ring

m_range_ring(-123,49,[200:200:2000],'color','r');

通常情况下,m_angthing都可以通过调用

m_ungrid  angthing 来将其移除。

m_ungrid能够通过后面的标签识别并且删除特定的元素,在各个版本的m_map中都可以使用。

8添加自己的海岸线数据

如果你对某一片区域比较感兴趣并且有更高分辨率的海岸线数据,最好的过程应该是:

//没有下载到链接的文件http://ferret.pmel.noaa.gov/static/FAQ/custom_plots/topo_bathy_data.html

1, 从高分辨率的数据库里获得点集;

2, 用m_112xy将数据转换成屏幕坐标,并用plot画出。

某一地区的高分辨率的数据可以获得,按照这里的指导,获得matlab可读的海岸线数据文件,然后把它下载到你的电脑上,如果文件保存为“coast.dat”,你可以用下面的方式画出来。

loadcoast.dat;

m_line(coast(:,1),coast(:,2));

填充海岸线需要更多的工作。首先你应当读一下关于如何连接海岸线数据位一个连续部分的说明,如果你很幸运,你可以使用下面的程序直接实现:

[X,Y]=m_ll2xy(coast(:,1),coast(:,2),'clip','patch');

k=[find(isnan(X(:,1)))];

fori=1:length(k)-1,

    x=coast([k(i)+1:(k(i+1)-1) k(i)+1],1);

    y=coast([k(i)+1:(k(i+1)-1) k(i)+1],2);

    patch(x,y,'r');

end;

如果不成功,阅读一下关于private/mu_coast的说明,使用m_usercoast下载自己的数据。

1DCW政治界线

直接跳过

2ESRI shp文件

矢量数据事实上的交换标准文件就是ESRI的shapefile文件。它最少由三个文件组成,每个文件有相同的根文件名,但是扩展名分别是.dbf,.shp,.shx。文件可以包含点,线或者面信息,也可以通过自我描述的方式制定其他字段。

所有的shapefile文件都可以使用m_shaperead函数读取,它返回一个包含文件信息的数据结构。然而,要决定怎么处理这些数据还需要检核数据结构的内容。在.prj文件中可以检测投影信息,尤其是当你加载的数据源不同的时候。

至少,你可以使用下面的代码画出存储在shp 、shx 、dbf里的内容

M=m_shaperead('datafile');

clf;

for k=1:length(M.ncst),

 line(M.ncst{k}(:,1),M.ncst{k}(:,2));

end;

//这段很有用,读取自己的shapefile文件

9添加自己的地形或水深数据

在NCAR上有许多全球或区域的地形数据库,在他们的ftp服务器上也有许多免费的地形数据可供下载。只要数据是以经纬度矩阵的方式存储在mat文件中,就可以使用m_contour或者m_contourf画出他们。

1Sandwell 和Smith 水深测量

最近,许多人开始使用低纬度地区的1km分辨率的水深数据,关于这个数据库的相关描述参加http://topex.ucsd.edu/marine_topo/ ,可以下载这个700m的二进制文件(获取文件topo_x.y.img,此处x.y是版本号)。作者已经给他包含了一个m文件(mygrid_sand.m)他可以将数据部分提取出来(你需要改变代码里的路径名)。一旦这个数据库以及m文件被下载到你们的电脑上,你就可以用m_map很容易的使用他们了,典型的使用方法如下:

% Extract data

[elevations,lat,lon]=mygrid_sand([lat_southlat_north long_west long_east]);

 

% Use in M_Map command

m_contour(lon,lat,elevations);

对于一些投影,你必须确保,mygrid_sand.m提取出来的精度范围是在投影的范围内,否则的话你必须加上或者减去360,在西部地区(负精度)这似乎总要发生,如果你忘记了这一条,会得到一些错误提示。

10使用5分的地形数据和2分的全球地形数据

绝大多数情况下,m_map提供的高程数据足够满足分辨率的需求。然而也有许多情况,我们需要更高的分辨率。我们没有包含更高分辨率的高程数据库因为他将极大的提高软件包的大小。然而v1.3包含了m文件能够经过数分钟的处理后获得和画出主要的全球的5分的地形数据,

11使用GSHHS高分辨率海岸线数据

当我们绘制地图的时候,我们总是要在程序的实行时间时间和地图的分辨率之间做一个权衡。在m_map中,包含了分辨率为1/4度的海岸线数据,可以快速产生地图,在绝大多数用途中,都具有足够的分辨率。

然而,我们经常想要画一些有限地理区域的跟详细的地图。为此,我们就需要一个更高分辨率的海岸线数据库。我没有在m_map中包含这一数据库,因为他将极大的增加软件包的大小。然而,我内置了一个m文件,它能够获得和使用一个叫做GSHHS的高分辨率的数据库。

按照发布,GSHHS包含了不同分辨率的一系列数据库。最低分辨率和m_map的分辨率差不多,尽管它包含了更多的内陆和湖泊。高分辨率的数据包含的点见的距离大约是200米,还有更高的分辨率的数据,你可以安装部分或者全部数据库,这依赖于你有多大的硬盘空间。全分辨率数据库战友90M左右,紧接着在粗糙一级的数据大约是他1/4大小。因此,高分辨率的数据库大约有21M,中等的有6M,低级的只有1.1M,没有一直使用高分辨率数据的原因是在每一次处理的函数调用时,都要读取这90m的文件,这需要花费太多的时间。

如何安装GSHHS:

1, 打开 http://www.ngdc.noaa.gov/mgg/shorelines/data/gshhs/.

2, 下载并且解压任意一个或者所有gshhs_c.b.gz文件,gshhs_l.b.gz文件,gshhs_i.b.gz文件,gshhs_h.b.gz文件一个比较合适的位置是m_map\provate。GHSSH的数据格式在v1.2和v1.3之间做了改变,在v2.02再次做了改变,但是m_map应该可以解决这个问题。

3, 如果你的数据文件没有放在m_map/private中,你必须编辑m_gshhs_c.m, m_gshhs_l.m,m_gshhs_i.m, m_gshhs_h.m 和m_gshhs_f.m 中指定的文件设置,把他指向正确的位置(放在这里可是还是提示没有找到)。

有效使用GSHHS

最简单的调用机制和m_coast一样的,画一个灰色的高分辨率的海岸线填充图像:

m_gshhs_h('patch',[.5 .5 .5]);

然而执行的时间会非常非常长,因为整个数据库都会被搜索和处理一遍,并不推荐用中等或者更高等级分辨率的海岸线数据画世界地图,有两个方式可以加速,第一种就是用第分辨率的数据。如果你要重复画一个图的画,第二种将会非常有帮助。在这里推荐使用下面方法:

m_proj ('Mercator') % set upprojection parameters

% This command does not drawanything - it merely processes the

% high-resolution database usingthe current projection parameters

% to generate a smaller coastlinefile called "gumby"

m_gshhs_h('save','gumby');

% Now we can draw a few maps ofthe same area much more quickly

figure(1);

m_usercoast('gumby','patch','r');

m_grid;

figure(2);

m_usercoast('gumby','linewidth',2,'color','b');

m_grid('tickdir','out','yaxisloc','left');



你可能感兴趣的:(Matlab)