public void drawLine() { IUniqueValues uniqueValues = new UniqueValuesClass(); IRasterCalcStatsHistogram calcstatsHistogram = new RasterCalcStatsHistogramClass(); IStatsHistogram statsHistogram = new StatsHistogramClass(); calcstatsHistogram.ComputeFromRaster(rasterLayer.Raster, 0, statsHistogram); IRasterCalcUniqueValues calcUniqueValues = new RasterCalcUniqueValuesClass(); try { calcUniqueValues.AddFromRaster(rasterLayer.Raster, 0, uniqueValues); double[] ArrVal = new double[uniqueValues.Count]; System.Int32[] ArrFreq = new System.Int32[uniqueValues.Count]; for (var i = 0; i < uniqueValues.Count; i++) { ArrVal[i] = Convert.ToDouble(uniqueValues.get_UniqueValue(i)); ArrFreq[i] = uniqueValues.get_UniqueCount(i); } valueChooseInChart1.drawLine(ArrVal, ArrFreq, Convert.ToInt32(spinEdit1.Text)); } catch { valueChooseInChart1.drawline(statsHistogram.Min, statsHistogram.Max, Convert.ToInt16(spinEdit1.Text)); } }
/// <summary> /// 获取浮点值字段的唯一值个数(无属性表) /// </summary> /// <param name="rasterLayer">图层</param> /// <returns></returns> private static int GetFloatValueUniqueCount(IRasterLayer rasterLayer) { IRasterCalcUniqueValues calcUniqueValues = new RasterCalcUniqueValuesClass(); IUniqueValues uniqueValues = new UniqueValuesClass(); //从栅格的第1个波段添加到唯一值 calcUniqueValues.AddFromRaster(rasterLayer.Raster, 0, uniqueValues); return(uniqueValues.Count); }
/// <summary> /// 获取浮点值和数目(无属性表) /// </summary> /// <param name="rasterLayer">图层</param> /// <returns></returns> public static IUniqueValues GetFloatValueAndCount(IRasterLayer rasterLayer) { IRasterCalcUniqueValues calcUniqueValues = new RasterCalcUniqueValuesClass(); IUniqueValues uniqueValues = new UniqueValuesClass(); //从栅格的第1个波段添加到唯一值 calcUniqueValues.AddFromRaster(rasterLayer.Raster, 0, uniqueValues); return(uniqueValues); }
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); }
private bool GetUniqueValues(string inFile) { IRasterLayer pRasterLayer = null; IUniqueValues pUniqueValues = null; IRasterCalcUniqueValues pCalcUniqueValues = null; try { pRasterLayer = new RasterLayerClass(); pRasterLayer.CreateFromFilePath(inFile); if (!(1 == pRasterLayer.BandCount)) { XtraMessageBox.Show("文件类型不正确,请选择分类结果文件!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return(false); } pUniqueValues = new UniqueValuesClass(); pCalcUniqueValues = new RasterCalcUniqueValuesClass(); pCalcUniqueValues.AddFromRaster(pRasterLayer.Raster, 0, pUniqueValues); if (_dt.Rows.Count > 0) { _dt.Rows.Clear(); } for (int i = 0; i < pUniqueValues.Count; i++) { DataRow row = _dt.NewRow(); row[0] = pUniqueValues.get_UniqueValue(i); _dt.Rows.Add(row); } return(true); } catch (Exception ex) { XtraMessageBox.Show("读取唯一值失败!\r\n" + ex.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); Log.WriteLog(typeof(frmRecode), ex); return(false); } finally { if (pCalcUniqueValues != null) { Marshal.ReleaseComObject(pCalcUniqueValues); } if (pUniqueValues != null) { Marshal.ReleaseComObject(pUniqueValues); } if (pRasterLayer != null) { Marshal.ReleaseComObject(pRasterLayer); } } }
/// <summary> /// 获取有属性表的值和数目 /// </summary> /// <param name="rasterLayer"></param> /// <param name="fieldName"></param> /// <returns></returns> public static IUniqueValues GetTableValueAndCount(IRasterLayer rasterLayer, string fieldName) { ITable pRTable = (ITable)rasterLayer; //获得表格游标 ICursor pCursor = pRTable.Search(null, false); int fieldIndex = pCursor.FindField(fieldName); int countIndex = pCursor.FindField("Count"); IRasterCalcUniqueValues calcUniqueValues = new RasterCalcUniqueValuesClass(); IUniqueValues uniqueValues = new UniqueValuesClass(); //添加表格数据到唯一值中 calcUniqueValues.AddFromTable(pCursor, fieldIndex, countIndex, uniqueValues); return(uniqueValues); }
/// <summary> /// Gets the class value from raster. /// </summary> /// <param name="inFile">The in file.</param> /// <returns>List<System.String>.</returns> /// <exception cref="System.Exception">文件类型不正确,请选择分类结果文件!</exception> public static List <string> GetClassFromRaster(string inFile) { IRasterLayer pRasterLayer = null; IUniqueValues pUniqueValues = null; IRasterCalcUniqueValues pCalcUniqueValues = null; List <string> classNames = null; try { pRasterLayer = new RasterLayerClass(); pRasterLayer.CreateFromFilePath(inFile); if (!(1 == pRasterLayer.BandCount)) { throw new Exception("文件类型不正确,请选择分类结果文件!"); } pUniqueValues = new UniqueValuesClass(); pCalcUniqueValues = new RasterCalcUniqueValuesClass(); pCalcUniqueValues.AddFromRaster(pRasterLayer.Raster, 0, pUniqueValues); classNames = new List <string>(); for (int i = 0; i < pUniqueValues.Count; i++) { classNames.Add(pUniqueValues.get_UniqueValue(i).ToString()); } return(classNames); } catch (Exception ex) { throw ex; } finally { if (pCalcUniqueValues != null) { Marshal.ReleaseComObject(pCalcUniqueValues); } if (pUniqueValues != null) { Marshal.ReleaseComObject(pUniqueValues); } if (pRasterLayer != null) { Marshal.ReleaseComObject(pRasterLayer); } } }
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; }
public double[] getOraDataStringArray() { List <double> arr = new List <double>(); arr.Clear(); if (this.RasterLayerClass != null && this.RasterLayerClass.AttributeTable != null) { ITable tb = this.RasterLayerClass.AttributeTable as ITable; if (tb != null) { object[] objArr = this.Unique(tb, "Value", ""); foreach (object obj in objArr) { arr.Add(double.Parse(obj.ToString())); } arr.Sort(); } } else if (this.RasterLayerClass.AttributeTable == null) { //渲染方式获取Value值的方法 //this.RasterLayerClass.Renderer = new RasterValueClass(); for (int ib = 0; ib < this.RasterLayerClass.BandCount; ib++) { IUniqueValues uv = new UniqueValuesClass(); IRasterCalcUniqueValues rcuv = new RasterCalcUniqueValuesClass(); rcuv.AddFromRaster(this.RasterLayerClass.Raster, ib, uv); for (int i = 0; i < uv.Count; i++) { arr.Add(double.Parse(uv.get_UniqueValue(i).ToString())); } } arr.Sort(); } return(arr.ToArray()); }
//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 double[] getDivEquestStringArray2(int breakNum) { List <double> DivItemList = new List <double>(); if (breakNum != 0) { for (int ib = 0; ib < this.RasterLayerClass.BandCount; ib++) { IUniqueValues uv = new UniqueValuesClass(); IRasterCalcUniqueValues rcuv = new RasterCalcUniqueValuesClass(); rcuv.AddFromRaster(this.RasterLayerClass.Raster, ib, uv); object valueArray = null, freq = null; ; IClassify classify = null; uv.GetHistogram(out valueArray, out freq); //-- EqualIntervalClass eq = new EqualIntervalClass(); eq.Classify(valueArray, freq, ref breakNum); classify = (IClassify)eq; //object o = classify.ClassBreaks; ////-- //Quantile qc = new QuantileClass(); //qc.Classify(valueArray, freq, ref breakNum); //classify = (IClassify)qc; //o = classify.ClassBreaks; ////-- //NaturalBreaksClass nb = new NaturalBreaksClass(); //nb.Classify(valueArray, freq, ref breakNum); //classify = nb as IClassify; //o = classify.ClassBreaks; ////-- ////DefinedIntervalClass di = new DefinedIntervalClass(); ////di.IntervalRange = this.m_classBreaksParam.Interval; ////di.Classify(valueArray, freq, ref breakNum); ////-- ////StandardDeviationClass sd = new StandardDeviationClass(); ////IStatisticsResults stat = histogram as IStatisticsResults; ////classify = sd as IClassify; ////classify.SetHistogramData(valueArray, freq); ////IDeviationInterval di = sd as IDeviationInterval; ////di.DeviationInterval = 1; ////di.Mean = stat.Mean; ////di.StandardDev = stat.StandardDeviation; ////classify.Classify(ref breakNum); ////-- object o = classify.ClassBreaks; System.Array breakArray = o as System.Array; for (int i = breakArray.Length - 1; i >= 0; i--) { DivItemList.Add(double.Parse(breakArray.GetValue(i).ToString())); } } } return(DivItemList.ToArray()); }
//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[]; 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("数据需要先计算统计值,请点击确定进行计算!"); //} }
/// <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); } }
private void btRender_Click(object sender, EventArgs e) { int number = 0; if (cbColorRamp.SelectedIndex == -1) { if (lang == Language.Chinese) { MessageBox.Show("请先选择一种色带"); } else if (lang == Language.English) { MessageBox.Show("Please choose a color ribbon first"); } return; } try { number = int.Parse(txtNumber.Text); if (number <= 1) { if (lang == Language.Chinese) { MessageBox.Show("类别数量只能为>1的正整数"); } else if (lang == Language.English) { MessageBox.Show("The class number can only be a positive integer of >1"); } } } catch { if (lang == Language.Chinese) { MessageBox.Show("类别数量只能为整数"); } else if (lang == Language.English) { MessageBox.Show("The class number can only be an integer"); } } IRasterClassifyColorRampRenderer pRasterClassifyRenderer = new RasterClassifyColorRampRendererClass(); IRasterRenderer pRasterRenderer = pRasterClassifyRenderer as IRasterRenderer; IUniqueValues uniVal = new UniqueValuesClass(); IRasterCalcUniqueValues2 calValues = new RasterCalcUniqueValuesClass(); calValues.MaxUniqueValueCount = 10000000; calValues.AddFromRaster(rasterLayer.Raster, cbSelectedBand.SelectedIndex, uniVal); object vValues, vFrequences; uniVal.GetHistogram(out vValues, out vFrequences); double[] doubleArray = (double[])vValues; int[] longArray = (int[])vFrequences; int order = SortTool.CheckInOrder(doubleArray, doubleArray.Length); if (order == 0) { SortTool.QuickSort3(doubleArray, 0, doubleArray.Length - 1, longArray); } else if (order == -1) { SortTool.Reverse(doubleArray, doubleArray.Length, longArray); } IClassifyGEN classify = GetMethod(cbMethod.Text); classify.Classify((double[])vValues, (int[])vFrequences, ref number); double[] classes = classify.ClassBreaks as double[]; pRasterRenderer.Raster = rasterLayer.Raster; pRasterClassifyRenderer.ClassCount = number; for (int i = 0; i < classes.Length; i++) { pRasterClassifyRenderer.set_Break(i, classes[i]); } pRasterRenderer.Update(); IStyleGalleryItem galleryItem = symbol.GetItem(cbColorRamp.SelectedIndex); IColorRamp colorRamp = galleryItem.Item as IColorRamp; IFillSymbol fill = new SimpleFillSymbolClass() as IFillSymbol; int increase = colorRamp.Size / (number - 1); for (int i = 0; i < pRasterClassifyRenderer.ClassCount - 1; i++) { fill.Color = colorRamp.get_Color(i * increase); pRasterClassifyRenderer.set_Symbol(i, fill as ISymbol); pRasterClassifyRenderer.set_Label(i, pRasterClassifyRenderer.get_Break(i).ToString() + "-" + pRasterClassifyRenderer.get_Break(i + 1).ToString()); } fill.Color = colorRamp.get_Color(colorRamp.Size - 1); pRasterClassifyRenderer.set_Symbol(pRasterClassifyRenderer.ClassCount - 1, fill as ISymbol); pRasterClassifyRenderer.set_Label(pRasterClassifyRenderer.ClassCount - 1, pRasterClassifyRenderer.get_Break(pRasterClassifyRenderer.ClassCount - 1).ToString() + "-" + pRasterClassifyRenderer.get_Break(pRasterClassifyRenderer.ClassCount).ToString()); rasterLayer.Renderer = pRasterRenderer; succeed = true; this.Close(); }