查阅了许多参考资料,代码五花八门,能用的确少之又少,即便百般调试之下也会出些意料之外且无能为力的BUG,其中艰难不足为外人道也。但是最终仍是实现了插值的效果,于是写下这篇博文一是给有需求的小伙伴们一点参考,二是纪念下自己在这个点投入的并不对称的汗水和收获。。。。
在我这个系统中的IDW插值实现,主要可以分为两个部分,一是对目标点图层进行插值,二是对插值结果(栅格图层)进行栅格渲染(代码会在下面给出)。在这之前先给大家提供实现此功能所需添加的引用,每次参考哪些大神的博客时,都在在这个上面话不少功夫。
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesFile;
using Microsoft.VisualBasic;
using ESRI.ArcGIS.GeoAnalyst;
进行插值时主要可分为以下几个步骤,一是创建目标点图层的要素图层,IDW插值的环境设置,包括像元大小、搜索半径等(如果程序在这里报错,建议将目标点图层在ARCMAP中先利用IDW插值功能运行一遍,如果能成功出图,记录下各类参数),代码如下:
#region 插值
IInterpolationOp pInterpolationOp;
pInterpolationOp = new RasterInterpolationOpClass();
IFeatureClass pFeatureClass;
IFeatureLayer pFeaturelayer;
pFeaturelayer = this.axMapControl1.Map.get_Layer(0) as IFeatureLayer;//点图层在axMapControl控件的第一个,索引为0
pFeatureClass = pFeaturelayer.FeatureClass;
IRasterRadius pRadius;
pRadius = new RasterRadiusClass();
object maxDistance = Type.Missing;
pRadius.SetVariable(12, ref maxDistance);//定义搜索半径,本例为12
IFeatureClassDescriptor pFCDescriptor;
pFCDescriptor = new FeatureClassDescriptorClass();
pFCDescriptor.Create(pFeatureClass, null, "value");//设置进行插值的属性字段
object dCellSize = 113.039027413432;//设置像元值(参考ARCMAP)
IRasterAnalysisEnvironment pEnv;
pEnv = new RasterAnalysis();
pEnv = pInterpolationOp as IRasterAnalysisEnvironment;
pEnv.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, ref dCellSize);
object objectbarrier = Type.Missing;
IGeoDataset rasDataset;
rasDataset = pInterpolationOp.IDW((IGeoDataset)pFCDescriptor,
2, pRadius, ref objectbarrier);
IRaster pOutRaster;
pOutRaster = rasDataset as IRaster;
IRasterLayer pOutRasLayer;
pOutRasLayer = new RasterLayerClass();
pOutRasLayer.CreateFromRaster(pOutRaster);
this.axMapControl1.AddLayer(pOutRasLayer, 0);// 输出结果至axMapControl1,并放置在第一层
axMapControl1.ActiveView.Refresh();//刷新视图
DialogResult dr = MessageBox.Show("插值成功,请选择是否进行分级渲染", "分级渲染选择",
MessageBoxButtons.OKCancel, MessageBoxIcon.Information);//建立一个文件对话框的实例,用于接收用户指令。
如果用户选择进行分级渲染,则进入一下代码模块:
if (dr == DialogResult.OK)
{
//用户选择确认的操作(分级渲染)
IRasterLayer pRasterLayer = axMapControl1.get_Layer(i) as IRasterLayer;//获取需要分级渲染的栅格图层,i为图层在axMapControl中的索引i
int number = Convert.ToInt32(Interaction.InputBox("请输入栅格影像分类数量(默认为10)",
"字符串", "", 500, 250)); //调用VB的输入框获取用户需要的分级层数,默认为10
if (number == 0)
number = 10;
funColorForRaster_Classify(pRasterLayer, number);
axMapControl1.ActiveView.Refresh();
}
funColorForRaster_Classify(IRasterLayer pRasterLayer,int number)是一个自定义的方法,用于为输入的栅格图层按照指定的分级数量进行分级渲染,其代码如下:
IRasterClassifyColorRampRenderer pRClassRend = new
RasterClassifyColorRampRenderer() as IRasterClassifyColorRampRenderer;
IRasterRenderer pRRend = pRClassRend as IRasterRenderer;
IRaster pRaster = pRasterLayer.Raster;//栅格图层转换为栅格图
IRasterBandCollection pRBandCol = pRaster as IRasterBandCollection;
IRasterBand pRBand = pRBandCol.Item(0);
if (pRBand.Histogram == null)
{
pRBand.ComputeStatsAndHist();
}
pRRend.Raster = pRaster;
pRClassRend.ClassCount = number;//设置分级层次,默认为10
pRRend.Update();
//设置初始渐变色和结束渐变色
MessageBox.Show("请选择初始颜色", "颜色选择", MessageBoxButtons.OK, MessageBoxIcon.Information);
IRgbColor pFromColor = new RgbColor() as IRgbColor;
selectColor(pFromColor);//自定义的一个方法,用于打开颜色选取对话框,为IRgbColor类的实例赋值
MessageBox.Show("请选择结束颜色", "颜色选择", MessageBoxButtons.OK, MessageBoxIcon.Information);
IRgbColor pToColor = new RgbColor() as IRgbColor;
selectColor(pToColor);
//进行栅格渲染并输出至axMapControl
IAlgorithmicColorRamp colorRamp = new AlgorithmicColorRamp() as
IAlgorithmicColorRamp;
colorRamp.Size = 10;
colorRamp.FromColor = pFromColor;
colorRamp.ToColor = pToColor;
bool createColorRamp;
colorRamp.CreateRamp(out createColorRamp);
IFillSymbol fillSymbol = new SimpleFillSymbol() as IFillSymbol;
for (int i = 0; i < pRClassRend.ClassCount; i++)
{
fillSymbol.Color = colorRamp.get_Color(i);
pRClassRend.set_Symbol(i, fillSymbol as ISymbol);
pRClassRend.set_Label(i,
pRClassRend.get_Break(i).ToString("0.00"));
}
pRasterLayer.Renderer = pRRend;
IActiveView activeview = this.axMapControl1.ActiveView;
activeview.ContentsChanged();
//刷新窗口
activeview.PartialRefresh(esriViewDrawPhase.esriViewGeography, null,
null);
selectColor(IRgbColor)的代码如下:
//打开颜色选择对话框 并未IRGB类的三原色赋值
private void selectColor(IRgbColor selColor)
{
ColorDialog colorDialog = new ColorDialog();
colorDialog.AllowFullOpen = true;
colorDialog.FullOpen = true;
colorDialog.ShowHelp = true;
colorDialog.Color = Color.Black; //获取或设置用户所选定的颜色
colorDialog.ShowDialog();
selColor.Red = colorDialog.Color.R;
selColor.Green = colorDialog.Color.G;
selColor.Blue = colorDialog.Color.B;
MessageBox.Show("您选择的各颜色分量值分别为" + "\nR:" + colorDialog.Color.R.ToString()
+ "\nG:" + colorDialog.Color.G.ToString() + "\nB:" + colorDialog.Color.B.ToString());
}
本次分享到此结束,希望对有相关需要的小伙伴们有所帮助。