C#中使用Surfer


做地理信息或者繪制等值線,都會選擇Surfer這個軟件。這個軟件對我們的作用有兩個(1)插值(2)繪圖。

軟件:Windows 7 x64,Microsoft Visual Studio 2012 RC,Surfer 10

一、添加引用,Surfer在COM組件中。

image

然后在代碼中加入 using Surfer;

二、創建一組原始數據文件命名為data.dat

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。

四、查看目錄下的grid.grd文件,插值完成

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));

六、生成的Image.png

image

 

七、發布

發布到WinForm沒有任何問題,如果發布到Web必須修改應用連接池權限。Surfer8及之前的版本無此問題。

 

八、總結

這個軟件的API其實還是蠻大的,不過文檔都是VB的,所以很多地方需要自己摸索,特別是發布為Web,找了很多辦法才解決。

主體上來說代碼部分就上面所寫的了。

謝謝觀賞


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM