登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
一、准备工作 (1) 安装surfer,版本11及以上,我安装的12。11以下中文超过三个字显示有问题,网上查询了一下有的说11一下字符集对中文支持的不足,或者可以进行汉化处理。安装后注册,否则C#调用组件的时候显示错误。 (2) 本地边界bln文件制作。网上有个Surfer11的教程,第一章讲的,不知道别人怎么实现的,我给大家分享一下我自己的制作步骤: a、 获得地图图片作为地图。那么问题来了,怎么获得高质量的地图图片。可以借用百度地图进行截图。但是百度地图没有边界没法制作,没关系,进入到百度地图API,http://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#的,但是对程序开发非常有用。建议大家了解一下,开发的时候可以查一下这个。 程序引用里加入Surfer (1)、创建网格文件(这块详细介绍一下帮助文档的使用) 首先创建一个Application,它代表了一个Surfer的应用程序,帮助文档里说的。 然后调用它的创建网格文件方法。帮助文档可以查询到Surfer提供了很多方法,关于网格文件的有两个 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)); } } |