爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 21260|回复: 19

[源程序] C#制作surfer雨量等值线图步骤详解

[复制链接]

新浪微博达人勋

发表于 2017-2-8 10:10:27 | 显示全部楼层 |阅读模式

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

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

x
anshan0739.png
一、准备工作
(1)       安装surfer,版本11及以上,我安装的1211以下中文超过三个字显示有问题,网上查询了一下有的说11一下字符集对中文支持的不足,或者可以进行汉化处理。安装后注册,否则C#调用组件的时候显示错误。
(2)       本地边界bln文件制作。网上有个Surfer11的教程,第一章讲的,不知道别人怎么实现的,我给大家分享一下我自己的制作步骤:
a、  获得地图图片作为地图。那么问题来了,怎么获得高质量的地图图片。可以借用百度地图进行截图。但是百度地图没有边界没法制作,没关系,进入到百度地图APIhttp://lbsyun.baidu.com/jsdemo.htm#a1_2  ,进入到示例demo,找到添加行政区划
把北京市海淀区修改成你自己的行政区。例如我修改成大连市普兰店
好的,由于我屏幕的太小,我将地图放大到适当的小大后截取了两张图用PS进行了拼接,得到了一个1685X1932的图片。如果你不介意用小一点的图片也可以制作。
b、  打开surfer
选择base map,选中刚才图片。鼠标滚动,调整适当大小后选择Digitize
具体怎么制作看网上相关教程。最后我们得到一个bln文件。
(3)       比较困难的一步,我的做法是,获得所在区域观测站点的surfer坐标信息。我还是通过百度地图API实现的,首先你得知道各个站点的GIS坐标信息,转换成百度地图坐标。然后在地图上加载出所有站点坐标点。截图进行Surfer处理。     
注意:  2)、(3)获得的图片应该是一张。在地图上显示边界、坐标。然后(2)、(3)用这一个图片获取边界和坐标。
站点的bln文件,另存为dat文件,去掉首行。
(4)       将坐标的dat文件第三行修改成雨量信息。(可以用C#获取雨量生产该文件)
(5)       制作等值线着色文件lvl
二、以上工作都搞定了就可以进行C#程序开发了。开发之前有必要介绍一下Surfer的帮助文档,虽然不是专门C#的,但是对程序开发非常有用。建议大家了解一下,开发的时候可以查一下这个。
image007.png image011.png image010.png
程序引用里加入Surfer
image008.png
1)、创建网格文件(这块详细介绍一下帮助文档的使用)
首先创建一个Application,它代表了一个Surfer的应用程序,帮助文档里说的。
然后调用它的创建网格文件方法帮助文档可以查询到Surfer提供了很多方法,关于网格文件的有两个
GridData GridData2他俩区别不是很大。文档建议使用griddata这个。代码如下:
  app.GridData2(DataFile: path + "20160639降水.dat",          //数据文件地址
                 xCol: 1,                                        //x为第一列数据
                 yCol: 2,                                        //y为第二列数据
                 zCol: 3,                                        //z为第三列数据
                 DupMethod: Surfer.SrfDupMethod.srfDupNone,//消除重复
                 xMin: 0,                               //x最小值
                 xMax: 1684,                            //x最大者
                 yMin: 0,                                //y最小值
                 yMax: 1931,                                //y最大值
                 Algorithm: Surfer.SrfGridAlgorithm.srfKriging,  //插值算法Kriging
                 NumCols: 1684,      //x方向插值数据量
                 NumRows: 1931,      //y方向插值数据量
                 OutGrid: path + "anshangrid.grd",               //返回文件为gridfile
                 OutFmt: Surfer.SrfGridFormat.srfGridFmtAscii);  //返回文件编码为Ascii
然后进行白化处理
app.GridBlank(InGrid: path + "anshangrid.grd", BlankFile: path + "anshan.bln", OutGrid: path + "anshangrid_blank.grd");
不做详细介绍了,看代码吧。
class T2
    {
        //
        public void test2()
        {
            Application app = new Application();
            string path = AppDomain.CurrentDomain.BaseDirectory;
            app.GridData2(DataFile: path + "20160639鞍山降水.dat",          //数据文件地址
                 xCol: 1,                                        //x为第一列数据
                 yCol: 2,                                        //y为第二列数据
                 zCol: 3,                                        //z为第三列数据
                 DupMethod: Surfer.SrfDupMethod.srfDupNone,//消除重复
                 xMin: 0,                               //x最小值
                 xMax: 1684,                            //x最大者
                 yMin: 0,                                //y最小值
                 yMax: 1931,                                //y最大值
                 Algorithm: Surfer.SrfGridAlgorithm.srfKriging,  //插值算法Kriging
                 NumCols: 1684,      //x方向插值数据量
                 NumRows: 1931,      //y方向插值数据量
                 OutGrid: path + "anshangrid.grd",               //返回文件为gridfile
                 OutFmt: Surfer.SrfGridFormat.srfGridFmtAscii);  //返回文件编码为Ascii
            app.Quit();
            app.GridBlank(InGrid: path + "anshangrid.grd", BlankFile: path + "anshan.bln", OutGrid: path + "anshangrid_blank.grd");
            Console.WriteLine("完成白化");
            app = new Application();
            IDocuments docs = app.Documents;
            IPlotDocument Doc = docs.Add();//创建一个空白绘图文档IPlotDocument Doc = (IPlotDocument)docs.Add(SrfDocTypes.srfDocPlot);
            IShapes Shapes = Doc.Shapes;//在绘图文档中创建一个图形对象
            IMapFrame contourMapFrame = Shapes.AddContourMap(path + "anshangrid_blank.grd");//添加一个等值线图
            IContourMap contourMap = (IContourMap)contourMapFrame.Overlays.Item(1);
            contourMapFrame.SetLimits(
                xMin: 0, //x最小值
                xMax: 1684,           //x最大者
                yMin: 0,            //y最小值
                yMax: 1931             //y最大值
            );
            contourMap.ShowColorScale = true;
            contourMap.FillContours = true;
            contourMap.Levels.LoadFile(path + "24小时累计降水量.lvl");//加载指定的颜色光谱文件
            //添加边界文件
            IMapFrame boundryMapFrame = Shapes.AddBaseMap(path + "anshan.bln", "Defaults=1");
            boundryMapFrame.SetLimits(
                    xMin: 0, //x最小值
                    xMax: 1684,           //x最大者
                    yMin: 0,            //y最小值
                    yMax: 1931             //y最大值
            );
            IMapFrame postMapFrame = Shapes.AddPostMap2(DataFileName: path + "鞍山市级坐标.dat",xCol:1,yCol:2,LabCol:3);
            //设置散点样式
            IPostMap postMap = (IPostMap)postMapFrame.Overlays.Item(1);
            postMap.LabelFont.Face = "黑体";//设置成中文样式
            postMap.LabelFont.Size = 13;//字体大小
           // postMap.LabelFont.Color = Surfer.srfColor.srfColorRed;//字体颜色
            postMap.Symbol.Size = 0.08;//设置大小
            postMap.Symbol.FillColor = Surfer.srfColor.srfColorRed;//设置符号颜色
            postMap.Symbol.Index = 12;//设置符号的样式
            //添加标题
            IText text = Shapes.AddText(3.2, 8.45, "39日降水数据自己编的仅供开发测试");
            text.Font.Face = "黑体";
            //让所有图层坐标重合叠加
            Doc.Shapes.SelectAll();
            Surfer.ISelection sel = Doc.Selection;
            sel.OverlayMaps();
            Doc.Export2(path + "anshan0729.png", Options: "Width=1003, Height=949, KeepAspect=0", FilterId: "png");
            Doc.Close(SrfSaveTypes.srfSaveChangesNo);  //不生成srf文件
            app.Quit();
            System.GC.Collect(System.GC.GetGeneration(app));
        }
    }
image002.png
image005.png

T2.cs

4.26 KB, 下载次数: 27, 下载积分: 金钱 -5

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

新浪微博达人勋

发表于 2017-2-8 10:37:03 | 显示全部楼层
厉害了,我的小伙伴
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-2-8 10:40:01 | 显示全部楼层
clare 发表于 2017-2-8 10:37
厉害了,我的小伙伴

刚开始学习这块,欢迎交流学习哈。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-2-9 08:58:06 | 显示全部楼层
厉害,学习学习
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-5-16 12:19:11 | 显示全部楼层
{:eb502:}{:eb502:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2017-5-16 22:48:52 | 显示全部楼层
b、  打开surfer
选择base map,选中刚才图片。鼠标滚动,调整适当大小后选择Digitize。
具体怎么制作看网上相关教程。最后我们得到一个bln文件。——请教:“具体怎么制作看网上相关教程。最后我们得到一个bln文件。”——正是此环节不懂,向各位请教!或者给我指点出处或给一个链接吧
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-6-6 13:48:40 | 显示全部楼层
张爱气象 发表于 2017-5-16 22:48
b、  打开surfer
选择base map,选中刚才图片。鼠标滚动,调整适当大小后选择Digitize。
具体怎么制作看 ...

好久没登陆,选择Digitize,就是数字化那个,就是沿着边线点击鼠标。我那边线是红色的,一定要选择一个起点后顺着往下点。直线的地方可以不用太密集,曲线的地方多点几个轮廓就清楚了。一定要耐心细致连续的完成。最后注意1、将点击后生产的BLN文件的第一行复制,作为最后一行,表示将多边形闭合。2然后在第一行第一列加入线段数,就是数据表的标号减一。第二列加入白化方式。0是外部白化,1是内部白化。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-6-6 13:54:45 | 显示全部楼层
张爱气象 发表于 2017-5-16 22:48
b、  打开surfer
选择base map,选中刚才图片。鼠标滚动,调整适当大小后选择Digitize。
具体怎么制作看 ...

实在不行加我QQ一起学习,314795969
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-6-11 15:30:43 | 显示全部楼层
谢谢楼主分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-6-11 15:32:15 | 显示全部楼层
谢谢楼主分享
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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