/// <summary> /// 获取当前栅格图层中城市用地类型栅格的数量。区分栅格图层是否有属性表两种情况。 /// </summary> /// <param name="rasterLayer"></param> /// <param name="landUseClassificationInfo"></param> /// <returns></returns> public static int GetUrbanCount(IRasterLayer rasterLayer, LandUseClassificationInfo landUseClassificationInfo) { int urbanConuts = 0; IRasterBandCollection rbc = rasterLayer.Raster as IRasterBandCollection; IRasterBand rb = rbc.Item(0); //ITable table = rbc.Item(0).AttributeTable; //AttributeTable - OID, Value, Count ITable attributeTable = rb.AttributeTable; if (attributeTable != null) { int count = attributeTable.RowCount(null); int[] values = new int[count]; int[] counts = new int[count]; ICursor cursor = attributeTable.Search(null, false); IRow row = cursor.NextRow(); int index = 0; //数据不一定有OBJECTID字段。同时列名称及顺序不一定符合条件Value,Count。 while (row != null) { values[index] = Convert.ToInt32(row.get_Value(GetColumnIndex(attributeTable, "VALUE"))); counts[index] = Convert.ToInt32(row.get_Value(GetColumnIndex(attributeTable, "COUNT"))); row = cursor.NextRow(); index++; } for (int j = 0; j < count; j++) { for (int i = 0; i < landUseClassificationInfo.UrbanValues.Count; i++) { if (Convert.ToSingle(values[j]) == landUseClassificationInfo.UrbanValues[i].LanduseTypeValue) { urbanConuts += Convert.ToInt32(counts[j]); } } } } else { rb.ComputeStatsAndHist(); IRasterHistogram rh = rb.Histogram; object rhCount = rh.Counts; double[] counts = (double[])rhCount; IRasterUniqueValueRenderer rasterUniqueValueRenderer = (IRasterUniqueValueRenderer)rasterLayer.Renderer; IRasterRendererUniqueValues rasterRendererUniqueValues = (IRasterRendererUniqueValues)rasterUniqueValueRenderer; IUniqueValues uniqueValues = rasterRendererUniqueValues.UniqueValues; for (int j = 0; j < uniqueValues.Count; j++) { for (int i = 0; i < landUseClassificationInfo.UrbanValues.Count; i++) { if (Convert.ToSingle(uniqueValues.get_UniqueValue(j)) == landUseClassificationInfo.UrbanValues[i].LanduseTypeValue) { urbanConuts += Convert.ToInt32(counts[j + 1]); } } } } return(urbanConuts); }
/// <summary> /// Ge the render color of the input layer rendering with discrete color ramp. /// </summary> /// <param name="layer">Input raster layer</param> /// <param name="value">Pixel value</param> /// <returns></returns> private static IColor GetRenderColor_UniqueValues(ILayer layer, double value) { IRasterLayer rasterLayer = (IRasterLayer)layer; // Check whether the value is NoData value IRasterProps rasterProps = (IRasterProps)rasterLayer.Raster; System.Array noDataValue = (System.Array)rasterProps.NoDataValue; if ((rasterProps.NoDataValue != null) && (Convert.ToDouble(noDataValue.GetValue(0)) == value)) { return(null); } IRasterRendererUniqueValues uniqueValues = (IRasterRendererUniqueValues)rasterLayer.Renderer; IRasterRendererColorRamp colorRamp = (IRasterRendererColorRamp)rasterLayer.Renderer; for (int i = 0; i < uniqueValues.UniqueValues.Count; i++) { if (value == Convert.ToDouble(uniqueValues.UniqueValues.UniqueValue[i])) { return(colorRamp.ColorRamp.Color[i]); } } return(null); }
public static bool UniqueValueRenderer(IColorRamp colorRamp, IRasterLayer rasterLayer, string renderfiled = "Value") { try { IRasterUniqueValueRenderer uniqueValueRenderer = new RasterUniqueValueRendererClass(); IRasterRenderer pRasterRenderer = uniqueValueRenderer as IRasterRenderer; pRasterRenderer.Raster = rasterLayer.Raster; pRasterRenderer.Update(); IUniqueValues uniqueValues = new UniqueValuesClass(); IRasterCalcUniqueValues calcUniqueValues = new RasterCalcUniqueValuesClass(); calcUniqueValues.AddFromRaster(rasterLayer.Raster, 0, uniqueValues);//iBand=0 IRasterRendererUniqueValues renderUniqueValues = uniqueValueRenderer as IRasterRendererUniqueValues; renderUniqueValues.UniqueValues = uniqueValues; uniqueValueRenderer.Field = renderfiled; colorRamp.Size = uniqueValues.Count; uniqueValueRenderer.HeadingCount = 1; uniqueValueRenderer.set_Heading(0, "All Data Value"); uniqueValueRenderer.set_ClassCount(0, uniqueValues.Count); bool pOk; colorRamp.CreateRamp(out pOk); IRasterRendererColorRamp pRasterRendererColorRamp = uniqueValueRenderer as IRasterRendererColorRamp; pRasterRendererColorRamp.ColorRamp = colorRamp; for (int i = 0; i < uniqueValues.Count; i++) { uniqueValueRenderer.AddValue(0, i, uniqueValues.get_UniqueValue(i)); uniqueValueRenderer.set_Label(0, i, uniqueValues.get_UniqueValue(i).ToString()); IFillSymbol fs = new SimpleFillSymbol(); //fs.Color = colorRamp.get_Color(i); IColor color = new RgbColorClass(); if ((Convert.ToByte(uniqueValues.get_UniqueValue(i)) == 255) || (Convert.ToByte(uniqueValues.get_UniqueValue(i)) == 0)) { color.NullColor = true; color.Transparency = 0; fs.Color = color; } else { IRgbColor rgbColor = color as IRgbColor; rgbColor.Red = 0; rgbColor.Green = 255; rgbColor.Blue = 0; fs.Color = rgbColor as IColor; } uniqueValueRenderer.set_Symbol(0, i, fs as ISymbol); } pRasterRenderer.Update(); rasterLayer.Renderer = pRasterRenderer; } catch (Exception ex) { return(false); } return(true); }
/// <summary> /// 设置栅格渲染的唯一值 /// </summary> /// <param name="uniqueValueRenderer">唯一值渲染</param> private void SetRasterUniqueValue(IRasterUniqueValueRenderer uniqueValueRenderer) { //必须计算获取唯一值,添加到图层,不然只能渲染0值 IUniqueValues uniqueValues = GetFloatValueAndCount(rasterLayer); IRasterRendererUniqueValues renderUniqueValues = uniqueValueRenderer as IRasterRendererUniqueValues; if (renderUniqueValues != null) { renderUniqueValues.UniqueValues = uniqueValues; } }
public static void uniqueRender(IRasterLayer rasterLayer) { if (rasterLayer == null) { return; } IRaster raster = rasterLayer.Raster; IRasterUniqueValueRenderer render = new RasterUniqueValueRendererClass(); IRasterRenderer rasterRender = render as IRasterRenderer; rasterRender.Raster = raster; rasterRender.Update(); IUniqueValues uniqueValues = new UniqueValuesClass(); IRasterCalcUniqueValues calcUniqueValues = new RasterCalcUniqueValuesClass(); calcUniqueValues.AddFromRaster(raster, 0, uniqueValues); IRasterRendererUniqueValues renderUniqueValues = render as IRasterRendererUniqueValues; renderUniqueValues.UniqueValues = uniqueValues; render.Field = "Value"; render.HeadingCount = 1; render.set_Heading(0, "淹没水深"); render.set_ClassCount(0, uniqueValues.Count); IRandomColorRamp ramp = new RandomColorRampClass(); ramp.Size = uniqueValues.Count; bool b = true; ramp.CreateRamp(out b); for (int i = 0; i < uniqueValues.Count; i++) { render.AddValue(0, i, uniqueValues.get_UniqueValue(i)); render.set_Label(0, i, uniqueValues.get_UniqueValue(i).ToString()); ISimpleFillSymbol fillSymbol = new SimpleFillSymbolClass(); fillSymbol.Color = ramp.get_Color(i); render.set_Symbol(0, i, fillSymbol as ISymbol); } rasterRender.Update(); rasterLayer.Renderer = rasterRender; }
/// <summary> /// 获取当前栅格图层中各种用地类型栅格的数量。区分栅格图层是否有属性表两种情况。 /// </summary> /// <param name="rasterLayer"></param> /// <returns></returns> public static int[] GetLandUseTypesCount(IRasterLayer rasterLayer) { int[] landusetypesCounts; IRasterBandCollection rbc = rasterLayer.Raster as IRasterBandCollection; IRasterBand rb = rbc.Item(0); ITable attributeTable = rb.AttributeTable; if (attributeTable != null) { int count = attributeTable.RowCount(null); int[] values = new int[count]; landusetypesCounts = new int[count]; ICursor cursor = attributeTable.Search(null, false); IRow row = cursor.NextRow(); int index = 0; //数据不一定有OBJECTID字段。同时列名称及顺序不一定符合条件Value,Count。 while (row != null) { values[index] = Convert.ToInt32(row.get_Value(GetColumnIndex(attributeTable, "VALUE"))); landusetypesCounts[index] = Convert.ToInt32(row.get_Value(GetColumnIndex(attributeTable, "COUNT"))); row = cursor.NextRow(); index++; } } else { rb.ComputeStatsAndHist(); IRasterHistogram rh = rb.Histogram; object rhCount = rh.Counts; double[] counts = (double[])rhCount; landusetypesCounts = new int[counts.Length]; IRasterUniqueValueRenderer rasterUniqueValueRenderer = (IRasterUniqueValueRenderer)rasterLayer.Renderer; IRasterRendererUniqueValues rasterRendererUniqueValues = (IRasterRendererUniqueValues)rasterUniqueValueRenderer; IUniqueValues uniqueValues = rasterRendererUniqueValues.UniqueValues; for (int j = 0; j < uniqueValues.Count; j++) { landusetypesCounts[j] = Convert.ToInt32(counts[j]); } } return(landusetypesCounts); }
/// <summary> /// 读取并填充土地利用类型信息。 /// </summary> private void FillLanduseInfo(string layerName) { dataGridViewLandUse.Rows.Clear(); //根据第一个图层的符号化设置读取土地利用类型信息。 //注意:因为一般来说符号化设置的设置和属性表一致,因为不需要考虑顺序不一致的问题。 IRasterLayer rasterLayer = ArcGISOperator.GetRasterLayerByName(layerName); IRasterUniqueValueRenderer rasterUniqueValueRenderer = (IRasterUniqueValueRenderer)rasterLayer.Renderer; IRasterRendererUniqueValues rasterRendererUniqueValues = (IRasterRendererUniqueValues)rasterUniqueValueRenderer; IUniqueValues uniqueValues = rasterRendererUniqueValues.UniqueValues; List <object> listUniqueValues = new List <object>(); for (int i = 0; i < uniqueValues.Count; i++) { listUniqueValues.Add(uniqueValues.get_UniqueValue(i)); } int classCount = rasterUniqueValueRenderer.get_ClassCount(0); for (int i = 0; i < classCount; i++) { dataGridViewLandUse.Rows.Add(); dataGridViewLandUse.Rows[i].Cells[0].Value = rasterUniqueValueRenderer.get_Label(0, i); } }
/// <summary> /// 设置图层渲染器。 /// </summary> /// <param name="rasterLayer">需要渲染唯一值的栅格图层。</param> /// <param name="renderfiled">渲染的字段(可选,默认为Value)。</param> /// <returns></returns> public IRasterRenderer UniqueValueRender(IRasterLayer rasterLayer, string renderfiled = "Value") { try { //这是从头用到尾的对象 IRasterUniqueValueRenderer uniqueValueRenderer = new RasterUniqueValueRendererClass { Field = renderfiled }; IRasterRenderer pRasterRenderer = uniqueValueRenderer as IRasterRenderer; //计算栅格唯一值 IRasterCalcUniqueValues calcUniqueValues = new RasterCalcUniqueValuesClass(); IUniqueValues uniqueValues = new UniqueValuesClass(); calcUniqueValues.AddFromRaster(rasterLayer.Raster, 0, uniqueValues); //设置唯一值 IRasterRendererUniqueValues renderUniqueValues = uniqueValueRenderer as IRasterRendererUniqueValues; renderUniqueValues.UniqueValues = uniqueValues; //创建色带 IRgbColor pFromColor = FromIC; IRgbColor pToColor = ToIC; IAlgorithmicColorRamp colorRamp = new AlgorithmicColorRampClass { FromColor = pFromColor, ToColor = pToColor, Size = uniqueValues.Count }; bool pOk; colorRamp.CreateRamp(out pOk); //设置标题 uniqueValueRenderer.HeadingCount = 1; uniqueValueRenderer.set_Heading(0, "All Data Value"); uniqueValueRenderer.set_ClassCount(0, uniqueValues.Count); //设置色带 IRasterRendererColorRamp pRasterRendererColorRamp = uniqueValueRenderer as IRasterRendererColorRamp; pRasterRendererColorRamp.ColorRamp = colorRamp; //需要对算出来的唯一值升序重排 double[] tmp = new double[uniqueValues.Count]; for (int i = 0; i < uniqueValues.Count; i++) { tmp[i] = Convert.ToDouble(uniqueValues.get_UniqueValue(i)); } System.Array.Sort(tmp); //对每一个唯一值设置颜色 for (int i = 0; i < uniqueValues.Count; i++) { //添加唯一值并设置标签 uniqueValueRenderer.AddValue(0, i, tmp[i]); uniqueValueRenderer.set_Label(0, i, tmp[i].ToString()); //透明色及参数 IRgbColor zerocolor = new RgbColorClass() { Transparency = 0, NullColor = true, }; IFillSymbol fs = new SimpleFillSymbol(); //唯一值填充符号 if (tmp[i] == 0) //将值为0的栅格颜色设为透明 { fs = new SimpleFillSymbol { Color = zerocolor }; } else //值不为零则设置为色带对应索引颜色 { fs.Color = colorRamp.get_Color(i); } uniqueValueRenderer.set_Symbol(0, i, fs as ISymbol); //对唯一值设置色带对应颜色 } return(pRasterRenderer); } catch (Exception ex) { MessageBox.Show(ex.ToString()); return(null); } }
/// <summary> /// 当向导页的新一页出现前可以做的该页初始化工作。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void wizardLogistcCA_AfterSwitchPages(object sender, CristiPotlog.Controls.Wizard.AfterSwitchPagesEventArgs e) { //切换至逻辑回归计算页时,应首先读取地图图层信息,填写部分控件 if (e.OldIndex == 1 && e.NewIndex == 2) { //如果不是第一次打开窗体,则再次读取地图数据 application = ArcMap.Application; document = application.Document as IMxDocument; map = document.FocusMap; ArcGISOperator.FoucsMap = document.FocusMap; //如果图层选择框为空 if (comboBoxTrainingStartImage.Items.Count == 0) { for (int i = 0; i < map.LayerCount; i++) { string layerName = map.get_Layer(i).Name; comboBoxTrainingStartImage.Items.Add(layerName); comboBoxTrainingEndImage.Items.Add(layerName); comboBoxSimStartImage.Items.Add(layerName); comboBoxSimEndImage.Items.Add(layerName); } } } //切换到土地利用类型设置页时首先获取图层信息,然后填充土地利用类型 else if (e.OldIndex == 2 && e.NewIndex == 3) { listVariableLayersName.Clear(); trainingStartImageName = comboBoxTrainingStartImage.SelectedItem.ToString(); trainingEndImageName = comboBoxTrainingEndImage.SelectedItem.ToString(); for (int i = 0; i < dataGridViewVariableDatas.Rows.Count; i++) { listVariableLayersName.Add(dataGridViewVariableDatas.Rows[i].Cells[0].Value.ToString()); } //如果已经完成了回归,则不再进行 if (isRegressed) { return; } dataGridViewLandUse.Rows.Clear(); IRasterLayer rasterLayer = ArcGISOperator.GetRasterLayerByName(trainingStartImageName); IRasterUniqueValueRenderer rasterUniqueValueRenderer = (IRasterUniqueValueRenderer)rasterLayer.Renderer; IRasterRendererUniqueValues rasterRendererUniqueValues = (IRasterRendererUniqueValues)rasterUniqueValueRenderer; IUniqueValues uniqueValues = rasterRendererUniqueValues.UniqueValues; List <object> listUniqueValues = new List <object>(); for (int i = 0; i < uniqueValues.Count; i++) { listUniqueValues.Add(uniqueValues.get_UniqueValue(i)); } int classCount = rasterUniqueValueRenderer.get_ClassCount(0); for (int i = 0; i < classCount; i++) { dataGridViewLandUse.Rows.Add(); dataGridViewLandUse.Rows[i].Cells[0].Value = listUniqueValues[i]; dataGridViewLandUse.Rows[i].Cells[1].Value = rasterUniqueValueRenderer.get_Label(0, i); ISymbol symbol = rasterUniqueValueRenderer.get_Symbol(0, i); IFillSymbol fillSymbol = symbol as IFillSymbol; //ISimpleFillSymbol simpleFillSymbol = (ISimpleFillSymbol)symbol; //IColor esriColor = simpleFillSymbol.Color; IColor esriColor = fillSymbol.Color; IRgbColor rgbColor = new RgbColorClass(); rgbColor.CMYK = esriColor.CMYK; Color color = Color.FromArgb(rgbColor.Red, rgbColor.Green, rgbColor.Blue); dataGridViewLandUse.Rows[i].Cells[3].Value = GeneralOpertor.GetBitmap(15, 15, color); } ColumnLUCharacter.Items.Clear(); ColumnLUCharacter.Items.Add(resourceManager.GetString("String6")); ColumnLUCharacter.Items.Add(resourceManager.GetString("String7")); ColumnLUCharacter.Items.Add(resourceManager.GetString("String8")); } //切换到逻辑回归计算页面时进行计算 if (e.OldIndex == 3 && e.NewIndex == 4) { if (isRegressed) { return; } dataGridViewLogisticRegressionCoeff.Rows.Clear(); labelCalculte.Text = resourceManager.GetString("String9"); labelCalculte.Visible = true; progressBarCalculate.Visible = true; Application.DoEvents(); //1.读取起始图像、终止图像、各变量图像为数组 IRasterLayer rasterLayerStartImage = ArcGISOperator.GetRasterLayerByName(comboBoxTrainingStartImage.SelectedItem.ToString()); IRasterLayer rasterLayerEndImage = ArcGISOperator.GetRasterLayerByName(comboBoxTrainingEndImage.SelectedItem.ToString()); RasterSampling rasterSampling = new RasterSampling(); labelCalculte.Text = resourceManager.GetString("String12"); Application.DoEvents(); List <int> notNullRows; List <int> notNullColumns; trainingStartImage = ArcGISOperator.ReadRasterAndGetNotNullRowColumn(rasterLayerStartImage, out structRasterMetaData, out notNullRows, out notNullColumns); //获取最小空间范围 List <IRasterLayer> listVariablesLayers = new List <IRasterLayer>(); for (int i = 0; i < listVariableLayersName.Count; i++) { listVariablesLayers.Add(ArcGISOperator.GetRasterLayerByName(listVariableLayersName[i])); } ArcGISOperator.GetSmallestBound(rasterLayerStartImage, rasterLayerEndImage, listVariablesLayers, ref structRasterMetaData); labelCalculte.Text = resourceManager.GetString("String13"); Application.DoEvents(); trainingEndImage = ArcGISOperator.ReadRaster(rasterLayerEndImage, structRasterMetaData.NoDataValue); float[,] changeImage = GeneralOpertor.GetBinaryImageByTwoImages(trainingStartImage, trainingEndImage, structRasterMetaData.RowCount, structRasterMetaData.ColumnCount, structRasterMetaData.NoDataValue); //GeneralOpertor.WriteDataFloat(GetOutputFolder() + @"\lr_change.txt", changeImage, structRasterMetaData.RowCount, structRasterMetaData.ColumnCount); foreach (string layerName in listVariableLayersName) { labelCalculte.Text = resourceManager.GetString("String14") + layerName + "....."; Application.DoEvents(); varibaleImages.Add(ArcGISOperator.ReadRaster(ArcGISOperator.GetRasterLayerByName(layerName), structRasterMetaData.NoDataValue)); } //2.按设置的比例进行随机抽样,得到抽样结果,然后计算 //1.进行抽样 labelCalculte.Text = resourceManager.GetString("String11"); Application.DoEvents(); int samplingCellsCount = (int)(structRasterMetaData.RowCount * structRasterMetaData.ColumnCount * numericUpDownSamplingPrecent.Value / 100); float[,] datas = new float[samplingCellsCount, listVariableLayersName.Count + 1]; //抽取真值的比例默认设置为一半 datas = rasterSampling.SamplingData(varibaleImages, changeImage, (double)numericUpDownSamplingPrecent.Value, 50, structRasterMetaData, notNullRows, notNullColumns); //2.进行计算 labelCalculte.Text = resourceManager.GetString("String9"); Application.DoEvents(); //输出抽样结果数据 //GeneralOpertor.WriteDataFloat(GetOutputFolder() + @"\lrSamplingData.txt", datas, // rasterSampling.SamplingCellsCount, listVariableLayersName.Count + 1); //3.使用Accord.NET进行逻辑回归计算 labelCalculte.Text = resourceManager.GetString("String9"); Application.DoEvents(); LogisticRegression lr = new LogisticRegression(); double[] odds; double[] stde; double[] min; double[] max; lr.LogisticRegresssionAanlysis(datas, rasterSampling.SamplingCellsCount, listVariableLayersName.Count + 1, out coef, out odds, out stde, out min, out max); for (int i = 0; i < listVariableLayersName.Count + 1; i++) { dataGridViewLogisticRegressionCoeff.Rows.Add(); if (i == 0) { dataGridViewLogisticRegressionCoeff.Rows[i].Cells[0].Value = resourceManager.GetString("String15"); } else { dataGridViewLogisticRegressionCoeff.Rows[i].Cells[0].Value = listVariableLayersName[i - 1]; } dataGridViewLogisticRegressionCoeff.Rows[i].Cells[1].Value = coef[i]; dataGridViewLogisticRegressionCoeff.Rows[i].Cells[2].Value = odds[i]; dataGridViewLogisticRegressionCoeff.Rows[i].Cells[3].Value = stde[i]; dataGridViewLogisticRegressionCoeff.Rows[i].Cells[4].Value = max[i]; dataGridViewLogisticRegressionCoeff.Rows[i].Cells[5].Value = min[i]; } labelCalculte.Visible = false; progressBarCalculate.Visible = false; Application.DoEvents(); isRegressed = true; } //切换到模拟参数设置页时给定控件初始值,同时保存模拟数据信息 else if (e.OldIndex == 4 && e.NewIndex == 5) { if (comboBoxSimEndImage.SelectedIndex == -1) { buttonCalConvertCells.Enabled = false; } else { buttonCalConvertCells.Enabled = true; } } //切换到模拟过程参数设置页时给定控件初始值,同时保存模拟参数信息 else if (e.OldIndex == 5 && e.NewIndex == 6) { simulationStartImageName = comboBoxSimStartImage.SelectedItem.ToString(); if (comboBoxSimEndImage.SelectedIndex != -1) { simulationEndImageName = comboBoxSimEndImage.SelectedItem.ToString(); } convertCount = Convert.ToInt32(numericUpDownConvertCount.Value); simulationIterations = Convert.ToInt32(numericUpDownIterations.Value); delta = Convert.ToInt32(numericUpDownDelta.Value); numericUpDownRefresh.Value = 10; numericUpDownOutputImage.Value = 10; outputFolder = GetOutputFolder(); textBoxOutputFolder.Text = outputFolder; } //切换到完成页时填充摘要,同时保存模拟过程输出参数的信息 else if (e.OldIndex == 6 && e.NewIndex == 7) { refreshInterval = Convert.ToInt32(numericUpDownRefresh.Value); outputImageInterval = Convert.ToInt32(numericUpDownOutputImage.Value); if (radioButtonOutput.Checked) { isOutput = true; } else { isOutput = false; } outputFolder = textBoxOutputFolder.Text; textBoxSummay.Text = WriteSummay(); } }