绘制你的第一张地图

多数NCL初学者,在接触NCL前对NCL的印象限于绘图语言。为了保持学习的趣味性,教程也 首先从NCL绘制一张地图开始,学习NCL的基本编程风格。

载入函数库

NCL中除去标准库外,绘图的的函数库是专门的,需要在使用前先载入到命名空间。 NCL中有两类绘图函数,一类是gsn函数,另一类是gsn_csm函数,gsn_csm函数是在gsn函数上 风格化定制的高级接口,通常来说我们更愿意选择gsn_csm函数来绘图图形。

使用 load 关键词来载入NCL函数库的语法如下

load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"

注解

NCL 6.2.0版本开始自动地载入了以上的三个常用库文件,因此除非你想让自己的代码也能在较旧的NCL版本上成功执行,一般地,你并不需要再载入这三个库了。


开始一个代码块

NCL使用 beginend 关键词来封装一段代码,这不是必须的,你大可 不写 beginend。使用它们的好处在于被其封装的代码块被执行前首 先会进行语法检查,并及时抛出异常。这可以让你较早发现代码错误,而不是在执行到错误 时才了解到代码的语法问题。

begin

注解

为了让代码可读性变得更好,我建议对代码块代码进行同级缩进。


打开绘图工作台

绘图工作台指的是一个图形文件或X11窗口,这就好比我们使用绘图软件PhotoShop绘图前需 要创建一个画板。使用 gsn_open_wks 函数来打开一个工作台,其使用方法是,

wks = gsn_open_wks(type, filename)

其中type接受一个字符串参数作为工作台的类型,如”X11”, “png”, “eps”等等。 而filename接受一个字符串参数作为工作台的标题或者文件名。


定义源变量和属性

通常绘图函数使用一个布尔型变量来控制输出图形的细节,这个布尔型变量被称作源变量(resources),当源变量赋值为NCL逻辑真时,可以给源变量赋予各种属性来调整图形的各个 细节。给变量赋予属性使用 @ 标点。NCL中有着纷繁复杂的源变量属性,这对于新手来说 简直就是一个灾难,因为在开始时,你很难了解每个源变量属性的含义。但是如果你搞清楚 了NCL源变量属性的命名规则,相信能给你带来很大的帮助。

res = True  ; 定义源变量,赋值为真
res@mpMinLonF = 100.  ; 定义源变量的mpMinLonF属性,赋值为100.
res@mpMaxLonF = 180.
res@mpMinLatF = 0.
res@mpMaxLatF = 50.

在以上的代码中,我们给源变量赋予了四个属性,它们分别控制地图的起始和结束的经度、 纬度。属性中的 mp 代表了这个属性控制地图,而最后的 F 代表了这个 属性的类型是浮点数。


使用绘图函数绘制空白地图

NCL中有许多的绘图函数来绘制不同类型的图,包括非地图类和地图类等。比如当你需要绘制 等值线时,你需要使用的绘图函数名中必须有contour,而绘制风场箭头时,则是vector。 所有的绘图函数可以查阅官网,传送门

在这里,我们使用一个最常用的地图绘图函数 gsn_csm_map_ce 来绘制一张 Cylindrical equidistant (ce后缀) 投影的空白地图。

plot = gsn_csm_map_ce(wks, res)
这个绘图函数接受两个参数,
第一个参数是控制台变量,代表了这个地图图层将被增加到wks工作台中
第二个参数是源变量,代表了用res这个源变量来控制这个地图图层的细节。

结束一个代码块

end

通过以上的几句代码,你就绘制了一张东半球大平洋地区的地图。你可以随意更改四个源变 量属性的值将地图缩放到不同大小的地区。当然,如果是全球的话,你大可以直接将 plot = gsn_csm_map_ce(wks, res) 改写为 plot = gsn_csm_map_ce(wks, False) 注意这里我们之间将图形函数的第二参数,也就是源变量的值设置为 False 了, 这代表使用函数 gsn_csm_map_ce 默认的图形属性设置。

以下代码可复制到NCL命令行中测试

begin
    wks = gsn_open_wks("X11", "first_map")
    res = True
    res@mpMinLonF = 100.
    res@mpMaxLonF = 180.
    res@mpMinLatF = 0.
    res@mpMaxLatF = 50.
    plot = gsn_csm_map_ce(wks, res)
end

生成的图形

../_images/first_map.PNG ../_images/donate3.png

评论