分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,将打开\(angle) grid\对话框,此时选中amipii.u.Jan.sp.dat(注意,需要在文件类型中选择all files(*.*)才可以选择*.dat文件),随后会打开\component (length) grid\对话框,此时选中amipii.v.Jan.sp.dat,选择\,就会出现一副风的箭头图,再加上base map就成了一副很漂亮的图。通过双击就可以打开此图的属性(map vectors properties)。注意:在\选项卡中,coordinate system要选cartesian(x,y)(如果你用极坐标,就选polar (angle, length))。
在\选项卡中可以修改箭头的形状,线的属性,其中frequency是设置x和y方向需要箭头的频率,此处我们改为3,3,即在x和y方向都是每3点画一个箭头,也即省略了两点。其中的color scaling可以会色彩箭头,大家可以看一下效果(此处我没有改动)。 在\选项卡中,可以设置箭头起始点的位置(symbol项),以及箭头长度的比例形式(线性,log,平方根等,在scaling项中改)。在右边还有两个选项,一个是反转箭头方向,一个是给出箭头的图标(legend),选中后者。在下面可以设置箭头的各个属性(mangitude,shaft length,head length和symbol width,分别表示风的振幅大小(可改,这里选用缺省值),箭头杆的长度,箭头头的长度和箭头的宽度,这里其最小最大值分别为(后三项) 0.04in,0.2in,0.04in,0.04in,0.01in,0.01in)。 在\选项卡中,选择x scale下的length为6in,y scale下的length为3in。其它属性不做改动,即可生成我所给的图形。当然,你也可以给出风uv项的角度和振幅,用极坐标来画图,这其中要注意极坐标的参考点可以是东
(角度逆时针)或北(角度顺时针),请注意选择(在属性的\选项卡中修改,且其角度可以用度或弧度作单位,请小心区分)。 八、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 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 这里我给出一个FORTRAN语言生成ascii码grd文件的子程序,仅供参考: -------------------------------------------------------------------------------------------------------------------- ! 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 原文作者后记: 近些日子,有人问surfer8中的插值哪种好? 我个人的观点,如果你的数据的网格是均匀的,那么,最好用我提供的这种ascii 码的grd文件直接作图。这样做的好处是显而易见的,即不会产生作图误差,且不会出现其它小问题,如不能正确处理x和y坐标(当二者差异较大时等)。我不主张在作图过程中进行插值计算。如果你的网格是非均匀的,则可能需要进行插值,我在前面介绍过在哪里选择,我个人认为比较好的是前两种( inverse distance to a power 和Kriging方法),至于插值方法的详细介绍请参考help|contents|index 中 查找interpolation主题词。因为时间关系,不再介绍插值问题。 此外,surfer还可以做image map, shaded relief map,wireframe map,3d surface map等多种map形式,这些其实都是等高线图的其它表现形式, 所用的文件就是grd文件,只是表现形式不同而已,至于具体设置,相信大家已经可以轻松搞定。 最后介绍一下surfer图形的输出,当作好图以后,可以按F2键,再按 ctrl+c,就可以将图形复制,可以直接粘贴到word文档中。此外,还可以通过file|export 菜单输出各种格式的图形(如jpeg, wmf等)。至于向量图eps的输出,可以通过eps打印机进行。 Surfer还有一些辅助功能,如函数直接作图等(在grid菜单中),标注文字,画简单的图形等,请大家自己参考help进行学习,这些在现在的基础上,应该是很简单的问题。