免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 4585|回复: 4
收起左侧

[技术] 使用matlab和GMT联合绘制带有省界的中国地图

[复制链接]

3

主题

5174

铜板

6

好友

工程师

Rank: 7Rank: 7Rank: 7

积分
424
QQ
发表于 2012-6-22 21:31 | 显示全部楼层 |阅读模式
使用matlab和GMT联合绘制带有省界的中国地图

1下载省级边界数据,地址:http://nfgis.nsdi.gov.cn/nfgis/chinese/c_xz.htm
网站存储有多级边界数据以及水文数据等,除省界数据外根据需要下载其他数据。
数据格式为shp的边界数据可以被matlab直接读取。因此请下载此格式数据。其他格式数据如果知道读取方式也可。
2 安装m_map
M_map是开源的matlab工具箱。其实也就是下载下来,解压到work目录,使用cd 进入M-map目录。如果想事每个用户都能使用则复制到MATLAB/toolbox/m_map,还要设置matlab中的一个文件,路径为MATLAB/toolbox/local/pathdef.m,添加m_map的路径到该文件下,最后使用rehash toolboxcache 命令更新文件。
操作好上述步骤之后,进入work目录中的m_map目录。即可进行下面的操作。
3 使用matlab读入边界数据,绘制地图,检查边界,输出为dat格式数据。
代码如下:
a=shaperead('bou1_4p.shp');% 读取国界shp文件,a为结构体。输入whos a 可查看结构体
bou1_4lx=[a(:).X];% 提取经度
bou1_4ly= [a(:).Y];% 提取纬度
m_proj('Lambert Conformal Conic','lon',[70,140],'lat',[0,60])% 投影
m_plot(bou1_4lx,bou1_4ly)%绘图,查看边界是否正确,注意其实国界在省界之内,不必提取国界也可以表示出省界。
b=shaperead('bou2_4p.shp');% 省界
bou1_4px=[b(:).X];%同上
bou1_4py=[b(:).Y];%同上
m_plot(bou1_4px,bou1_4py)%同上
provence=[bou1_4px',bou1_4py']; 合并经纬度为一个数组
save prov.dat provence –ascii; 保存省界坐标

Matlab绘制的中国行政地图

Matlab绘制的中国行政地图

    【 Matlab绘制的中国行政地图】
4 GMT
安装比较简单,使用非常麻烦,但是学会之后,却是很好,很强大的绘图软件,速度和美观都优于matlab。而其GMT内置有常用数学运算,FFT之类的高等数学运算也有,是很好的。这只是给GMT做个广告,希望大家有时间学习。
安装和基本使用不在此说明。

(1)中国以及周边区域的T/P高度计后向散射系数分布

(1)中国以及周边区域的T/P高度计后向散射系数分布

   【(1)中国以及周边区域的T/P高度计后向散射系数分布

(2)新疆地区T/P高度计后向散射系数空间分布

(2)新疆地区T/P高度计后向散射系数空间分布

  【(2)新疆地区T/P高度计后向散射系数空间分布
上面两幅图是使用GMT绘制的,GMT本身不自带中国的省界文件,但有高分辨率的海岸线数据以及国界数据,水系湖泊数据,当然这些数据在安装程序的是选择性的,只有你安装了这些数据源,才可以使用。但是除了美国的州界外,其他国家的省市级别的边界是没有的,在网络上也没有直接可以供GMT使用的省界数据,因此在上面才用matlab提取中国的省界数据。
图中除了用到边界数据外,还有我自己的后向散射系数数据。这在网上更是找不到的,因此你可以结合自己的数据进行绘图。数据的结构都是差不多的,一般三列,经纬度,然后是属性值一列。当然其他多列的数据也可以绘制,具体就要看GMT的手册了。
在第一幅图中添加省界之后是很直观和形象的,分析图也是很有作用,什么地方哪一个省份的分布大概是如何的,都一目了然。
第一幅代码:

blockmean year-aver1993.xyz year-aver1994.xyz year-aver1995.xyz year-aver1996.xyz year-aver1997.xyz year-aver1998.xyz year-aver1999.xyz year-aver2000.xyz year-aver2001.xyz year-aver2002.xyz year-aver2003.xyz year-aver2004.xyz -I5m -R73/135/17/54 > China.txt
surface China.txt -I5m -R -V -Gyear-aver.nc -T0.35
makecpt -Crainbow -T0/30/5 -Z >s.cpt
grdgradient year-aver.nc -Nt1 -A90 -G439_i.nc
grdimage year-aver.nc -I439_i.nc -Cs.cpt -JM5i -P -K -E300 > china.ps
psscale -D5.3i/1.9i/3.8i/0.2i -Cs.cpt -L -B/:db: -O -K -P >> china.ps
pscoast -R73/135/17/54 -BNeWSf5a5g5/f10a5g5:."Spatial distribution of sigma0 in C": -S255/255/255 -JM5i -W1/0.8 -W2/0.4 -W3/0.4 -W4/0.4 -A100l -Di -V -I1/0.8p/255/255/255 -I2/0.4p/255/255/255 -I3/0.2p/255/255/255 -O -K -P>> china.ps
psxy prov.dat -JM5i -R -m -B -O -K -P -W0.5p/red >> china.ps
echo 4.25 0.5 10 0.0 LT 1 (b) > t.tmp
pstext t.tmp -N -R0/4/0/3.75 -Jx1i -O -K -P >> china.ps

REM del *.cpt
del *.tmp

psxy程序后的prov.dat 就是提取之后的中国省界数据。因此在绘图的时候,取消了pscoast中的国界命令-N。如果既有国界线还有省界线,二者不是一个国家发布的数据,一般是有区别的,比如阿克赛钦地区,麦克马洪线等。因此我们只采用自己国家提供的省界数据,而不画蛇添足的使用美国提供的国界线数据。
GMT只用这么几行命令即可以画出色彩丰富的图像,的确是很强大,再加上matlab提取的省界数据,画出的专题地图质量较高。如果只用matlab画,估计够呛吧,我没有去试一试,希望你试一试,比较一下。
我们分析了中国地区的后向散射系数之后,想单独拿出新疆来做研究,因为我们看到新疆地区有一道显著的分布,就是塔里木河绿洲带。为了单独研究新疆地区,我们最好提取出新疆的空间分布,屏蔽掉周围陆地,使之显示为白色,或者其他是DEM也可。
第二幅图就是新疆的单独分布。仅仅使用GMT即可,GMT内置了数据提取和裁剪功能。下面即是代码:

blockmean year-aver1993.xyz year-aver1994.xyz year-aver1995.xyz year-aver1996.xyz year-aver1997.xyz year-aver1998.xyz year-aver1999.xyz year-aver2000.xyz year-aver2001.xyz year-aver2002.xyz year-aver2003.xyz year-aver2004.xyz -I5m -R73/97/33/50 > XJ.txt
surface XJ.txt -I5m -R -V -GXJ-aver.nc -T0.35
makecpt -Crainbow -T0/30/5 -Z >s.cpt
grdgradient XJ-aver.nc -Nt1 -A90 -G439_i.nc

rem psclip裁剪,其后面的程序只在裁剪区域内绘图,知道遇见取消裁剪的命令为止!
psclip XJprov.xyz -R73/97/33/50 -JM5i -K > XJ.ps
grdimage XJ-aver.nc -I439_i.nc -Cs.cpt -JM5i -P -K -O -E300 >> XJ.ps
pscoast -R73/97/33/50 -S255/255/255 -JM -W1/0.8 -W2/0.4 -W3/0.4 -W4/0.4 -A100l -Di -V -I1/0.8p/white -I2/0.5p/255/255/255 -I3/0.3p/255/255/255 -O -K -P>> XJ.ps
psclip -C -O -K -P >> XJ.ps
rem 裁剪区被取消!!下面的程序就可以在这个绘图区域绘图了

REM 使用gmtselect提取新疆的边界坐标!!
REM gmtselect prov.dat -R73/97/33/50 > XJprov.xyz
rem psxy prov.dat -JM -R -W1.0p/red -m/nan -B -O -K -P >> XJ.ps
REM 使用提取的新疆边界坐标,只显示新疆的边界。如果想显示其他省的坐标使用上面加了注释的psxy命令!!,下面的XJprov.dat删去了四边形区域内的而其他省份的边界坐标,只保留有新疆的边界,前面使用psclip也是使用的改数据。该数据需要单独的使用其他文本编辑程序编辑,删去多余数据。省界线之间有NAN分割,因此便于查找无用的数据。
psxy XJprov.xyz -JM -R -W1.0p/red -m/nan -B -O -K -P >> XJ.ps
psbasemap -BNeWSf5a5g5/f5a5g5:."Spatial distribution of sigma0 in C": -R73/97/33/50 -JM5i -O -P -K >>XJ.ps
psscale -D5.3i/1.9i/3.8i/0.2i -Cs.cpt -L -B/:db: -O -K -P >> XJ.ps
echo 4.25 0.5 10 0.0 LT 1 (b) > t.tmp
pstext t.tmp -N -R0/4/0/3.75 -Jx1i -O -K -P >> XJ.ps
REM del *.cpt
del 439-b.txt
del 439_i.nc
del *.tmp

注释稍微复杂一些,因为里面涉及的数据较多。首先是绘图区域是一个四边形区域,坐标的范围在-R之后给出。
(1) 如果不删去新疆意外的边界线,则新疆外的边界线数据也绘制在地图上,而其后向散射系数分布也不能被屏蔽掉。如下图(3)。因此我们要先处理边界数据,提取一个完整的新疆边界坐标。当然了,这还要使用gmtselect prov.dat -R73/97/33/50 > XJprov.xyz 来提取一定区域内的数据。
(2) 处理边界数据,删去西藏甘肃的边界线。因为数据量较大,记事本和excel不方便。使用微软的Microsoft development environment 打开,找到NAN,检查NAN之后的坐标是不是新疆的坐标,不是则删去。由于已经缩小了范围,因此这次修改数据不是很复杂。找到它,删去,保存即可。
(3) 如图(4),已经只有了新疆的边界线。下一步就是用边界组成一个闭合多边形,然后值保留多边形之内的地图,多边形之外不管了。
(4) 使用psclip命令。psclip XJprov.xyz -R73/97/33/50 -JM5i -K > XJ.ps
绘制好了之后要绘制底图还有图例等等(也可以提前于psclip,则不用下一步),要取消封闭区域。使用psclip -C -O -K -P >> XJ.ps

3

3

4

4

最终就得到了我们想要的新疆后向散射系数空间分布地图(2)。地图屏蔽了新疆外的其他信息,看上去简介美观。
至此,完成了目标。

参考:
GMT手册
百度搜索



7711

主题

31万

铜板

892

好友

超级版主

地信网论坛贵宾

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

积分
128745

宣传勋章优秀斑主灌水勋章活跃勋章贡献勋章童话节勋章

QQ
发表于 2012-6-23 03:25 | 显示全部楼层
来学习一下,做的不错
该会员没有填写今日想说内容.
回复 支持 反对

使用道具 举报

4

主题

3614

铜板

27

好友

资深会员

经营自己的长处,能使你人生增值

Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

积分
3264
发表于 2012-6-30 19:45 | 显示全部楼层
支持一下!!!
追求经典!
回复 支持 反对

使用道具 举报

17

主题

3万

铜板

51

好友

黄金会员

wigi

Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23

积分
4850
发表于 2012-8-14 22:23 | 显示全部楼层
学习学习,支持。。。
开开心心
回复 支持 反对

使用道具 举报

5

主题

849

铜板

3

好友

助理工程师

Rank: 5Rank: 5

积分
292
QQ
发表于 2013-11-6 16:12 | 显示全部楼层
楼主这个好专业,我想问一下,这个后向散射系数是什么概念?做的很高端大气啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表