爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 30162|回复: 51

[源程序] C# 调用surfer 的可以看看

[复制链接]

新浪微博达人勋

发表于 2013-4-17 11:37:22 | 显示全部楼层 |阅读模式

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

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

x
//生成dat文件              
                FileStream fs = new FileStream(strFilePathDat, FileMode.OpenOrCreate, FileAccess.Write);//这个是文件的地址
                StreamWriter sw = new StreamWriter(fs, Encoding.Default);

               。。。。。//这部分是加载你要的数据
//生成Grids文件
                appSurfer.GridData(DataFile: strFilePathDat,          //数据文件地址
                            xCol: 1,                                        //x为第一列数据
                            yCol: 2,                                        //y为第二列数据
                            zCol: 3,                                        //z为第三列数据
                            DupMethod: Surfer.SrfDupMethod.srfDupNone,
                            xMin: 100.4,                               //x最小值
                            xMax: 101.5,                               //x最大者
                            yMin: 21.4,                                //y最小值
                            yMax: 22.6,                                //y最大值
                            Algorithm: Surfer.SrfGridAlgorithm.srfKriging,  //插值算法Kriging
                            NumCols: (101.5 - 100.4) / 0.01,      //x方向插值数据量
                            NumRows: (22.6 - 21.4) / 0.01,        //y方向插值数据量
                            OutGrid: strFilePathGrid,                     //返回文件为gridfile
                            OutFmt: Surfer.SrfGridFormat.srfGridFmtAscii);  //返回文件编码为Ascii
                appSurfer.Quit();
                System.GC.Collect(System.GC.GetGeneration(appSurfer));


IDocuments docs = appSurfer.Documents;
                IPlotDocument Doc = (IPlotDocument)docs.Add(SrfDocTypes.srfDocPlot);    //创建一个空白绘图文档
                IShapes Shapes = Doc.Shapes;

                #region 添加等值面
                IMapFrame contourMapFrame = Shapes.AddContourMap(strFilePathGrid);    //加载网格文件,这个是上面生成的grd文件

                for (int i = 1; i <= contourMapFrame.Axes.Count; i++)
                {
                    contourMapFrame.Axes.Item(i).Visible = false;
                    contourMapFrame.Axes.Item(i).MajorTickType = SrfTickType.srfTickNone;
                    contourMapFrame.Axes.Item(i).ShowLabels = false;
                }
                contourMapFrame.SetLimits(
                            xMin: 100.4,                               //x最小值
                            xMax: 101.5,                               //x最大者
                            yMin: 21.4,                                //y最小值
                            yMax: 22.6                                 //y最大值
                );
                contourMapFrame.xMapPerPU = 0.25;           //设置比例
                contourMapFrame.yMapPerPU = 0.25;           //设置比例

                IContourMap contourMap = (IContourMap)contourMapFrame.Overlays.Item(1);
                contourMap.ShowColorScale = true;                                     // 显示对应色柱
                contourMap.ColorScale.Top = 7.5;                                     //色柱y方向位置
                contourMap.ColorScale.Left = contourMap.Left + contourMap.Width + 0.4;//色柱x方向位置
                contourMap.ColorScale.Width = 0.6;                                    //色柱宽度
                contourMap.ColorScale.Height = 4;                                     //色柱高度

                contourMap.FillContours = true;//添加颜色填充

                //加载系统颜色
                contourMap.FillForegroundColorMap.LoadFile(strFilePathColor);//这是surfer 10的一个颜色文件  安装在C盘下  应该就是这个路径了 C:\Program Files\Golden Software\Surfer 10\ColorScales\Rainbow.clr
                contourMap.ApplyFillToLevels(1, 1, 0);


                for (int i = 0; i < contourMap.Levels.Count; i++)
                {
                    contourMap.Levels.Item(i + 1).ShowLabel = true;                 //显示等值线上的数值
                    contourMap.Levels.Item(i + 1).ShowHach = false;                 //
                    contourMap.Levels.Item(i + 1).Line.Style = "Invisible";         //不显示线
                }
                contourMap.SmoothContours = SrfConSmoothType.srfConSmoothNone;   //平滑等值线边界当前设置不平滑
                #endregion


                #region 添加边界
                //后添加的会覆盖在先前添加的图片之上
                IMapFrame boundryMapFrame = Shapes.AddBaseMap(strFilePathTLBLN, "Defaults=1");//这个是一个bln文件
                for (int i = 1; i <= boundryMapFrame.Axes.Count; i++)
                {
                    boundryMapFrame.Axes.Item(i).Visible = true;                           //隐藏轴线
                    boundryMapFrame.Axes.Item(i).MajorTickType = SrfTickType.srfTickNone;   //隐藏边线
                    boundryMapFrame.Axes.Item(i).ShowLabels = true;                        //隐藏轴线上的坐标
                }

                boundryMapFrame.SetLimits(
                                  xMin: 100.4,                               //x最小值
                                  xMax: 101.5,                               //x最大者
                                  yMin: 21.4,                                //y最小值
                                  yMax: 22.6     //y最大值
                );
                boundryMapFrame.xMapPerPU = 0.25;
                boundryMapFrame.yMapPerPU = 0.25;

                IBaseMap boundryBaseMap = (IBaseMap)boundryMapFrame.Overlays.Item(1);
                boundryBaseMap.Line.Width = 0.01;           //设置边线宽度

                #endregion

                string strWH = string.Format("width = {0:f0}, height = {1:f0}, KeepAspect = 1, ColorDepth = 32", 540, 420);//设置输出图片的高度和宽度
                Doc.Export(strFilePathPNG, SelectionOnly: false, Options: strWH);//设置输出图片格式名
                Doc.Close(SrfSaveTypes.srfSaveChangesNo);   //不生成srf文件
                appSurfer.Quit();
                System.GC.Collect(System.GC.GetGeneration(appSurfer));



大致的代码就是了  一些调用的文件 应该能明白   下图是运行的结果   现在有点遗憾的是不知道怎么在各个区域的其中一个点加名称了。  如果哪位大神知道   帮忙修改一下。
Image.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-4-17 13:34:41 | 显示全部楼层
我不懂C#,具体的语句无法帮到你,但可以给你一个思路供参考。你要在图中某些位置显示文字,比如街区的名称,你可以另外制作一个数据文件,用图形的“数据化”命令,确定需要显示文字的位置的坐标,这样就生成了一个数据文件,第一列是X轴坐标,第二列是Y轴坐标,第三列的数据,应该是你确定的该点的名称,就是要显示的文字。这样就造就了一个多行的数据列表。用这样的列表文件,去生成一个散点图,就可以显示各个点的名称了。用C#语句实现起来对你来说应该不是难事了,看你上面的帖子就知道你的功底不浅。祝你成功。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-4-17 13:40:06 | 显示全部楼层

谢谢了,  正在研究  研究出来 就给补上
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-4-18 09:18:15 | 显示全部楼层
chengxf 发表于 2013-4-17 13:34
我不懂C#,具体的语句无法帮到你,但可以给你一个思路供参考。你要在图中某些位置显示文字,比如街区的名称 ...

您好   追加一个问题  我要去掉底图以外的图  怎么去掉     就是只要 边线以内的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-4-18 10:04:37 | 显示全部楼层
"您好   追加一个问题  我要去掉底图以外的图  怎么去掉     就是只要 边线以内的"

“去掉底图以外的图”就是所谓的白化问题,C#语言也可以使这步操作自动化,请参考“Surfer 10 版的 Script 实例”,以及其他网友的帖子,还有Surfer关于Script的帮助。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-4-18 10:27:11 | 显示全部楼层
chengxf 发表于 2013-4-18 10:04
"您好   追加一个问题  我要去掉底图以外的图  怎么去掉     就是只要 边线以内的"

“去掉底图以外的图” ...

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

新浪微博达人勋

 楼主| 发表于 2013-4-18 17:23:11 | 显示全部楼层
本帖最后由 ???еС? 于 2013-4-18 17:24 编辑
chengxf 发表于 2013-4-18 10:04
"您好   追加一个问题  我要去掉底图以外的图  怎么去掉     就是只要 边线以内的"

“去掉底图以外的图” ...

程老师 有关于这方面的文章吗?我都找不到啊!   麻烦您了。还有关于C# 调用surfer的  教程 或者资料。  谢谢了!  找了很久了  都没有啊!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-4-19 08:49:22 | 显示全部楼层
???еС? 发表于 2013-4-18 17:23
程老师 有关于这方面的文章吗?我都找不到啊!   麻烦您了。还有关于C# 调用surfer的  教程 或者资料。   ...

关于白化的文章和帖子很多,我翻译的教程里面也有,“多个多边形的白化问题”这个帖子也说到了白化,你自己搜索吧。至于C#调用Surfer实现自动化绘图,我没有什么资料,但是你可以借鉴有关Surfer的Script的相关文章和帖子,最重要的是应该学习Surfer中的帮助,里面说到很多,一般情况下大家不注重它,很可惜。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-4-19 10:00:15 | 显示全部楼层
chengxf 发表于 2013-4-19 08:49
关于白化的文章和帖子很多,我翻译的教程里面也有,“多个多边形的白化问题”这个帖子也说到了白化,你自 ...

好的,谢谢程老师了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-4-20 14:38:07 | 显示全部楼层
楼主能不能将测试数据共享一下,这样我们也可以学习学习
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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