物探论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 975|回复: 0

[Surfer] Golden Surfer8.0初学者教程

[复制链接]
发表于 2013-3-7 19:45:10 | 显示全部楼层 |阅读模式
一、 简介

     Golden Software Surfer 8.0 (以下简称Surfer)是一款画三维图(等高线,image map, 3d surface)的软件,该软件简单易学,可以在几分钟内学会主要内容,且其自带的英文帮助(help菜单)对如何使用surfer解释的很详细,其中的tutorial教程更是清晰的介绍了surfer的简单应用,应该说surfer软件自带的帮助文件是相当完美且容易阅读的,只要学过英语的人都可以很快上手。

     Surfer是具有插值功能的绘图软件,因此,即使你的数据是不等间距的,依然可以用它作图。但依据作者的经验,最好不使用Surfer自带的插值功能,尤其是要精确确定等高线时。由于surfer是美国的一个软件,它不提供对中文的支持,这可以算的上一个小的遗憾。

     Surfer的主要功能是绘制等高线图(contour map),此外它还可以绘制post map, classed post map, vector map, image map, wireframe map, 3d surface map,等形式的图形。其功能是比较强的,但没有各种投影变化是它的一大缺点。尤其是在等高线领域,这不能不说是它的应用受到限制的地方。

     由于surfer软件没有中文说明书,对一些初学者来说可能会存在上手较难的问题,鉴于此种需求,编写了这一初学者参考手册,希望对大家有所帮助。

二、等高线的绘制

     Surfer的最主要的功能是绘制等高线图,但并不是我们具有了数据文件就可以直接绘制等高线,surfer要求绘制等高线的数据有特殊的格式要求,即首先要将数据文件转换成Surfer认识的grd文件格式,才能绘制等高线(当然,可以直接生成surfer接受的ascii 码的grd文件格式,这样就可以直接作图,此方法将在后面介绍,首先我们介绍常用的作图方法)。假设你有三列数据分别为X,Y,Z,其中Z为点(x,y)处的值,存在文件test.dat中(数据见附件),其中第一列是X坐标,第二列是Y坐标,第三列是(x,y)上的值Z,则绘制等高线的步骤如下:

步骤一:把数据文件转换成grd文件

     1. 打开菜单Grid | Data... ,在open对话框中选择数据文件test.dat

     2. 这会打开“Grid Data”对话框。在“Data Columns”中选择要进行GRID的网格数据(X和Y坐标)以及格点上的值(Z列),这里我们不用选择,因只有3列数据且它们的排列顺利已经是XYZ了,如果是多列数据,则可以在下拉菜单中选择所需要的列数据。选择好坐标XY和Z值后,在“Griding Method"中选择一种插值方法(如果你需要比原始数据的网格X和Y更密的Z数据,或是你的网格是非均匀的),则在Grid的过程中,Surfer会自动进行插值计算,生成更密网格的数据。如果你只是想绘制原始数据的图,不想插值,则最好选择距离平方反比法(inverse distance to a power)或Kriging方法。因为这两种方法在插值点与取样点重合时,插值点的值就是样本点的值,而其它方法不能保证如此。在"Output GridFile“中输入输出文件名test.grd,然后在“Grid Line Geometry”中设置网格点数。这里需要注意

的是,当X和Y的数值相差很大时,这里显示的最大最小值可能有错误(即与原始数据不同),这是Surfer软件本身的问题,遇到这种情况,必须手动改正这种错误,即输入正确的最大最小值。由于我们的数据没有此类问题,因此不必手动改正最大最小值。但必须手动改正X和Y的间距“spacing” 或数据个数“#f”,这二者是相关的,改动一个,另一个自动改正。如果你的原始数据是等间距的,这里的X和Y的间距“spacing"或”#f“ 最好与原数据一致,这样可以减少插值带来的误差。我们的数据是不均匀的,所以必须插值,这里可以不进行任何改动。好了,点“ok”,画图所需要的grd文件test.grd就生成了。

步骤二:画等高线

     打开菜单“Map|Countour Map|New Countour Map",在“Open Grid”对话框中选择刚才输出的grd文件,如test.grd,点“ok”,则一副等高线图就画完了。

步骤三:等高线图的设置

     在所画的等高线图中双击鼠标,或点击右键,选中“属性”,就会出现设置等高线的各种属性,在图的边缘双击鼠标则可以改动坐标轴的属性。

     等高线图的着色(fill)和设置

     双击等高线图,就会出现“map:countour properities”对话框,现在介绍此对话框中的设置。

     “General”选项卡中:

1、“input grid file”

    为打开的等高线图的grid文件名,你可以修改此处,打开不同的文件(几乎没人这样做),点一下打开文件图标旁的“i”图标,则可以看到当前grid文件的基本统计信息,如最大最小值等。

2、“filled countours”

    选中fill countour(在前面的方框中点一下鼠标),就可以画着色的等高线图了,如果再选中下面的“color scale”的话,则可以在等高线图旁边给出色彩棒。

3、“smothing”

    选中的话可以对等高线进行平滑,在amount中有“低、中、高”三种选择。这一项一般可以不选,除非你画出的等高线图中的等高线非常的不平滑,这项只起到美化图形的结果,没有更大的意义。

4、“blanked regions”

    这项可以对空白区域进行着色,只有在你的等高线中有空白区域时才有意义,一般不用。

5、“fault line”

    可以设置等高线的粗细颜色等。

    “Levels” 选项卡中:

1、“level”

    点击“level”可以设置等高线的最大最小值和等高线间的等高距,这可以对所有的等高线发生作用,通过调节此项可以使等高线分布均匀,易于看清楚,作图更美观。如不想人为改动,可用缺省值。双击level下面的数字,可以单独更改等高线的值,但要注意等高线从小到大的规律,不能瞎改。

2、“line”

    点击“line”可以设置等高线的线型。

3、“properities”

    选中“uniform”,则线型是统一的,选中“gradation”,则线的颜色是渐变的。选择好“properities”后,就可以更改下面的线型(style)和颜色(color)已经线的粗细(line)。当选“gradation”时,线的颜色是渐变的,点一下color旁边的颜色区,就会出现“color spectrum”选项,点一下“盾形”图标(在颜色条的左右两端上方),就可以分别点选下面的颜色了,当然,也可以自己加入“盾形”图标,加自己的颜色。或是用“load”调用调色板文件(*.clr),在surfer8目录下就有。“affected levels”可以有选择的对等高线的线型颜色进行设置,这里不再详细介绍,只要自己动手改改那里边的三个数字,你很快就会弄明白。此外,还可以通过双击line下面的线来改变某一根等高线的具体属性。

4、“fill”

     此选项只有在着色等高线图中才有效,对单独的等高线图无作用。点击“fill”设置着色。着色与“line”选项中的内容类似,不再详细介绍。同样,可以通过双击“fill”下面的具体颜色条来对特定的等高线区域进行着色。

5、“labels”

     设置等高线标注数字,比较简单。双击下面的“yes”或“no”可以改变是否显示标注。

6、“hach”

     用来画等高线的上下方向(即上山或下山方向),一般不用。

7、“add”和“delete”

     在右边的按钮。当选中某一level后,点“add”按钮可以在两个level之间插入一新的level。Delete按钮则删除选中的level

    “view”选项卡中

    用来调整等高线图的整体方向,除了在3d surface情况下,一般不用。

    “scale”选项卡中

    用来设置xyz轴的比例,可以调整其长度选项。一般情况不需调整,除非X和Y相差很大,为了方便看图可以调整其到合适的长度。

    “limits”选项卡中:

    可以用来裁剪等高线图(通过设置xy的最小最大值),从而得到感兴趣地方大小的图形。

   “background”选项卡中:

     可用来设置背景填色,一般不用。

横纵(xy)坐标轴的设置:

     双击横轴和纵轴所在的位置,就可以打开坐标轴属性对话框 “map bottom(or left or top or right)axis properties”下面以bottom轴为例,其它类似:

“gernal” 选项卡:

“Title”, 在空白处可以输入轴的说明或图的说明文字,用“offset along” 和“offset

from”可以设置说明文字的位置,“font”可以选择字体,“angle”可以选择文字的旋转角度。

“labels”,设置轴的刻度值。

“axis plane”设置轴平面,一般不改动。

“axis”设置轴线属性。

“ticks”选项卡:

设置轴线上刻度的长度,方向,主刻度和辅助刻度。

“scaling”选项卡:

设置刻度值(label)的起始值(first major),间隔(major)和最后值(last major)。其它值一般不修改。

“grid lines”选项卡:

用来设置等高线图的坐标网格,用鼠标点击“show”即可。

此外,以上等高线的所有属性都可以通过双击左边的“object manager”(或在“view”菜单中)属性窗口来设置,与直接在图中设置无异。

三、在等高线图上加上背景地图(base map)(世界地图或局部地图)

    我们经常需要把世界地图放在等高线图下面作为参考,世界地图在surfer中的格式是*.bln, *.gsb,*.jpg,*.gif等多种形式,比较常用的是*.bln文件,这些地图在surfer的官方网站http://www.goldensoftware.com/都有,可以自由下载。在附件中提供给大家一个世界地图的bln文件,文件名world0360.bln。

    在surfer中打开 map|base map... 然后打开world0360.bln文件,就可以画出世界地图了。用view|fit to window可以很好的显示. 然后我们可以把相应的等高线图用第二部分的方法画出(注意base map的网格坐标必须与等高线图的网格坐标一致,至少base map的网格坐标要包含等高线图的网格坐标)。再按F2键(选中所有对象,或ctrl+A),点击map|overlap maps就可以将两幅图合成一副图。打开view|object manager,选中"base",点右键,选order overlay|move to front就可以将背景图移到前面一层。这样一份好的等高线图就画好了。(见右图)

四、bln文件及blank作图

    大家看了第三部分的图有可能会奇怪,为什么你的等高线只在海洋上有,陆地上怎么没有呢?这就是此节要讲的内容。首先讲一下bln文件的格式,bln文件具有以下格式:

length,flag

x1,y1

x2,y2

...

xn,yn

length,flag

x1,y1

x2,y2

...

xn,yn

其中,length是背景地图曲线中点坐标的个数,如果xn=x1,yn=y1,那么所有的点将围成一个圈。如果不是这样,则是一条不闭合的曲线。 flag的值为1或0,当flag=1时,闭合曲线里面的等高线可以用此bln文件blank掉(即将闭合曲线中的等高线消除),如果flag=0,则是曲线外面的等高线被blank。我所提供的bln文件为flag=1的格式,当然可以将其改成0。简单介绍了bln文件的格式,再来介绍怎样blank等高线。假设我们已经有了一个全球的等高线图,其原始数据文件为1.grd. 打开grid|blank... 选择文件1.grd,"ok",然后在新的对话框中选择world0360.bln, "ok",再在新的对话框中输入要输出的grd文件的名字,点ok就可以得到一个blank过的grd文件(假设为out.grd),则用out.grd再做等高线图,即可出现我所给第三部分中图的效果.

五、应用surfer给出数据文件的统计性质

    在应用数据作图前,有时候需要知道每列数据的统计性质,如最大值,最小值,标准差等。应用surfer的worksheet可以很方便的解决此问题。打开file|new 选中worksheet,则出现一个类似excel的表格,在此环境下,可以用file|open来打开需要查看的数据文件,譬如test.dat。如果我们想知道B列的统计性质,则点击B,再打开菜单data|statics...,选"ok",就会出现统计结果。同时,我们还可以对各列进行数学运算,譬如我想生成新的一列D,它是B列的平方加上C列的和,则先点击D列(空白列),再打开菜单data|transform...在transform equation下输入“ D=B*B+C”点击"ok",则会生成D列数据,只要将文件另存为新文档就可以了。当然,你还可以用surfer的worksheet做很多类似的计算。应该说,surfer的这一功能是很实用的,当然,还可以用data|sort...对数据进行排序。

六、post map和classed post map

     有时候,我们需要在base map中添加台站的坐标,并用三角,五星等符合将其标出,且在旁边写上台站的名字,这可以用post map和classed post map完成。首先介绍post map,它的数据文件一般格式是:

x1, y1, label1

x2, y2, label2

...

xn, yn, labeln

其中,xn,yn为坐标值,label为数字或文字。我们还是以test.dat为例子,打开map|post map|new post map..., 选择文件test.dat, 选"ok",则会出现一副post map的图,双击图的中央,就会打开其属性。在gernal选项中可以设置坐标列,以及symbol(可更改为其它的形状,缺省为十字)。在labels选项中,可以通过"worksheet column for label"设置label,此处我们选择c列,则c列的值会出现在每个坐标点的上方。(如图所示) 至于其它的设置跟等高线类似,不再详述。

     至于classed post map与post map类似,只是对不同的点,根据某些规则分类而已。譬如还是test.dat文件,我们把c列看成是每个点的高程,则可以根据高程对各点分类。如高程在25-54的用十字表示,88-105的用三角表示等。打开map|post map|new classed post map...,选择文件test.dat, 选"ok",则出现一副classed post map,双击图可以编辑属性,这里会多一个"classes"选项卡,这里的选项最大最小值,symbol等都可以改,不再详述。需要注意的是

classed post map至少要有三列数据,其中第三列就是分类的标准。

七、vector map 向量图(或风向图)

     很多人是学习大气和海洋的,因此经常要画风向量图或海流的向量图,surfer可以轻松的完成,且图形可以调整,因此可以生成很漂亮的图形。vector map分1-grid vector map 和 2-grid vector map两种。首先介绍1-grid vector map:

     1-grid vector map可以给出坐标点的方向和振幅大小,但它一般表示的是等高线的下山方向和大小,是等高线图的一种特殊表现方式,如应用test.dat就可以做出。打开 map|vector map|new 1-grid vector map,选中test.dat,则会出现一副箭头图。通过双击图的中央可以编辑它的属性,此图一般很少应用,因此其属性设置不再详述,感兴趣的朋友可以自己试一下。

     下面主要讲2-grid vector map,2-grid vector map用到两个不同的grd文件,一般讲这两个文件应该有相同的坐标网格。 2-grid vector map的grd文件可以有两种表示方法,一种是直角坐标形式,一种是极坐标形式。

    对直角坐标形式,其中一个grd文件里是x方向的值,另一个是y方向的值。

    对极坐标形式,一个grd文件是vector的方向,另一个grd文件是vector的振幅值。

    下面举个具体的例子来说明如何作图。假设我们已经有了风分量u和v的两个直角坐标的grd文件(包括x y windu三个分量),名字分别为amipii.u.Jan.sp.dat和amipii.v.Jan.sp.dat两个grd文件(需要注意的是,这两个文件已经是ascii 码的grd文件,看不到相应的三个分量,但不需要再进行grid过程,可以直接应用,至于如何生成这种形式的grd文件,我将在后面具体解释)。

    打开map|vector map|new 2-grid vector map,将打开"open x component (angle) grid"对话框,此时选中amipii.u.Jan.sp.dat(注意,需要在文件类型中选择all files(*.*)才可以选择*.dat文件),随后会打开"open y component (length) grid"对话框,此时选中amipii.v.Jan.sp.dat,选择"ok",就会出现一副风的箭头图,再加上base map就成了一副很漂亮的图。通过双击就可以打开此图的属性(map vectors properties)。注意:在"data"选项卡中,coordinate system要选cartesian(x,y)(如果你用极坐标,就选polar (angle, length))。

    在"symbol"选项卡中可以修改箭头的形状,线的属性,其中frequency是设置x和y方向需要箭头的频率,此处我们改为3,3,即在x和y方向都是每3点画一个箭头,也即省略了两点。其中的color scaling可以会色彩箭头,大家可以看一下效果(此处我没有改动)。 在"scaling"选项卡中,可以设置箭头起始点的位置(symbol项),以及箭头长度的比例形式(线性,log,平方根等,在scaling项中改)。在右边还有两个选项,一个是反转箭头方向,一个是给出箭头的图标(legend),选中后者。在下面可以设置箭头的各个属性(mangitude,shaft length,head length和symbol width,分别表示风的振幅大小(可改,这里选用缺省值),箭头杆的长度,箭头头的长度和箭头的宽度,这里其最小最大值分别为(后三项) 0.04in,0.2in,0.04in,0.04in,0.01in,0.01in)。 在"scale"选项卡中,选择x scale下的length为6in,y scale下的length为3in。其它属性不做改动,即可生成我所给的图形。当然,你也可以给出风uv项的角度和振幅,用极坐标来画图,这其中要注意极坐标的参考点可以是东(角度逆时针)或北(角度顺时针),请注意选择(在属性的"data"选项卡中修改,且其角度可以用度或弧度作单位,请小心区分)。

八、ascii 码的grd文件及插值问题

     在第七部分给出的grd文件是ascii码的直接grd文件格式,无需进行grid过程,这样做简单,准确,可以在工作和学习过程中提供很多方便。下面做一详细介绍:

     ascii码的直接grd文件格式包括5个文件头信息(关于网格的限制),然后是z的值,值得注意的是,这种文件格式必须用空格来区分两个数据。其一般格式为:

DSAA (注意,必须大写且从第一行第一列开始,即DSAA前面不能有空格)

nx ny (x 方向网格点的个数nx, y方向网格点的个数ny)

xlo xhi (x 方向网格点的最小值和最大值)

ylo yhi (y 方向网格点的最小值和最大值)

zlo zhi (z 方向网格点的最小值和最大值)

grid row 1 (z 的值在点(x1,y1), (x2,y1),....(xn,y1))

grid row 2 (z 的值在点(x1,y2), (x2,y2),....(xn,y2))

grid row ........

grid row n (z 的值在点(x1,yn), (x2,yn),....(xn,yn))

注意,此处x1<xn, y1<yn。

下面是一个具体的例子:

DSAA

10 10

0.0 9.0

11.0 20.0

25.00 97.19

91.03 77.21 60.55 46.67 52.73 64.05 41.19 54.99 44.30 25.00

96.04 81.10 62.38 48.74 57.50 63.27 48.67 60.81 51.78 33.63

92.10 85.05 65.09 53.01 64.44 65.64 52.53 66.54 59.29 41.33

94.04 85.63 65.56 55.32 73.18 70.88 55.35 76.27 67.20 45.78

97.19 82.00 64.21 61.97 82.99 80.34 58.55 86.28 75.02 48.75

91.36 78.73 64.05 65.60 82.58 81.37 61.16 89.09 81.36 54.87

86.31 77.58 67.71 68.50 73.37 74.84 65.35 95.55 85.92 55.76

80.88 75.56 74.35 72.47 66.93 75.49 86.39 92.10 84.41 55.00

74.77 66.02 70.29 75.16 60.56 65.56 85.07 89.81 74.53 51.69

70.00 54.19 62.27 74.51 55.95 55.42 71.21 74.63 63.14 44.99

     在这个例子中,共有100个z的值,其中x为10个,y为10个,x的最小最大值是0.0和9.0, y的最小最大值是11.0和20.0,z的最小最大值是25.00和97.19,最后是100个z的值,每行10个值,共10行。当然,我们也没有必要这样排列,只有顺序不变,照样可以每行只有一个值,即类似下面的排法:

.... (省略了文件头信息)

91.03

77.21

60.55

...

74.63

63.14

44.99! write golden software surfer 8.0 grid format data by ascii (3d)

! num_x,num_y=number in x and y direction respectively

! x_begin,x_end,y_begin,y_end=the begin and end value in x and y direction respectively

! z(num_x,num_y)=z value at grid x and y point

! iunit,filename=open file unit and name to write the 3d data

subroutine wr_surfer_grid(num_x,num_y,x_begin,x_end,y_begin,y_end,z,iunit,filename)

implicit none

integer,intent(in):: num_x,num_y,iunit

real,intent(in)::x_begin,x_end,y_begin,y_end,z(num_x,num_y)

character(len=*),intent(in)::filename

integer i,j

close(iunit)

open(iunit,file=filename//'.dat.grd')

write(iunit,'(4a)') 'dsaa'

write(iunit,*) num_x,num_y

write(iunit,*) x_begin,x_end

write(iunit,*) y_begin,y_end

write(iunit,*) minval(z),maxval(z)

do j=1,num_y;do i=1,num_x

write(iunit,*) z(i,j)

enddo;enddo

close(iunit)

print *, ''

print *, 'output data to file : ', filename//'.dat.grd'

print *, ''

end subroutine wr_surfer_grid

回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|物探论坛 ( 鄂ICP备12002012号 微信号:iwutan )

GMT+8, 2024-4-26 00:40 , Processed in 0.070881 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表