using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesRaster;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.SpatialAnalyst;
using ESRI.ArcGIS.GeoAnalyst;
namespace 克里金插值
{
public partial class FrmInterpolation : Form
{
public FrmInterpolation()
{
InitializeComponent();
}
private IRasterAnalysisEnvironment rasterEnv;//分析环境
private IInterpolationOp2 interOp;//空间插值对象
private IFeatureClass feaClass;
private IFeatureClassDescriptor feaDes;
private IGeoDataset inGeodataset;//输入栅格
private IGeoDataset outGeodataset;//输出栅格
#region 环境变量
private double cellSize = 500;//输出像元大小
private object Missing = Type.Missing;
private object cellSizeObj;
private object extentProObj;//处理范围
private IRasterRadius radius;
#endregion
#region Krige变量
private esriGeoAnalysisSemiVariogramEnum semiEnum;
#endregion
private void btnKrige_Click(object sender, EventArgs e)
{
try
{
interOp = rasterEnv as IInterpolationOp2;
//克里金插值方法
outGeodataset = interOp.Krige(inGeodataset, semiEnum, radius, true, ref Missing);
ShowResult(outGeodataset, "Krige");
MessageBox.Show("完成");
}
catch { }
}
private void FrmInterpolation_Load(object sender, EventArgs e)
{
rasterEnv = new RasterInterpolationOpClass();
}
private void cmbFields_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
feaDes = new FeatureClassDescriptorClass();
feaDes.Create(feaClass, null, cmbFields.SelectedItem.ToString());
inGeodataset = feaDes as IGeoDataset;
}
catch
{
MessageBox.Show("请输入栅格图层!");
};
}
private void txtCellSize_TextChanged(object sender, EventArgs e)
{
try
{
cellSize = Convert.ToDouble(txtCellSize.Text);
cellSizeObj = cellSize;
rasterEnv.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, ref cellSizeObj);
}
catch { }
}
private void cmbLayers_MouseClick(object sender, MouseEventArgs e)
{
ComboBox c = sender as ComboBox;
c.Items.Clear();
IMap map = axMapControl1.Map;
if (map != null)
{
for (int i = 0; i < map.LayerCount; i++)
{
c.Items.Add(map.get_Layer(i).Name);
}
}
}
private void cmbLayers_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
cmbFields.Items.Clear();
ILayer layer = getLayerFromName(cmbLayers.SelectedItem.ToString());
IFeatureLayer fl = layer as IFeatureLayer;
feaClass = fl.FeatureClass;
for (int i = 0; i < feaClass.Fields.FieldCount; i++)
{
cmbFields.Items.Add(feaClass.Fields.get_Field(i).Name);
}
extentProObj = layer;
//设置空间处理范围
rasterEnv.SetExtent(esriRasterEnvSettingEnum.esriRasterEnvValue, ref extentProObj, Missing);//设置空间处理范围
}
catch
{
MessageBox.Show("请输入栅格图层!");
}
}
private void cmbRadius_TextChanged(object sender, EventArgs e)
{
radius = new RasterRadiusClass();
int index = cmbRadius.SelectedIndex;
switch (index)
{
case 0://搜索半径设为固定,距离为2500
//radius.SetFixed(2500, Missing);
radius.SetVariable(12, Missing);
break;
case 1://搜索半径设为变量,点数为12
radius.SetVariable(12, Missing);
break;
}
}
private void cmbSemiEnum_SelectedIndexChanged(object sender, EventArgs e)
{
int index = cmbSemiEnum.SelectedIndex;
switch (index)
{
case 0://球面
semiEnum = esriGeoAnalysisSemiVariogramEnum.esriGeoAnalysisSphericalSemiVariogram;
break;
case 1://圆
semiEnum = esriGeoAnalysisSemiVariogramEnum.esriGeoAnalysisCircularSemiVariogram;
break;
case 2://指数
semiEnum = esriGeoAnalysisSemiVariogramEnum.esriGeoAnalysisExponentialSemiVariogram;
break;
case 3://高斯
semiEnum = esriGeoAnalysisSemiVariogramEnum.esriGeoAnalysisGaussianSemiVariogram;
break;
case 4://线型
semiEnum = esriGeoAnalysisSemiVariogramEnum.esriGeoAnalysisLinearSemiVariogram;
break;
}
}
//通过图层名得到图层
private ILayer getLayerFromName(string layerName)
{
ILayer layer;
IMap map = axMapControl1.Map;
for (int i = 0; i < map.LayerCount; i++)
{
layer = map.get_Layer(i);
if (layerName == layer.Name)
return layer;
}
return null;
}
//显示分析结果
private void ShowResult(IGeoDataset geoDataset, string interType)
{
IRasterLayer rasterLayer = new RasterLayerClass();
IRaster raster = new Raster();
raster = (IRaster)geoDataset;
rasterLayer.CreateFromRaster(raster);
rasterLayer.Name = interType;
axMapControl1.AddLayer((ILayer)rasterLayer, 1);
axMapControl1.ActiveView.Refresh();
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
}
}
}
克里金插值
最新推荐文章于 2024-09-13 22:31:11 发布