private void EvalRobustness(double[] cb) { int intLIndex = m_pSnippet.GetIndexNumberFromLayerName(m_pActiveView, cboSourceLayer.Text); ILayer pLayer = mForm.axMapControl1.get_Layer(intLIndex); m_pFLayer = pLayer as IFeatureLayer; IFeatureClass pFClass = m_pFLayer.FeatureClass; string strValueFld = m_pRenderedLayer.strValueFldName; string strUncernfld = string.Empty; if (m_pRenderedLayer.strUncernFldName == string.Empty) { strUncernfld = cboUncernFld.Text; } else { strUncernfld = m_pRenderedLayer.strUncernFldName; } if (strUncernfld == string.Empty) { return; } int intValueIdx = pFClass.FindField(strValueFld); int intUncernIdx = pFClass.FindField(strUncernfld); int intClassCount = cb.Length - 1; string strSavefldnm = txtFldName.Text; //strTempfldName = "MinSepfave"; if (pFClass.FindField(strSavefldnm) == -1) { m_pSnippet.AddField(pFClass, strSavefldnm, esriFieldType.esriFieldTypeDouble); } int intSavefldIdx = pFClass.FindField(strSavefldnm); int intFCounts = pFClass.FeatureCount(null); Chart pChart = new Chart(); IFeature pFeat = null; IFeatureCursor pFCursor = null; pFCursor = pFClass.Update(null, false); pFeat = pFCursor.NextFeature(); Robustness[] pRobustness = new Robustness[intFCounts]; double[] arrValue = new double[intFCounts]; int i = 0; while (pFeat != null) { pRobustness[i] = new Robustness(); pRobustness[i].Robustnesses = new double[intClassCount]; double dblValue = Convert.ToDouble(pFeat.get_Value(intValueIdx)); double dblStd = Convert.ToDouble(pFeat.get_Value(intUncernIdx)); double dblEntropy = 0; for (int j = 0; j < intClassCount; j++) { double dblUpperZvalue = (cb[j + 1] - dblValue) / dblStd; double dblUpperConfLev = pChart.DataManipulator.Statistics.NormalDistribution(dblUpperZvalue); double dblLowerZvalue = (cb[j] - dblValue) / dblStd; double dblLowerConfLev = pChart.DataManipulator.Statistics.NormalDistribution(dblLowerZvalue); double dblProb = dblUpperConfLev - dblLowerConfLev; pRobustness[i].Robustnesses[j] = dblProb; //Probability of an observation to each class if (dblProb != 0) { dblEntropy += dblProb * Math.Log(dblProb, 2); } if (j == 0) { if (dblValue >= cb[j] && dblValue <= cb[j + 1]) { pRobustness[i].TargetClass = j; } } else { if (dblValue > cb[j] && dblValue <= cb[j + 1]) { pRobustness[i].TargetClass = j; } } } pRobustness[i].Entropy = ((double)(-1) * dblEntropy) / (Math.Log(intClassCount, 2)); if (cboMeasure.Text == "Entropy") { arrValue[i] = pRobustness[i].Entropy; pFeat.set_Value(intSavefldIdx, pRobustness[i].Entropy); } else { pFeat.set_Value(intSavefldIdx, pRobustness[i].Robustnesses[pRobustness[i].TargetClass]); arrValue[i] = pRobustness[i].Robustnesses[pRobustness[i].TargetClass]; } pFCursor.UpdateFeature(pFeat); pFeat = pFCursor.NextFeature(); i++; } //Visualization //dblClsMean = new double[intClassCount, 3]; //double dblSumRobustness = 0; //for (int j = 0; j < intFCounts; j++) //{ // dblSumRobustness = dblSumRobustness + arrRobustness[j, 0]; // for (int k = 0; k < intClassCount; k++) // { // if (arrRobustness[j, 1] == k) // { // dblClsMean[k, 0] = arrRobustness[j, 0] + dblClsMean[k, 0]; // dblClsMean[k, 1] = dblClsMean[k, 1] + 1; // } // } //} //for (int k = 0; k < intClassCount; k++) //{ // dblClsMean[k, 2] = dblClsMean[k, 0] / dblClsMean[k, 1]; //} //dblMeanRobustness = dblSumRobustness / intFCounts; //switch (cboGCClassify.Text) //{ // case "Equal Interval": // pClassifyGEN = new EqualIntervalClass(); // break; // case "Geometrical Interval": // pClassifyGEN = new GeometricalInterval(); // break; // case "Natural Breaks": // pClassifyGEN = new NaturalBreaksClass(); // break; // case "Quantile": // pClassifyGEN = new QuantileClass(); // break; // case "StandardDeviation": // pClassifyGEN = new StandardDeviationClass(); // break; // default: // pClassifyGEN = new NaturalBreaksClass(); // break; //} if (chkAddMap.Checked) { IClassifyGEN pClassifyGEN = new NaturalBreaksClass(); IFeatureLayer pflUncern = new FeatureLayerClass(); pflUncern.FeatureClass = pFClass; pflUncern.Name = cboSourceLayer.Text + " " + cboMeasure.Text; pflUncern.Visible = true; IGeoFeatureLayer pGeofeatureLayer = (IGeoFeatureLayer)pflUncern; ITableHistogram pTableHistogram2 = new BasicTableHistogramClass(); ITable pTable = (ITable)pFClass; pTableHistogram2.Field = strSavefldnm; pTableHistogram2.Table = pTable; //IHistogram pHistogram = (IHistogram)pTableHistogram2; IBasicHistogram pHistogram = (IBasicHistogram)pTableHistogram2; object xVals, frqs; pHistogram.GetHistogram(out xVals, out frqs); pClassifyGEN.Classify(xVals, frqs, 4); //Fixed Class count double[] cb_uncern = (double[])pClassifyGEN.ClassBreaks; if (cboMeasure.Text == "Entropy") { cb_uncern[1] = 0.4; cb_uncern[2] = 0.6; cb_uncern[3] = 0.75; } else { cb_uncern[1] = 0.4; cb_uncern[2] = 0.6; cb_uncern[3] = 0.75; } ISpacingBreaksRenderer pSpacingBrksRenderers = new SpacingBreaksRendererClass(); pSpacingBrksRenderers.arrClassBrks = cb_uncern; pSpacingBrksRenderers.arrValue = arrValue; if (cboMeasure.Text == "Entropy") { pSpacingBrksRenderers.dblFromSep = Convert.ToDouble(1); pSpacingBrksRenderers.dblToSep = Convert.ToDouble(20); } else { pSpacingBrksRenderers.dblFromSep = Convert.ToDouble(20); pSpacingBrksRenderers.dblToSep = Convert.ToDouble(1); } pSpacingBrksRenderers.dblLineAngle = Convert.ToDouble(45); pSpacingBrksRenderers.dblLineWidth = Convert.ToDouble(0.1); pSpacingBrksRenderers.m_pLineRgb = m_pSnippet.getRGB(0, 0, 0); if (pSpacingBrksRenderers.m_pLineRgb == null) { return; } pSpacingBrksRenderers.strHeading = cboMeasure.Text; pSpacingBrksRenderers.intRoundingDigits = 2; pSpacingBrksRenderers.CreateLegend(); pGeofeatureLayer.Renderer = (IFeatureRenderer)pSpacingBrksRenderers; m_pActiveView.FocusMap.AddLayer(pGeofeatureLayer); m_pActiveView.Refresh(); mForm.axTOCControl1.Update(); } }