爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 61358|回复: 179

分享下C#调用Surfer的代码

  [复制链接]

新浪微博达人勋

发表于 2012-5-17 22:35:22 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
上班的时候要经常绘雨量图,由于手动用Surfer画图的时间比较久,所以最近在学编C#调用surfer画图的东东,下面是部分代码和一些测试文件,呵呵~~

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Reflection;
  10. using System.IO;
  11. using Surfer;


  12. namespace AppSurfer
  13. {
  14.     public partial class Form1 : Form
  15.     {
  16.         public Form1()
  17.         {
  18.             InitializeComponent();
  19.         }

  20.         string strFolder = @"d:\AppSurfer\content";
  21.         string OutGrpahic = @"d:\AppSurfer\outrain.bmp";
  22.         

  23.         private void button1_Click(object sender, EventArgs e)
  24.         {
  25.             string DataFile = strFolder + @"/rain.txt";
  26.             string OutGrid = strFolder + @"/grid_rain.grd";
  27.             string SmoothGrid = strFolder + @"/smooth_rain.grd";
  28.             string BlankFile = strFolder + @"/市边界.bln";
  29.             string BlankedGrid = strFolder + @"/blank_rain.grd";
  30.             string BaseFile = strFolder + @"/市底图.bln";
  31.             string PoseFile = strFolder + @"/站名.dat";
  32.             string LevelFile = strFolder + @"/雨量色标.lvl";

  33.             Surfer.Application AppSurfer = new Surfer.Application();     //对Surfer的调用
  34.             AppSurfer.Visible = false;           //注Surfer窗口是不显现
  35.             AppSurfer.WindowState = Surfer.SrfWindowState.srfWindowStateMinimized;

  36.             AppSurfer.Caption = "百色市雨量分布图";
  37.             AppSurfer.ScreenUpdating = false;  //Surfer制图过程是否显示

  38.                         
  39.             AppSurfer.GridData(DataFile, 1, 2, 3, Type.Missing, Surfer.SrfDupMethod.srfDupNone, 0.03, 0.03, Type.Missing, Type.Missing,
  40.                                 104.3, 108.1, 22.75, 25.2, Surfer.SrfGridAlgorithm.srfKriging, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  41.                                Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  42.                                 Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  43.                                Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, OutGrid, Surfer.SrfGridFormat.srfGridFmtAscii,
  44.                                  Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
  45.             
  46.             /*注:将所提供的降水文件格点化, DataFile即需要格点化的文件名加路径,文件第1列是经度,第2列是纬度,第3列是降水量值,网格经纬向的分
  47.             辨率都是0. 03,起始经度是104.3度,终止经度是108.1度,起始纬度是22.75度,终止纬度是25.2度,选择的插值方法是Kriging方法, GridFile即时离散插值后生
  48.             成的路径加文件名(其后缀应该是“. grd”, . grd文件格式是Ascii码的形式;*/

  49.             
  50.             AppSurfer.GridSplineSmooth(OutGrid, 8, 8, SrfSplineMethod.srfSplineInsert, SmoothGrid, SrfGridFormat.srfGridFmtAscii);
  51.             /*注:OutGrid为输入的格点化文件路径加文件名,将其进行平滑,平滑方法为Insert,行列的插值点数都设为8,SmoothGrid为输出的格点化文件路径加文件
  52.             名,其输出格式也是Ascii码;*/

  53.             AppSurfer.GridBlank(SmoothGrid, BlankFile, BlankedGrid, Surfer.SrfGridFormat.srfGridFmtAscii);
  54.             /*注:第一个GridFile为输入的格点化文件路径加文件名,将其利用bln文件去掉边界外的数据,BlankedGrid为输出的格点化文件路径加文件
  55.             名,其输出格式也是Ascii码;*/
  56.                   
  57.                         
  58.             Surfer.IPlotDocument Doc = (Surfer.IPlotDocument)AppSurfer.Documents.Add(Surfer.SrfDocTypes.srfDocPlot);
  59.             //建立一个绘图文档和一个绘图窗口

  60.             Surfer.IMapFrame mapframe = Doc.Shapes.AddContourMap(BlankedGrid);
  61.             //注:添加等值面图层MapFrame,将BlankedGrid格点化文件生成等值线图;

  62.             mapframe.Axes.Item(1).Visible = false;
  63.             mapframe.Axes.Item(2).Visible = false;
  64.             mapframe.Axes.Item(3).Visible = false;
  65.             mapframe.Axes.Item(4).Visible = false;
  66.             //注:不显示标注图的横纵坐标轴

  67.             
  68.             Surfer.IContourMap ClassedCounterMap = (Surfer.IContourMap)mapframe.Overlays.Item(1);
  69.             //注:将等值线图形属性指定给变量ClassedCounterMap;

  70.             ClassedCounterMap.Levels.LoadFile(LevelFile);  //注:等值线图的色彩填充文件为LevelFile,
  71.             ClassedCounterMap.FillContours = true;         //绘制等值线;
  72.             ClassedCounterMap.ShowColorScale = true;       //显示色标条;
  73.             ClassedCounterMap.SmoothContours = SrfConSmoothType.srfConSmoothHigh;  //SmoothContours为平滑等值线边界

  74.             ClassedCounterMap.ColorScale.Height = 1.4;
  75.             ClassedCounterMap.ColorScale.Width = 0.3;
  76.             ClassedCounterMap.ColorScale.Left = ClassedCounterMap.Left + 0.3;
  77.             ClassedCounterMap.ColorScale.Top = ClassedCounterMap.Top - 2.5;
  78.             ClassedCounterMap.ColorScale.LabelFont.Size = 12;
  79.             //注:对色标条进行设置

  80.             Surfer.IText Text1 = Doc.Shapes.AddText(ClassedCounterMap.Left + 0.2, ClassedCounterMap.Top, "市雨量分布图");
  81.             Text1.Font.Size = 12;
  82.             Surfer.IText Text2 = Doc.Shapes.AddText(ClassedCounterMap.Left + 0.3, ClassedCounterMap.Top - 2.3, "图例");
  83.             Text1.Font.Size = 12;
  84.             //添加文本文件


  85.             Surfer.IMapFrame mapframe1 = Doc.Shapes.AddPostMap(PoseFile, 1, 2, 3, 0, 0);
  86.             /*新建一个给地图添加标注文件的图层,PoseFile就是标注文件的路径加文件名, 1代表文件中经度, 2代表纬度,
  87.              3代表第3列是需要标注的名称, 0表示所需要选用的符号, 0是标注选用的角度;*/

  88.             mapframe1.Axes.Item(1).Visible = false;
  89.             mapframe1.Axes.Item(2).Visible = false;
  90.             mapframe1.Axes.Item(3).Visible = false;
  91.             mapframe1.Axes.Item(4).Visible = false;
  92.             
  93.             Surfer.IPostMap PostMap = (Surfer.IPostMap)mapframe1.Overlays.Item(1);
  94.             PostMap.LabelFont.Face = @"宋体";
  95.             PostMap.LabelFont.Size = 9;
  96.             PostMap.LabelFont.Bold = true;
  97.             PostMap.Symbol.Size = 0.01;
  98.             
  99.             Surfer.IMapFrame mapframe2 = Doc.Shapes.AddBaseMap(BaseFile);
  100.             //添加底图文件
  101.                         
  102.             Doc.Shapes.SelectAll();
  103.             Surfer.ISelection sel = Doc.Selection;
  104.             sel.OverlayMaps();
  105.             //注:将图层全部选定,进行层叠覆盖;

  106.             ((Surfer.IMapFrame)Doc.Shapes.Item("Map")).SetLimits(104.5, 107.9, 22.8, 25.2);

  107.             Doc.Export(OutGrpahic, false, "Defaults=1,width=800,KeepAspect=1,ColorDepth=24,Automatic=0,Quality=100");
  108.             //注:输出文件加路径名是OutGraphic,即图片名称,可以选择几种后缀(如png、jpg等) ,定义图片的大小、颜色、质量等等
  109.               
  110.             File.Delete(OutGrid);
  111.             File.Delete(SmoothGrid);
  112.             File.Delete(BlankedGrid);
  113.             //删除临时文件

  114.             AppSurfer.Documents.CloseAll(Surfer.SrfSaveTypes.srfSaveChangesNo);
  115.             AppSurfer.Quit();
  116.             //退出AppSurfer;

  117.             pictureBox1.Image = Image.FromFile(OutGrpahic);
  118.             //把绘制好的雨量图显示在pictureBox1上;

  119.         }
  120.     }
  121. }


rain.txt (1.64 KB, 下载次数: 230)

评分

参与人数 3威望 +1 金钱 +36 贡献 +7 体力 +200 收起 理由
fan_y_p + 1 赞一个!
topmad + 1 + 15 + 2
mofangbao + 20 + 5 + 200

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-5-21 21:28:56 | 显示全部楼层

哦~~~之前忘记说了,首先要安装surfer软件,我装的是surfer8.0。然后打开visual studio新建解决方案,在右边的解决方案资源管理器里的“引用”按右键,点添加引用--选择COM标签页--找到Surfer 8 type library--添加,就ok了。
如图:
添加引用.jpg

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-5-17 23:40:56 | 显示全部楼层
我靠,这玩意太霸道了啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-5-18 08:14:50 | 显示全部楼层
挺霸道的,灰常谢谢楼主
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-5-18 08:26:23 | 显示全部楼层
本帖最后由 传说中的谁 于 2012-5-18 08:27 编辑

楼主百色的?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-5-18 08:33:00 | 显示全部楼层
楼主的代码真眼熟。。。。。。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-5-18 08:34:12 | 显示全部楼层
为啥我用的模型就不支持调用呢....桑心ing
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-5-18 09:36:25 | 显示全部楼层
风行浪尖 发表于 2012-5-17 23:40
我靠,这玩意太霸道了啊

呵呵呵呵……
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-5-18 09:37:35 | 显示全部楼层
mofangbao 发表于 2012-5-18 08:14
挺霸道的,灰常谢谢楼主

太客气鸟……仍在学习中……
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-5-18 09:39:05 | 显示全部楼层
传说中的谁 发表于 2012-5-18 08:26
楼主百色的?

对啊……不小心暴露了自己的位置……
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-5-18 09:44:51 | 显示全部楼层
edwardli 发表于 2012-5-18 08:33
楼主的代码真眼熟。。。。。。。

呵呵……网上搜搜都差不多的……我只是稍微改了一下加了一下,生成自己台站要用的雨量图而已……
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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