/// <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> /// 获取当前栅格图层中各种用地类型栅格的数量。区分栅格图层是否有属性表两种情况。 /// </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); }
//public void RasterClassify(IRasterLayer rastlayer, string classMethod, int count, IColorRamp ramp,double minValue) //{ // IRasterBand band = GetBand(rastlayer); // if (band.Histogram == null) // { // band.ComputeStatsAndHist(); // } // IRasterClassifyColorRampRenderer rasClassifyRender = new RasterClassifyColorRampRendererClass(); // IRasterRenderer rasRender = rasClassifyRender as IRasterRenderer; // rasRender.Raster = rastlayer.Raster; // rasRender.Update(); // int numClasses = count; // IRasterHistogram pRasterHistogram = band.Histogram; // double[] dblValues = pRasterHistogram.Counts as double[]; // int intValueCount = dblValues.GetUpperBound(0) + 1; // double[] vValues = new double[intValueCount]; // IRasterStatistics pRasterStatistic = band.Statistics; // //double dMaxValue = pRasterStatistic.Maximum; // double dMaxValue = minValue; // double dMinValue = pRasterStatistic.Minimum; // double BinInterval = Convert.ToDouble((dMaxValue - dMinValue) / intValueCount); // for (int i = 0; i < intValueCount; i++) // { // vValues[i] = i * BinInterval + pRasterStatistic.Minimum; // } // long[] longvalues = new long[dblValues.Length]; // for (int i = 0; i <= dblValues.Length - 1; i++) // { // longvalues[i] = long.Parse(Convert.ToString(dblValues[i])); // } // //IClassifyGEN classify = null; // IClassify classify = null; // switch (classMethod) // { // case "等间距分级": // EqualInterval eqclassify = new EqualIntervalClass(); // eqclassify.Classify(vValues, longvalues, ref numClasses); // classify = eqclassify as IClassify; // break; // case "自然断点分级": // NaturalBreaks naclassify = new NaturalBreaksClass(); // naclassify.Classify(vValues, longvalues, ref numClasses); // classify = naclassify as IClassify; // break; // } // //switch (classMethod) // //{ // // case "等间距分级": // // classify = new EqualIntervalClass(); // // break; // // case "自然断点分级": // // classify = new NaturalBreaksClass(); // // break; // //} // //classify.Classify(vValues, longvalues, ref numClasses); // double[] Classes = classify.ClassBreaks as double[]; // UID pUid = classify.ClassID; // IRasterClassifyUIProperties rasClassifyUI = rasClassifyRender as IRasterClassifyUIProperties; // rasClassifyUI.ClassificationMethod = pUid; // rasClassifyRender.ClassCount = count; // IColor pColor; // ISimpleFillSymbol pSym; // for (int j = 0; j < count; j++) // { // pColor = ramp.get_Color(j * (ramp.Size / count)); // pSym = new SimpleFillSymbolClass(); // pSym.Color = pColor; // rasClassifyRender.set_Symbol(j, (ISymbol)pSym); // rasRender.Update(); // if (Classes[j] == 0) // { // rasClassifyRender.set_Label(j, Classes[j].ToString() + "-" + Classes[j + 1].ToString("0.000")); // rasRender.Update(); // } // else // { // rasClassifyRender.set_Label(j, Classes[j].ToString("0.000") + "-" + Classes[j + 1].ToString("0.000")); // rasRender.Update(); // } // } // rastlayer.Renderer = rasClassifyRender as IRasterRenderer; public void RasterClassify(IRasterLayer rastlayer, string classMethod, int count, IColorRamp ramp) { try { //进行唯一值判断 IUniqueValues values = new UniqueValuesClass(); IRasterCalcUniqueValues unique = new RasterCalcUniqueValuesClass(); unique.AddFromRaster(rastlayer.Raster, 0, values); int uniquecount = values.get_UniqueCount(0); //计算统计图 IRasterBand band = GetBand(rastlayer); if (band.Histogram == null) { band.ComputeStatsAndHist(); } IRasterClassifyColorRampRenderer rasClassifyRender = new RasterClassifyColorRampRendererClass(); IRasterRenderer rasRender = rasClassifyRender as IRasterRenderer; rasRender.Raster = rastlayer.Raster; rasRender.Update(); int numClasses = count; IRasterHistogram pRasterHistogram = band.Histogram; double[] dblValues = pRasterHistogram.Counts as double[]; int intValueCount = dblValues.GetUpperBound(0) + 1; double[] vValues = new double[intValueCount]; IRasterStatistics pRasterStatistic = band.Statistics; double dMaxValue = pRasterStatistic.Maximum; double dMinValue = pRasterStatistic.Minimum; if (dMinValue == 0) { pRasterStatistic.IgnoredValues = pRasterStatistic.Minimum; pRasterStatistic.Recalculate(); dMinValue = pRasterStatistic.Minimum; } double BinInterval = Convert.ToDouble((dMaxValue - dMinValue) / intValueCount); for (int i = 0; i < intValueCount; i++) { vValues[i] = i * BinInterval + pRasterStatistic.Minimum; } long[] longvalues = new long[dblValues.Length]; for (int i = 0; i <= dblValues.Length - 1; i++) { longvalues[i] = long.Parse(Convert.ToString(dblValues[i])); } //IClassifyGEN classify = null; IClassify classify = null; switch (classMethod) { case "等间距分级": EqualInterval eqclassify = new EqualIntervalClass(); eqclassify.Classify(vValues, longvalues, ref numClasses); classify = eqclassify as IClassify; break; case "自然断点分级": NaturalBreaks naclassify = new NaturalBreaksClass(); naclassify.Classify(vValues, longvalues, ref numClasses); classify = naclassify as IClassify; break; } #region //switch (classMethod) //{ // case "等间距分级": // classify = new EqualIntervalClass(); // break; // case "自然断点分级": // classify = new NaturalBreaksClass(); // break; //} //classify.Classify(vValues, longvalues, ref numClasses); #endregion double[] Classes = classify.ClassBreaks as double[]; int n = Classes.Count(); double dn = Classes[0]; UID pUid = classify.ClassID; IRasterClassifyUIProperties rasClassifyUI = rasClassifyRender as IRasterClassifyUIProperties; rasClassifyUI.ClassificationMethod = pUid; rasClassifyRender.ClassCount = count; IColor pColor; ISimpleFillSymbol pSym; //排除数值 double[] exdouble = new double[2] { 0, Classes[0] }; IRasterDataExclusion ex = rasClassifyRender as IRasterDataExclusion; ex.ExcludeValues = exdouble; ex.ExcludeColor = GET(255, 255, 255); for (int j = 0; j < count; j++) { pColor = ramp.get_Color(j * (ramp.Size / count)); pSym = new SimpleFillSymbolClass(); pSym.Color = pColor; rasClassifyRender.set_Symbol(j, (ISymbol)pSym); rasRender.Update(); rasClassifyRender.set_Break(j, rasClassifyRender.get_Break(j)); rasClassifyRender.set_Label(j, Classes[j].ToString("0.000") + "-" + Classes[j + 1].ToString("0.000")); rasRender.Update(); } //IRasterProps rasterProps = (IRasterProps)rastlayer.Raster; //rasterProps.NoDataValue = 0; //IRasterDisplayProps props = rasClassifyRender as IRasterDisplayProps; //props.NoDataColor = GET(255, 255, 255); //rasRender.Update(); rastlayer.Renderer = rasClassifyRender as IRasterRenderer; } catch (Exception ex) { //MessageBox.Show(ex.ToString()); if (ex.ToString().Contains("唯一值过多")) { MessageBox.Show("唯一值数量已达到限制(65536)"); } else { MessageBox.Show("还未计算唯一值,进行唯一值计算!"); } } //catch //{ // MessageBox.Show("数据需要先计算统计值,请点击确定进行计算!"); //} }
public void RasterClassify(IRasterLayer rastlayer, string classMethod, int count, IColorRamp ramp) { IRasterBand band = GetBand(rastlayer); if (band.Histogram == null) { band.ComputeStatsAndHist(); } IRasterClassifyColorRampRenderer rasClassifyRender = new RasterClassifyColorRampRendererClass(); IRasterRenderer rasRender = rasClassifyRender as IRasterRenderer; rasRender.Raster = rastlayer.Raster; rasRender.Update(); int numClasses = count; IRasterHistogram pRasterHistogram = band.Histogram; double[] dblValues = pRasterHistogram.Counts as double[]; int intValueCount = dblValues.GetUpperBound(0) + 1; double[] vValues = new double[intValueCount]; IRasterStatistics pRasterStatistic = band.Statistics; double dMaxValue = pRasterStatistic.Maximum; double dMinValue = pRasterStatistic.Minimum; if (dMinValue == 0) { pRasterStatistic.IgnoredValues = pRasterStatistic.Minimum; pRasterStatistic.Recalculate(); dMinValue = pRasterStatistic.Minimum; } double BinInterval = Convert.ToDouble((dMaxValue - dMinValue) / intValueCount); for (int i = 0; i < intValueCount; i++) { vValues[i] = i * BinInterval + pRasterStatistic.Minimum; } long[] longvalues = new long[dblValues.Length]; for (int i = 0; i <= dblValues.Length - 1; i++) { longvalues[i] = long.Parse(Convert.ToString(dblValues[i])); } //IClassifyGEN classify = null; IClassify classify = null; switch (classMethod) { case "等间距分级": EqualInterval eqclassify = new EqualIntervalClass(); eqclassify.Classify(vValues, longvalues, ref numClasses); classify = eqclassify as IClassify; break; case "自然断点分级": NaturalBreaks naclassify = new NaturalBreaksClass(); naclassify.Classify(vValues, longvalues, ref numClasses); classify = naclassify as IClassify; break; } //switch (classMethod) //{ // case "等间距分级": // classify = new EqualIntervalClass(); // break; // case "自然断点分级": // classify = new NaturalBreaksClass(); // break; //} //classify.Classify(vValues, longvalues, ref numClasses); double[] Classes = classify.ClassBreaks as double[]; UID pUid = classify.ClassID; IRasterClassifyUIProperties rasClassifyUI = rasClassifyRender as IRasterClassifyUIProperties; rasClassifyUI.ClassificationMethod = pUid; rasClassifyRender.ClassCount = count; IColor pColor; ISimpleFillSymbol pSym; for (int j = 0; j < count; j++) { IRasterProps rasterProps = (IRasterProps)rastlayer.Raster; rasterProps.NoDataValue = 0; pColor = ramp.get_Color(j * (ramp.Size / count)); pSym = new SimpleFillSymbolClass(); pSym.Color = pColor; rasClassifyRender.set_Symbol(j, (ISymbol)pSym); rasRender.Update(); rasClassifyRender.set_Break(j, rasClassifyRender.get_Break(j)); rasClassifyRender.set_Label(j, Classes[j].ToString("0.000") + "-" + Classes[j + 1].ToString("0.000")); rasRender.Update(); } rastlayer.Renderer = rasClassifyRender as IRasterRenderer; }
public void RasterClassify(IRasterLayer rastlayer, string classMethod, int count, IColorRamp ramp) { try { //计算统计图 IRasterBand band = GetBand(rastlayer); if (band.Histogram == null) { band.ComputeStatsAndHist(); } IRasterClassifyColorRampRenderer rasClassifyRender = new RasterClassifyColorRampRendererClass(); IRasterRenderer rasRender = rasClassifyRender as IRasterRenderer; rasRender.Raster = rastlayer.Raster; rasRender.Update(); int numClasses = count; IRasterHistogram pRasterHistogram = band.Histogram; double[] dblValues = pRasterHistogram.Counts as double[]; int intValueCount = dblValues.GetUpperBound(0) + 1; double[] vValues = new double[intValueCount]; IRasterStatistics pRasterStatistic = band.Statistics; double dMaxValue = pRasterStatistic.Maximum; double dMinValue = pRasterStatistic.Minimum; double BinInterval = Convert.ToDouble((dMaxValue - dMinValue) / intValueCount); for (int i = 0; i < intValueCount; i++) { vValues[i] = i * BinInterval + pRasterStatistic.Minimum; } long[] longvalues = new long[dblValues.Length]; for (int i = 0; i <= dblValues.Length - 1; i++) { longvalues[i] = long.Parse(Convert.ToString(dblValues[i])); } //IClassifyGEN classify = null; IClassify classify = null; switch (classMethod) { case "等间距分级": classify = new EqualIntervalClass(); break; case "自然断点分级": classify = new NaturalBreaksClass(); break; } classify.Classify(ref numClasses); double[] Classes = classify.ClassBreaks as double[]; UID pUid = classify.ClassID; IRasterClassifyUIProperties rasClassifyUI = rasClassifyRender as IRasterClassifyUIProperties; rasClassifyUI.ClassificationMethod = pUid; rasClassifyRender.ClassCount = count; IColor pColor; ISimpleFillSymbol pSym; for (int j = 0; j < count; j++) { pColor = ramp.get_Color(j * (ramp.Size - 1) / (count - 1)); pSym = new SimpleFillSymbolClass(); pSym.Color = pColor; rasClassifyRender.set_Symbol(j, (ISymbol)pSym); rasRender.Update(); rasClassifyRender.set_Break(j, rasClassifyRender.get_Break(j)); //rasClassifyRender.set_Label(j, Classes[j].ToString("0.000") + "-" + Classes[j + 1].ToString("0.000")); rasRender.Update(); } //IRasterProps rasterProps = (IRasterProps)rastlayer.Raster; //rasterProps.NoDataValue = 0; //IRasterDisplayProps props = rasClassifyRender as IRasterDisplayProps; //props.NoDataColor = GET(255, 255, 255); //rasRender.Update(); rastlayer.Renderer = rasClassifyRender as IRasterRenderer; } catch { MessageBox.Show("唯一值数量已达到限制(65536)"); } }
//拉伸到灰度图像 private bool stretchToGrayImage(IRaster pSrcRaster, string szOutputFilename, double dbMinThreshold = 0.02, double dbMaxThreshold = 0.98) { try { if (pSrcRaster == null || szOutputFilename == null) { return(false); } //深拷贝 IClone pSrcClone = pSrcRaster as IClone; IClone pDstClone = pSrcClone.Clone(); IRaster pDstRaster = pDstClone as IRaster; IRaster2 pDstRaster2 = pDstRaster as IRaster2; IRasterProps pRasterProps = pDstRaster as IRasterProps; //原始统计信息 bool bFlag = false; IRasterBand pRasterBand = (pDstRaster as IRasterBandCollection).Item(0); pRasterBand.HasStatistics(out bFlag); if (!bFlag) { pRasterBand.ComputeStatsAndHist(); } //得到原始栅格影像的最大最小值和步长 double dbSrcMaxValue = pRasterBand.Statistics.Maximum; double dbSrcMinValue = pRasterBand.Statistics.Minimum; double dbSrcStep = (dbSrcMaxValue - dbSrcMinValue) / 256; double dbStretchMaxValue = pRasterBand.Statistics.Maximum; double dbStretchMinValue = pRasterBand.Statistics.Minimum; #region 灰度映射,利用重分类来做 //第一次重分类 IReclassOp reclassOp = new RasterReclassOpClass(); INumberRemap numberRemap = new NumberRemapClass(); for (int i = 0; i < 256; i++) { numberRemap.MapRange(dbSrcMinValue + i * dbSrcStep, dbStretchMinValue + (i + 1) * dbSrcStep, i); } IRaster pRasterTemp = reclassOp.ReclassByRemap((IGeoDataset)(pDstRaster2.RasterDataset), (IRemap)numberRemap, true) as IRaster; IRaster2 pRasterTemp2 = pRasterTemp as IRaster2; IRasterProps pRasterTempProps = pRasterTemp as IRasterProps; //得到属性表 IRasterDatasetEdit3 pRasterDatasetEdit3 = pRasterTemp2.RasterDataset as IRasterDatasetEdit3; pRasterDatasetEdit3.ComputeStatisticsHistogram(1, 1, null, true); IRasterBand rasterBand = (pRasterTempProps as IRasterBandCollection).Item(0); IRasterHistogram rasterHistogram = rasterBand.Histogram; IRasterStatistics rasterStatistics = rasterBand.Statistics; double[] pHistogramCount = (double[])rasterHistogram.Counts; int nCurrentCount = 0; int nIndex = 0; int nPixelCount = 0;//pRasterProps.Width * pRasterProps.Height; //double dSum = 0.0; for (int i = 0; i < 256; i++) { nPixelCount += (int)pHistogramCount[i]; } //得到拉伸的最大最小值 while (Convert.ToDouble(nCurrentCount) / nPixelCount < dbMinThreshold) { nCurrentCount += Convert.ToInt32(pHistogramCount[nIndex++]); } dbStretchMinValue = nIndex * dbSrcStep + dbSrcMinValue; while (Convert.ToDouble(nCurrentCount) / nPixelCount < dbMaxThreshold) { nCurrentCount += Convert.ToInt32(pHistogramCount[nIndex++]); } dbStretchMaxValue = nIndex * dbSrcStep + dbSrcMinValue; dbSrcStep = (dbStretchMaxValue - dbStretchMinValue) / 256; #endregion #region 拉伸 INumberRemap numberRemapForStretch = new NumberRemapClass(); numberRemapForStretch.MapRange(dbSrcMinValue, dbStretchMinValue + dbSrcStep, 0); for (int i = 1; i < 255; i++) { numberRemapForStretch.MapRange(dbStretchMinValue + i * dbSrcStep, dbStretchMinValue + (i + 1) * dbSrcStep, i); } numberRemapForStretch.MapRange(dbStretchMinValue + 255 * dbSrcStep, dbSrcMaxValue, 255); IRaster pRasterStretch = reclassOp.ReclassByRemap((IGeoDataset)((pDstRaster as IRaster2).RasterDataset), (IRemap)numberRemapForStretch, true) as IRaster; IRasterProps pRasterStretchProps = pRasterStretch as IRasterProps; #region 注释代码 ////拉伸 //IPixelBlock3 pixelBlock3 = null; //IRasterCursor rasterCursor = (pDstRaster as IRaster2).CreateCursorEx(null);//null时为128*128 //do //{ // pixelBlock3 = rasterCursor.PixelBlock as IPixelBlock3; // int nWidth = pixelBlock3.Width; // int nHeight = pixelBlock3.Height; // System.Array pixels = (System.Array)pixelBlock3.get_PixelData(0); // for (int m = 0; m < nWidth; m++) // { // for (int n = 0; n < nHeight; n++) // { // double dbSrcValue = Convert.ToDouble(pixels.GetValue(m, n)); // if (double.IsNaN(dbSrcValue) || dbSrcValue == dbNoDataValue) // continue; // if (dbSrcValue >= dbStretchMaxValue) // pixels.SetValue(255, m, n); // else if (dbSrcValue <= dbStretchMinValue) // pixels.SetValue(0, m, n); // else // { // byte dbDstValue = Convert.ToByte((dbSrcValue - dbStretchMinValue) / (dbStretchMaxValue - dbStretchMinValue) * 255); // pixels.SetValue(dbDstValue, m, n); // } // } // } // pixelBlock3.set_PixelData(0, (System.Array)pixels); // //修改数据 // pRasterEdit.Write(rasterCursor.TopLeft, pixelBlock3 as IPixelBlock); // pRasterEdit.Refresh(); //} while (rasterCursor.Next() == true); #endregion #endregion #region 存储数据 IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactoryClass(); IWorkspace inmemWor = pWorkspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(szOutputFilename), 0); pRasterStretchProps.PixelType = rstPixelType.PT_UCHAR; ISaveAs2 pSaveAs = pRasterStretchProps as ISaveAs2; if (pSaveAs == null) { return(false); } IRasterStorageDef pRSDef = new RasterStorageDefClass(); IRasterDataset pDataset = pSaveAs.SaveAsRasterDataset(System.IO.Path.GetFileName(szOutputFilename), inmemWor, "TIFF", pRSDef); (pDataset as IRasterDataset3).Refresh(); //IRasterEdit pRasterEdit = pDstRaster as IRasterEdit; IRasterEdit pRasterTempEdit = pRasterTemp as IRasterEdit; System.Runtime.InteropServices.Marshal.ReleaseComObject(pRasterTempEdit); IRasterEdit pRasterStretchEdit = pRasterStretch as IRasterEdit; System.Runtime.InteropServices.Marshal.ReleaseComObject(pRasterStretchEdit); #endregion return(true); } catch (System.Exception ex) { MessageBox.Show(ex.Message); return(false); } }