做地理信息或者绘制等值线,都会选择Surfer这个软件。这个软件对我们的作用有两个(1)插值(2)绘图。
软件:Windows 7 x64,Microsoft Visual Studio 2012 RC,Surfer 10
然后在代码中加入 using Surfer;
A B C 120.12 31.52 89.79 119.95 31.32 83.26 120.47 31.22 81.31 120.30 31.10 86.61 120.38 30.97 83.15 120.10 30.95 84.17 120.65 31.20 80.17 119.93 30.28 90.50 120.08 30.55 91.64 120.47 30.90 79.73 120.18 30.48 84.60 120.43 30.53 83.61 120.73 30.75 87.01 120.72 30.88 80.97 120.18 30.72 83.37 120.28 30.62 80.03 120.32 30.78 87.27 120.50 30.75 79.74 120.43 30.88 81.81 120.27 30.45 86.04 120.53 30.63 87.13 120.68 30.52 86.14 120.92 30.43 79.39 120.85 30.53 81.73 121.03 30.68 95.00 120.92 30.85 87.40 120.83 30.75 92.30 120.83 31.02 81.77 120.18 31.65 104.16 120.25 31.75 97.80 120.25 31.92 95.63 120.42 31.95 98.16 120.53 31.73 85.53 120.67 31.98 93.80 120.38 31.80 100.58 120.75 31.63 83.27 121.03 31.70 87.42 120.73 31.48 77.56 121.27 31.50 96.19 120.97 31.38 94.84 120.63 31.00 75.23 121.10 31.45 102.03 120.92 31.12 76.40 120.95 31.32 94.21 119.35 31.45 90.56 119.52 31.43 88.80 119.83 31.37 103.36 119.57 31.75 97.85 119.53 31.68 96.52 119.55 31.23 92.77 119.98 31.52 85.24 119.25 31.55 101.62 119.43 31.23 90.09 119.75 31.68 102.12 119.57 31.63 98.45 119.57 31.98 93.84 119.63 30.27 92.78 119.68 30.23 92.63 119.80 30.25 100.69 119.97 30.40 92.96 119.90 30.53 95.44 119.72 30.73 90.87 119.87 30.87 86.82 119.48 30.53 96.67 119.57 30.43 152.66 119.58 30.35 100.68 119.52 30.30 84.11 119.63 30.18 102.20 119.75 30.33 90.42 119.87 30.62 92.62 119.78 30.53 107.69 119.83 30.52 107.95 120.00 30.78 107.96 119.25 30.53 92.84 119.33 30.63 98.59 119.38 30.58 83.97 119.42 30.42 94.15 119.38 30.48 93.54 119.47 30.45 102.92 119.52 30.43 124.86 119.63 30.50 117.88 119.70 30.63 92.68 119.58 30.75 99.43 119.60 30.83 94.63 119.80 30.70 106.83 119.80 31.05 93.04 119.92 31.00 91.79 119.55 30.92 87.18 119.68 31.12 100.53 119.78 31.15 115.56 121.15 30.97 78.28 120.98 31.08 78.57 121.12 31.12 78.25 121.23 31.27 96.45 121.15 31.33 98.21 121.73 30.98 81.56
Application app = new Application(); var path = AppDomain.CurrentDomain.BaseDirectory; app.GridData2(DataFile: path + "data.dat", //数据文件地址 xCol: 1, //x为第一列数据 yCol: 2, //y为第二列数据 zCol: 3, //z为第三列数据 DupMethod: Surfer.SrfDupMethod.srfDupNone, xMin: 117.742635, //x最小值 xMax: 122.452486, //x最大者 yMin: 29.418809, //y最小值 yMax: 32.463007, //y最大值 Algorithm: Surfer.SrfGridAlgorithm.srfKriging, //插值算法Kriging NumCols: (122.452486 - 117.742635) / 0.01, //x方向插值数据量 NumRows: (32.463007 - 29.418809) / 0.01, //y方向插值数据量 OutGrid: path + "grid.grd", //返回文件为gridfile OutFmt: Surfer.SrfGridFormat.srfGridFmtAscii); //返回文件编码为Ascii app.Quit(); System.GC.Collect(System.GC.GetGeneration(app));
插值算法有很多,大家可以去API中查找SrfGridAlgorithm,这里就不多说了。
生成的文件格式也有很多种,有种比较精简的是srfGridFmtBinary。
DSAA 471 304 117.742635 122.452486 29.418809 32.463007 75.361336919208 149.92207125061 91.83441632763108 91.81999394510157 91.80551937407597 91.79099305953743 91.77641547089857 91.76178710274148 91.74710847558691 91.73238013667276 91.71760266076672 91.70277665099104 91.68790273967451 91.67298158922344 91.65801389301778 91.64300037633481 91.62794179728556 91.61283894778934 91.59769265456495 91.58250378014809 91.56727322394012 91.55200192327513
生成图片有很多很多种类,这里就只讲解2种一个是ContourMap另一个是BaseMap代码如下,就不细致讲解了。
Application app = new Application(); IDocuments docs = app.Documents; IPlotDocument Doc = (IPlotDocument)docs.Add(SrfDocTypes.srfDocPlot); //创建一个空白绘图文档 IShapes Shapes = Doc.Shapes; var path = AppDomain.CurrentDomain.BaseDirectory; #region 添加等值面 IMapFrame contourMapFrame = Shapes.AddContourMap(path + "grid.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: 117.742635, //x最小值 xMax: 122.452486, //x最大者 yMin: 29.418809, //y最小值 yMax: 32.463007 //y最大值 ); contourMapFrame.xMapPerPU = 0.25; //设置比例 contourMapFrame.yMapPerPU = 0.25; //设置比例 IContourMap contourMap = (IContourMap)contourMapFrame.Overlays.Item(1); //contourMap.ShowColorScale = true; // 显示对应色柱 //contourMap.ColorScale.Top = 8.48; //色柱y方向位置 //contourMap.ColorScale.Left = contourMap.Left + contourMap.Width + 0.8;//色柱x方向位置 //contourMap.ColorScale.Width = 0.8; //色柱宽度 //contourMap.ColorScale.Height = 8; //色柱高度 contourMap.FillContours = true;//添加颜色填充 //通过文件加载颜色 //ILevels levels = contourMap.Levels; //levels.LoadFile(Server.MapPath("Data\\Desert.lvl")); //加载系统颜色 contourMap.FillForegroundColorMap.LoadFile("C:\\Program Files\\Golden Software\\Surfer 10\\ColorScales\\Rainbow.clr"); contourMap.ApplyFillToLevels(1, 1, 0); //使用灰色 //contourMap.Levels.AutoGenerate(contourMap.Grid.zMin,contourMap.Grid.zMax,10); 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(path + "boundry.bln", "Defaults=1"); for (int i = 1; i <= boundryMapFrame.Axes.Count; i++) { boundryMapFrame.Axes.Item(i).Visible = false; //隐藏轴线 boundryMapFrame.Axes.Item(i).MajorTickType = SrfTickType.srfTickNone; //隐藏边线 boundryMapFrame.Axes.Item(i).ShowLabels = false; //隐藏轴线上的坐标 } boundryMapFrame.SetLimits(xMin: 117.742635, //x最小值 xMax: 122.452486, //x最大者 yMin: 29.418809, //y最小值 yMax: 32.463007 //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", 1024, 768);//设置输出图片的高度和宽度 Doc.Export2(path + "Image.png", SelectionOnly: false, Options: strWH, FilterId: "png");//设置输出图片格式名 Doc.Close(SrfSaveTypes.srfSaveChangesNo); //不生成srf文件 app.Quit(); System.GC.Collect(System.GC.GetGeneration(app));
发布到WinForm没有任何问题,如果发布到Web必须修改应用连接池权限。Surfer8及之前的版本无此问题。
这个软件的API其实还是蛮大的,不过文档都是VB的,所以很多地方需要自己摸索,特别是发布为Web,找了很多办法才解决。
主体上来说代码部分就上面所写的了。
谢谢观赏