public double TarinNetwork(float[][] inputs, float[][] outputs, int samplingCellsCount, int inputNeuronsCount, int outputNeuronsCount, int hiddenLayerNeuronsCount, double learningRate, int iterations, System.Windows.Forms.Label labelTrainTest, System.Windows.Forms.Label labelTrainningAccuracy, System.Windows.Forms.Label labelValidationAccuracy, ZedGraphControl zedGraphControl) { network = new ActivationNetwork( new SigmoidFunction(), inputNeuronsCount, hiddenLayerNeuronsCount, outputNeuronsCount); ParallelResilientBackpropagationLearning teacher = new ParallelResilientBackpropagationLearning(network); teacher.LearningRate = learningRate; double[][] trainInput = GeneralOpertor.GetArray(inputs, 0.8, true, inputNeuronsCount); double[][] testInput = GeneralOpertor.GetArray(inputs, 0.8, false, inputNeuronsCount); double[][] trainOutput = GeneralOpertor.GetArray(outputs, 0.8, true, outputNeuronsCount); double[][] testOutput = GeneralOpertor.GetArray(outputs, 0.8, false, outputNeuronsCount); int iteration = 0; double error = 1; zedGraphControl.GraphPane.CurveList.Clear(); PointPairList list = new PointPairList(); while ((error > 0.01) && (iteration <= iterations)) { error = teacher.RunEpoch(trainInput, trainOutput) * 2 / samplingCellsCount; if (iteration == 0) { list.Add(iteration, error); zedGraphControl.GraphPane.AddCurve("Error", list, System.Drawing.Color.FromArgb(255, 0, 0)); zedGraphControl.GraphPane.AxisChange(); } else if ((iteration % 30 == 0) || (iteration == iterations)) { zedGraphControl.GraphPane.CurveList[0].AddPoint(iteration, error); zedGraphControl.GraphPane.AxisChange(); labelTrainTest.Text = "Iteration:" + iteration + ", Error:" + error.ToString("0.00000"); Application.DoEvents(); } zedGraphControl.Refresh(); iteration++; } double accuracy = GetAccuracy(trainInput, trainOutput, network); labelTrainningAccuracy.Text = (accuracy * 100).ToString("0.000") + " %"; accuracy = GetAccuracy(testInput, testOutput, network); labelValidationAccuracy.Text = (accuracy * 100).ToString("0.000") + " %"; return(error); }
private void buttonLoadLanduseConfig_Click(object sender, EventArgs e) { dataGridViewLandUse.Rows.Clear(); using (OpenFileDialog ofd = new OpenFileDialog()) { ofd.Filter = resourceManager.GetString("String52"); ofd.Title = resourceManager.GetString("String53"); if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { System.IO.StreamReader streamReader = new System.IO.StreamReader(ofd.FileName); System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(LandUseClassificationInfo)); landUseClassificationInfo = (LandUseClassificationInfo)xmlSerializer.Deserialize(streamReader); streamReader.Close(); for (int i = 0; i < landUseClassificationInfo.AllTypesCount; i++) { StructLanduseInfo strucLanduseInfo = landUseClassificationInfo.AllTypes[i]; dataGridViewLandUse.Rows.Add(); if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHS") { dataGridViewLandUse.Rows[i].Cells[1].Value = strucLanduseInfo.LanduseTypeChsName; } else if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHT") { dataGridViewLandUse.Rows[i].Cells[1].Value = strucLanduseInfo.LanduseTypeChtName; } else { dataGridViewLandUse.Rows[i].Cells[1].Value = strucLanduseInfo.LanduseTypeEnName; } dataGridViewLandUse.Rows[i].Cells[0].Value = strucLanduseInfo.LanduseTypeValue; dataGridViewLandUse.Rows[i].Cells[3].Value = GeneralOpertor.GetBitmap(15, 15, Color.FromArgb(strucLanduseInfo.LanduseTypeColorIntValue)); if (landUseClassificationInfo.UrbanValues.Contains(strucLanduseInfo)) { dataGridViewLandUse.Rows[i].Cells[2].Value = resourceManager.GetString("String8"); } else if (landUseClassificationInfo.ConvertValues.Contains(strucLanduseInfo)) { dataGridViewLandUse.Rows[i].Cells[2].Value = resourceManager.GetString("String6"); } else { dataGridViewLandUse.Rows[i].Cells[2].Value = resourceManager.GetString("String7"); } } } } }
public void DoSimulation() { try { //0准备开始模拟 ResourceManager resourceManager = VariableMaintainer.CurrentResourceManager; FormANNCAWizard formANNCAWizard = VariableMaintainer.CurrentFormANNCAWizard; Random random = new Random(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); //0.1获得数据 int rowCount = formANNCAWizard.CurrentStructRasterMetaData.RowCount; int columnCount = formANNCAWizard.CurrentStructRasterMetaData.ColumnCount; float[,] simulationStartImage = formANNCAWizard.SimulationStartImage; float[,] simulationEndImage = formANNCAWizard.SimulationEndImage; float[,] simulationImage = formANNCAWizard.SimulationImage; //0.2计算初始每种土地利用类型的单元数量 List <StructLanduseInfoAndCount> listLanduseInfoAndCount; //记录每种土地利用类型的单元数 listLanduseInfoAndCount = new List <StructLanduseInfoAndCount>(); StructLanduseInfoAndCount landuseInfoAndCount; foreach (StructLanduseInfo structLanduseInfo in formANNCAWizard.LandUseClassificationInfo.AllTypes) { landuseInfoAndCount = new StructLanduseInfoAndCount(); landuseInfoAndCount.structLanduseInfo = structLanduseInfo; landuseInfoAndCount.LanduseTypeCount = 0; listLanduseInfoAndCount.Add(landuseInfoAndCount); } for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { CommonLibrary.GeneralOpertor.ChangeLandUseCount(simulationStartImage[i, j], -10000, listLanduseInfoAndCount); } } //0.3显示输出结果窗体和图表窗体 dockableWindowGraphy.GraphTitle = resourceManager.GetString("String40"); dockableWindowGraphy.XAxisTitle = resourceManager.GetString("String41"); dockableWindowGraphy.YAxisTitle = resourceManager.GetString("String42"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String43")); Application.DoEvents(); //0.4绘制初始的图表 List <string> listPointPairListName = new List <string>(); List <string> notToDrawList = new List <string>(); notToDrawList.Add(resourceManager.GetString("String44")); dockableWindowGraphy.CreateGraph(listLanduseInfoAndCount, notToDrawList, out listPointPairListName); dockableWindowGraphy.RefreshGraph(); int convertedCellCount = 0; //模拟中总共转换的元胞数量 int randomRow, randomColumn; //Monte Carlo方法选取的随机行和随机列 int convertCountInOneIteration = formANNCAWizard.ConvertCount / formANNCAWizard.Iterations; //每次迭代应转换的数量 int convertCountOnce = 0; //每次迭代已经转换的数量 float oldValue, newValue; //每次转换前土地利用类型的新值和旧值 int iteration = 0; //迭代的次数 List <float> listLanduseValues = new List <float>(); //记录土地利用类型值的List for (int j = 0; j < formANNCAWizard.LandUseClassificationInfo.AllTypesCount; j++) { listLanduseValues.Add(formANNCAWizard.LandUseClassificationInfo.AllTypes[j].LanduseTypeValue); } int neiWindowSize = formANNCAWizard.NeighbourWindowSize; int inputNeuronsCount = formANNCAWizard.InputNeuronsCount; int outputNeuronsCount = formANNCAWizard.OutputNeuronsCount; //2.开始进行转换 while (convertedCellCount < formANNCAWizard.ConvertCount) { convertCountOnce = 0; //2.3选择元胞与随机比较进行转换 //完成一次迭代 while (convertCountOnce < convertCountInOneIteration) { //随机选择一个栅格进行计算 randomRow = random.Next(0, rowCount); randomColumn = random.Next(0, columnCount); //计算逻辑为: //这里需要首先获取当前元胞的输入值 //然后通过神经网络计算每种土地利用类型的概率,乘以随机量 //然后选出最高的概率 //再查看是否是同样的土地利用类型,如果不是则转变 //如果不是并且概率大于一个值,则进行转变(目前先不用) //如果是空值,则不进行计算 if (simulationImage[randomRow, randomColumn] == -9999f) { continue; } double[] tempInputsArray = new double[inputNeuronsCount]; double[] tempOutputsArray = new double[outputNeuronsCount]; //获取该栅格的空间变量值 for (int i = 0; i < formANNCAWizard.ListVaribaleImages.Count; i++) { tempInputsArray[i] = formANNCAWizard.ListVaribaleImages[i][randomRow, randomColumn]; } //获取该栅格的邻域值 NeighbourOperator neighbourOperator = new NeighbourOperator(); float[] counts = neighbourOperator.GetNeighbourCount(simulationImage, randomRow, randomColumn, neiWindowSize, rowCount, columnCount, formANNCAWizard.LandUseClassificationInfo.AllTypesCount, listLanduseValues); for (int z = 0; z < counts.Length; z++) { tempInputsArray[formANNCAWizard.ListVaribaleImages.Count + z] = counts[z] / (neiWindowSize * neiWindowSize - 1); } //获取该栅格的土地利用类型 tempInputsArray[inputNeuronsCount - 1] = simulationImage[randomRow, randomColumn]; //计算神经网络输出的概率值 double[] output = formANNCAWizard.ANN.ANNActivationNetwork.Compute(tempInputsArray); double maxOutput = 0; int maxIndex = -1; Random r = new Random(1); double gamma; double disturbance; double probability; double[] probabilityArray = new double[output.Length]; for (int k = 0; k < output.Length; k++) { gamma = random.NextDouble(); disturbance = 1 + Math.Pow((-Math.Log(gamma)), formANNCAWizard.Delta); probabilityArray[k] = disturbance * output[k]; if (maxOutput < probabilityArray[k]) { maxOutput = probabilityArray[k]; maxIndex = k; } } probability = maxOutput; //计算最高值的最终概率 //未使用邻域因素模拟较为散,所以加入邻域因素。但可能导致难以达到需要的转换数量,模拟时间过长。 double neiValue = 0f; for (int t = 0; t < listLanduseValues.Count; t++) { if (listLanduseValues[t] == formANNCAWizard.LandUseClassificationInfo.UrbanValues[0].LanduseTypeValue) { neiValue = Convert.ToDouble(counts[t]) / (neiWindowSize * neiWindowSize - 1); break; } } probability = probability * neiValue; //得到应转变为的土地利用类型值,以及当前土地利用类型值 newValue = formANNCAWizard.LandUseClassificationInfo.AllTypes[maxIndex].LanduseTypeValue; oldValue = simulationImage[randomRow, randomColumn]; //oldValue有时取到0值等不正确的值 bool isOldValueCorrect = false; for (int w = 0; w < formANNCAWizard.LandUseClassificationInfo.AllTypes.Count; w++) { if (oldValue == formANNCAWizard.LandUseClassificationInfo.AllTypes[w].LanduseTypeValue) { isOldValueCorrect = true; } } if (!isOldValueCorrect) { continue; } //根据转换矩阵进行判断是否可以转换 DataTable dtMatrix = formANNCAWizard.DTMatrix; int oldValueIndex = -1; for (int k = 0; k < formANNCAWizard.LandUseClassificationInfo.AllTypesCount; k++) { if (formANNCAWizard.LandUseClassificationInfo.AllTypes[k].LanduseTypeValue == oldValue) { oldValueIndex = k; break; } } string canConvert = dtMatrix.Rows[oldValueIndex][maxIndex].ToString(); if (canConvert == "0") { continue; } //与设定的阈值进行比较 double convertThreshold = formANNCAWizard.ConvertThreshold; if ((oldValue != newValue) && (probability >= convertThreshold)) { simulationImage[randomRow, randomColumn] = newValue; CommonLibrary.GeneralOpertor.ChangeLandUseCount(newValue, oldValue, listLanduseInfoAndCount); //以城市用地的转变量为总转变量的标准 for (int w = 0; w < formANNCAWizard.LandUseClassificationInfo.UrbanValues.Count; w++) { if (newValue == formANNCAWizard.LandUseClassificationInfo.UrbanValues[w].LanduseTypeValue) { convertCountOnce++; convertedCellCount++; } } //System.Diagnostics.Debug.WriteLine(convertedCellCount + " - Old: " + oldValue + " New: " + newValue); } } iteration++; System.Diagnostics.Debug.WriteLine("iteration: " + iteration); //2.4.刷新外部界面并输出中间结果数据 if (convertedCellCount == 1 || (iteration % formANNCAWizard.RefreshInterval == 0 && convertedCellCount != 0)) { //刷新图像 formANNCAWizard.SimulationImage = simulationImage; VariableMaintainer.IsNeedRefresh = true; //刷新图表窗体 string landuseTypeName = ""; for (int k = 0; k < listLanduseInfoAndCount.Count; k++) { for (int l = 0; l < listPointPairListName.Count; l++) { if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHS") { landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeChsName; } else if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHT") { landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeChtName; } else { landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeEnName; } if (landuseTypeName == listPointPairListName[l]) { dockableWindowGraphy.UpdateData(iteration, listLanduseInfoAndCount[k].LanduseTypeCount, l); } } } dockableWindowGraphy.RefreshGraph(); //刷新输出结果窗体 dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String45") + iteration.ToString() + resourceManager.GetString("String46")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String47") + convertedCellCount.ToString()); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.ScrollTextbox(); Application.DoEvents(); } //输出中间结果 if (formANNCAWizard.IsOutput && (iteration % formANNCAWizard.OutputImageInterval == 0)) { GeneralOpertor.WriteDataFloat(formANNCAWizard.OutputFolder + @"\" + GeneralOpertor.GetNowString() + "_ann_iterate_" + iteration.ToString() + @".txt", simulationImage, rowCount, columnCount); } } //3.完成模拟,输出结果。 stopWatch.Stop(); VariableMaintainer.IsSimulationFinished = true; dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String48")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String49") + GeneralOpertor.GetElapsedTimeString(stopWatch.Elapsed)); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText("\n"); //修改结果栅格的属性表 IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass(); IRasterWorkspace rasterWorkspace = workspaceFactory.OpenFromFile( VariableMaintainer.CurrentFormANNCAWizard.OutputFolder, 0) as IRasterWorkspace; IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset(VariableMaintainer.CurrentFoucsMap.get_Layer(0).Name); IRasterDatasetEdit3 rasterDatasetEdit3 = rasterDataset as IRasterDatasetEdit3; rasterDatasetEdit3.BuildAttributeTable(); IRasterDataset3 rasterDataset3 = rasterDataset as IRasterDataset3; rasterDataset3.Refresh(); if (formANNCAWizard.SimulationEndImageName != "") { //GeneralOpertor.WriteDataFloat(formLogisticCAWizard.OutputFolder + @"\CA_ANN_Reslut" + GeneralOpertor.GetNowString() + ".txt", // simulationImage, rowCount,columnCount); DataTable dtMatrixNumber = GeneralOpertor.GetMultiTypesMatrix( simulationImage, simulationEndImage, rowCount, columnCount, formANNCAWizard.LandUseClassificationInfo); double overallAccuracy = 0d; double kappa = 0d; GeneralOpertor.GetMultiTypesAccuracy(dtMatrixNumber, ref overallAccuracy, ref kappa, formANNCAWizard.LandUseClassificationInfo); FormConfusionMatrix formConfusionMatrix = new FormConfusionMatrix(); formConfusionMatrix.DataTableValues = dtMatrixNumber; DataTable dtMatrixPercent = dtMatrixNumber.Clone(); GeneralOpertor.CopyDataTableValues(dtMatrixNumber, dtMatrixPercent); formConfusionMatrix.DataTablePercents = dtMatrixPercent; formConfusionMatrix.DataGridViewConfusionMatrix.DataSource = dtMatrixNumber; formConfusionMatrix.LabelOverallAccuracy.Text = (overallAccuracy * 100).ToString("0.00") + " %"; formConfusionMatrix.LabelKappa.Text = kappa.ToString("0.000"); float[] fomValues = GeneralOpertor.GetMultiFoMAccuracy(simulationStartImage, simulationEndImage, simulationImage, rowCount, columnCount); formConfusionMatrix.LabelFoMValues.Text = "A: " + fomValues[0] + "\nB: " + fomValues[1] + "\nC: " + fomValues[2] + "\nD: " + fomValues[3]; formConfusionMatrix.LabelFoM.Text = fomValues[4].ToString("0.000"); formConfusionMatrix.LabelPA.Text = fomValues[5].ToString("0.000"); formConfusionMatrix.LabelUA.Text = fomValues[6].ToString("0.000"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String84")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(GeneralOpertor.WriteCoufusionMatrix(dtMatrixPercent)); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String83")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String85") + (overallAccuracy * 100).ToString("0.00") + " %"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String86") + kappa.ToString("0.000")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String87") + fomValues[4].ToString("0.000")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String88") + fomValues[5].ToString("0.000")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String89") + fomValues[6].ToString("0.000")); dockableWindowOutput.AppendText("\n"); formConfusionMatrix.Text = resourceManager.GetString("String105") + " - " + formANNCAWizard.SimulationLayerName; formConfusionMatrix.ShowDialog(); } dockableWindowOutput.AppendText("-------------------------------------------"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.ScrollTextbox(); Application.DoEvents(); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
public void DoSimulation() { //0准备开始模拟 ResourceManager resourceManager = VariableMaintainer.CurrentResourceManager; FormLogisticCAWizard formLogisticCAWizard = VariableMaintainer.CurrentFormLogisticCAWizard; Random random = new Random(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); //0.1获得数据 int rowCount = formLogisticCAWizard.CurrentStructRasterMetaData.RowCount; int columnCount = formLogisticCAWizard.CurrentStructRasterMetaData.ColumnCount; float[,] simulationStartImage = formLogisticCAWizard.SimulationStartImage; float[,] simulationEndImage = formLogisticCAWizard.SimulationEndImage; float[,] simulationImage = formLogisticCAWizard.SimulationImage; //0.2计算初始每种土地利用类型的单元数量 List <StructLanduseInfoAndCount> listLanduseInfoAndCount; //记录每种土地利用类型的单元数 listLanduseInfoAndCount = new List <StructLanduseInfoAndCount>(); StructLanduseInfoAndCount landuseInfoAndCount; foreach (StructLanduseInfo structLanduseInfo in formLogisticCAWizard.LandUseClassificationInfo.AllTypes) { landuseInfoAndCount = new StructLanduseInfoAndCount(); landuseInfoAndCount.structLanduseInfo = structLanduseInfo; landuseInfoAndCount.LanduseTypeCount = 0; listLanduseInfoAndCount.Add(landuseInfoAndCount); } for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { CommonLibrary.GeneralOpertor.ChangeLandUseCount(simulationStartImage[i, j], -10000, listLanduseInfoAndCount); } } //0.3显示输出结果窗体和图表窗体 dockableWindowGraphy.GraphTitle = resourceManager.GetString("String40"); dockableWindowGraphy.XAxisTitle = resourceManager.GetString("String41"); dockableWindowGraphy.YAxisTitle = resourceManager.GetString("String42"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String43")); Application.DoEvents(); //0.4绘制初始的图表 List <string> listPointPairListName = new List <string>(); List <string> notToDrawList = new List <string>(); notToDrawList.Add(resourceManager.GetString("String44")); dockableWindowGraphy.CreateGraph(listLanduseInfoAndCount, notToDrawList, out listPointPairListName); dockableWindowGraphy.RefreshGraph(); //1.计算Pg float[,] pg = new float[rowCount, columnCount]; for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { if (simulationStartImage[i, j] == formLogisticCAWizard.LandUseClassificationInfo.NullValue.LanduseTypeValue) { pg[i, j] = formLogisticCAWizard.LandUseClassificationInfo.NullValue.LanduseTypeValue; } else { pg[i, j] += Convert.ToSingle(formLogisticCAWizard.Coefficents[0]); for (int k = 0; k < formLogisticCAWizard.ListVariableLayersName.Count; k++) { pg[i, j] += Convert.ToSingle(formLogisticCAWizard.Coefficents[k + 1]) * formLogisticCAWizard.VaribaleImages[k][i, j]; } } pg[i, j] = 1 / (1 + Convert.ToSingle(Math.Exp(-1 * pg[i, j]))); } } //GeneralOpertor.WriteDataFloat(formLogisticCAWizard.OutputFolder + @"\pg.txt", pg, rowCount, columnCount); int convertedCellCount = 0; //模拟中总共转换的元胞数量 List <float> neighbours; //Moore领域的元胞 float omega; //扩散系数 float conSuitable; //适应度函数 float maxPct; //每次迭代时最大的Pct值 float[,] pct; float[,] pst; float sumPtt = 0; //Ptt的总和 int randomRow, randomColumn; //Monte Carlo方法选取的随机行和随机列 int convertCountInOneIteration = formLogisticCAWizard.ConvertCount / formLogisticCAWizard.Iterations; //每次迭代应转换的数量 int convertCountOnce = 0; //每次迭代已经转换的数量 float oldValue, newValue; //每次转换前土地利用类型的新值和旧值 int[,] changeCells = new int[rowCount, columnCount]; //记录每次转换为城市的单元。 int iteration = 0; //迭代的次数 //2.开始进行转换 while (convertedCellCount < formLogisticCAWizard.ConvertCount) { if (convertedCellCount % formLogisticCAWizard.OutputImageInterval == 0 && convertedCellCount != 0) { changeCells = new int[rowCount, columnCount]; } convertCountOnce = 0; //2.1每次迭代先得到Pct和MaxPct maxPct = float.MinValue; pct = new float[rowCount, columnCount]; for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { neighbours = CommonLibrary.GeneralOpertor.GetMooreNeighbors(i, j, simulationImage, rowCount, columnCount); omega = Convert.ToSingle(CommonLibrary.GeneralOpertor.GetUrbanCount(neighbours, formLogisticCAWizard.LandUseClassificationInfo.UrbanValues[0].LanduseTypeValue)) / (neighbours.Count - 1); if (formLogisticCAWizard.LandUseClassificationInfo.IsExistInConvertValue(simulationImage[i, j])) { conSuitable = 1f; } else { conSuitable = 0f; } pct[i, j] = pg[i, j] * conSuitable * omega; if (pct[i, j] > maxPct) { maxPct = pct[i, j]; } } } //CommonOperator.WriteData(Application.StartupPath + @"\\OutputData\pct.txt", pct, structAsciiImageFileMetaData); //2.2再得到Pst pst = new float[rowCount, columnCount]; sumPtt = 0; //2.2.1先得到ptt和Ptt的总和 for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { pst[i, j] = pct[i, j] * Convert.ToSingle(Math.Exp(-1f * formLogisticCAWizard.Delta * (1f - pct[i, j] / maxPct))); sumPtt += pst[i, j]; } } for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { pst[i, j] = convertCountInOneIteration * pst[i, j] / sumPtt; } } //CommonOperator.WriteData(Application.StartupPath + @"\\OutputData\pst.txt", pst, structAsciiImageFileMetaData); //2.3选择元胞与随机比较进行转换 //完成一次迭代 while (convertCountOnce < convertCountInOneIteration) { randomRow = random.Next(0, rowCount); randomColumn = random.Next(0, columnCount); if (pst[randomRow, randomColumn] > Convert.ToSingle(random.NextDouble())) { oldValue = simulationImage[randomRow, randomColumn]; newValue = formLogisticCAWizard.LandUseClassificationInfo.UrbanValues[0].LanduseTypeValue; simulationImage[randomRow, randomColumn] = newValue; CommonLibrary.GeneralOpertor.ChangeLandUseCount(newValue, oldValue, listLanduseInfoAndCount); convertCountOnce++; convertedCellCount++; changeCells[randomRow, randomColumn] = 1; } } iteration++; //2.4.刷新外部界面并输出中间结果数据 if (convertedCellCount == 1 || (iteration % formLogisticCAWizard.RefreshInterval == 0 && convertedCellCount != 0)) { //刷新图像 formLogisticCAWizard.SimulationImage = simulationImage; VariableMaintainer.IsNeedRefresh = true; //刷新图表窗体 string landuseTypeName = ""; for (int k = 0; k < listLanduseInfoAndCount.Count; k++) { for (int l = 0; l < listPointPairListName.Count; l++) { if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHS") { landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeChsName; } else if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHT") { landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeChtName; } else { landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeEnName; } if (landuseTypeName == listPointPairListName[l]) { dockableWindowGraphy.UpdateData(iteration, listLanduseInfoAndCount[k].LanduseTypeCount, l); } } } dockableWindowGraphy.RefreshGraph(); //刷新输出结果窗体 dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String45") + iteration.ToString() + resourceManager.GetString("String46")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String47") + convertedCellCount.ToString()); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.ScrollTextbox(); Application.DoEvents(); } //输出中间结果 if (formLogisticCAWizard.IsOutput && (iteration % formLogisticCAWizard.OutputImageInterval == 0)) { GeneralOpertor.WriteDataFloat(formLogisticCAWizard.OutputFolder + @"\" + GeneralOpertor.GetNowString() + "_lr_iterate_" + iteration.ToString() + @".txt", simulationImage, rowCount, columnCount); } } //3.完成模拟,输出结果。 stopWatch.Stop(); VariableMaintainer.IsSimulationFinished = true; dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String48")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String49") + GeneralOpertor.GetElapsedTimeString(stopWatch.Elapsed)); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText("\n"); //修改结果栅格的属性表 IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass(); IRasterWorkspace rasterWorkspace = workspaceFactory.OpenFromFile( VariableMaintainer.CurrentFormLogisticCAWizard.OutputFolder, 0) as IRasterWorkspace; IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset(VariableMaintainer.CurrentFoucsMap.get_Layer(0).Name); IRasterDatasetEdit3 rasterDatasetEdit3 = rasterDataset as IRasterDatasetEdit3; rasterDatasetEdit3.BuildAttributeTable(); IRasterDataset3 rasterDataset3 = rasterDataset as IRasterDataset3; rasterDataset3.Refresh(); if (formLogisticCAWizard.SimulationEndImageName != "") { //GeneralOpertor.WriteDataFloat(formLogisticCAWizard.OutputFolder + @"\CA_LR_Reslut" + GeneralOpertor.GetNowString() + ".txt", // simulationImage, rowCount, columnCount); StructBinaryConfusionMatrix structConfusionMatrix = GeneralOpertor.GetBinaryAccuracy( simulationImage, simulationEndImage, rowCount, columnCount, formLogisticCAWizard.LandUseClassificationInfo); string accuracyString = GeneralOpertor.GetBinaryAccuracyReportString(structConfusionMatrix, convertedCellCount); dockableWindowOutput.AppendText(accuracyString); DataTable dtMatrixNumber = GeneralOpertor.GetMultiTypesMatrix( simulationImage, simulationEndImage, rowCount, columnCount, formLogisticCAWizard.LandUseClassificationInfo); double overallAccuracy = 0d; double kappa = 0d; GeneralOpertor.GetMultiTypesAccuracy(dtMatrixNumber, ref overallAccuracy, ref kappa, formLogisticCAWizard.LandUseClassificationInfo); FormConfusionMatrix formConfusionMatrix = new FormConfusionMatrix(); formConfusionMatrix.DataTableValues = dtMatrixNumber; DataTable dtMatrixPercent = dtMatrixNumber.Clone(); GeneralOpertor.CopyDataTableValues(dtMatrixNumber, dtMatrixPercent); formConfusionMatrix.DataTablePercents = dtMatrixPercent; formConfusionMatrix.DataGridViewConfusionMatrix.DataSource = dtMatrixNumber; formConfusionMatrix.LabelOverallAccuracy.Text = (overallAccuracy * 100).ToString("0.00") + " %"; formConfusionMatrix.LabelKappa.Text = kappa.ToString("0.000"); float[] fomValues = GeneralOpertor.GetBinaryFoMAccuracy(simulationStartImage, simulationEndImage, simulationImage, rowCount, columnCount, formLogisticCAWizard.LandUseClassificationInfo.UrbanValues[0].LanduseTypeValue); formConfusionMatrix.LabelFoMValues.Text = "A: " + fomValues[0] + "\nB: " + fomValues[1] + "\nC: " + fomValues[2] + "\nD: " + fomValues[3]; formConfusionMatrix.LabelFoM.Text = fomValues[4].ToString("0.000"); formConfusionMatrix.LabelPA.Text = fomValues[5].ToString("0.000"); formConfusionMatrix.LabelUA.Text = fomValues[6].ToString("0.000"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String84")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(GeneralOpertor.WriteCoufusionMatrix(dtMatrixPercent)); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String83")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String85") + (overallAccuracy * 100).ToString("0.00") + " %"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String86") + kappa.ToString("0.000")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String87") + fomValues[4].ToString("0.000")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String88") + fomValues[5].ToString("0.000")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String89") + fomValues[6].ToString("0.000")); dockableWindowOutput.AppendText("\n"); formConfusionMatrix.Text = resourceManager.GetString("String105") + " - " + formLogisticCAWizard.SimulationLayerName; formConfusionMatrix.ShowDialog(); dockableWindowOutput.ScrollTextbox(); Application.DoEvents(); } dockableWindowOutput.AppendText("-------------------------------------------"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.ScrollTextbox(); Application.DoEvents(); }
public void DoSimulation() { //0准备开始模拟 ResourceManager resourceManager = VariableMaintainer.CurrentResourceManager; FormDTCAWizard formDTCAWizard = VariableMaintainer.CurrentFormDTCAWizard; Random random = new Random(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); //0.1获得数据 int rowCount = formDTCAWizard.CurrentStructRasterMetaData.RowCount; int columnCount = formDTCAWizard.CurrentStructRasterMetaData.ColumnCount; float[,] simulationStartImage = formDTCAWizard.SimulationStartImage; float[,] simulationEndImage = formDTCAWizard.SimulationEndImage; float[,] simulationImage = formDTCAWizard.SimulationImage; //0.2计算初始每种土地利用类型的单元数量 List <StructLanduseInfoAndCount> listLanduseInfoAndCount; //记录每种土地利用类型的单元数 listLanduseInfoAndCount = new List <StructLanduseInfoAndCount>(); StructLanduseInfoAndCount landuseInfoAndCount; foreach (StructLanduseInfo structLanduseInfo in formDTCAWizard.LandUseClassificationInfo.AllTypes) { landuseInfoAndCount = new StructLanduseInfoAndCount(); landuseInfoAndCount.structLanduseInfo = structLanduseInfo; landuseInfoAndCount.LanduseTypeCount = 0; listLanduseInfoAndCount.Add(landuseInfoAndCount); } for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { CommonLibrary.GeneralOpertor.ChangeLandUseCount(simulationStartImage[i, j], -10000, listLanduseInfoAndCount); } } //0.3显示输出结果窗体和图表窗体 dockableWindowGraphy.GraphTitle = resourceManager.GetString("String40"); dockableWindowGraphy.XAxisTitle = resourceManager.GetString("String41"); dockableWindowGraphy.YAxisTitle = resourceManager.GetString("String42"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String43")); Application.DoEvents(); //0.4绘制初始的图表 List <string> listPointPairListName = new List <string>(); List <string> notToDrawList = new List <string>(); notToDrawList.Add(resourceManager.GetString("String44")); dockableWindowGraphy.CreateGraph(listLanduseInfoAndCount, notToDrawList, out listPointPairListName); dockableWindowGraphy.RefreshGraph(); int convertedCellCount = 0; //模拟中总共转换的元胞数量 int randomRow, randomColumn; //Monte Carlo方法选取的随机行和随机列 int convertCountInOneIteration = formDTCAWizard.ConvertCount / formDTCAWizard.Iterations; //每次迭代应转换的数量 int convertCountOnce = 0; //每次迭代已经转换的数量 float oldValue, newValue; //每次转换前土地利用类型的新值和旧值 int iteration = 0; //迭代的次数 //float gamma = 1f / formDTCAWizard.Iterations; //float gamma = 0.4f; DecisionTree decisionTree = formDTCAWizard.CurrentDecisionTree; List <float> listUrbanValues = new List <float>(); for (int j = 0; j < formDTCAWizard.LandUseClassificationInfo.UrbanValues.Count; j++) { listUrbanValues.Add(formDTCAWizard.LandUseClassificationInfo.UrbanValues[j].LanduseTypeValue); } int neiWindowSize = formDTCAWizard.NeighbourWindowSize; try { //2.开始进行转换 while (convertedCellCount < formDTCAWizard.ConvertCount) { convertCountOnce = 0; while (convertCountOnce < convertCountInOneIteration) { //随机选择一个栅格进行计算 randomRow = random.Next(0, rowCount); randomColumn = random.Next(0, columnCount); //计算逻辑为: //这里需要首先获取当前元胞的输入值 //然后通过决策树计算是否发生转变 //然后看随机数是否小于等于预定值,则进行转变 //如果是空值,则不进行计算 if (simulationImage[randomRow, randomColumn] == -9999f) { continue; } //如果模拟影像该栅格是空值,也不进行计算 if (formDTCAWizard.ListVaribaleImages[formDTCAWizard.ListVaribaleImages.Count - 1][randomRow, randomColumn] == -9999f) { continue; } //如果已经是城市用地,则不计算 if (simulationImage[randomRow, randomColumn] == formDTCAWizard.LandUseClassificationInfo.UrbanValues[0].LanduseTypeValue) { continue; } double[] tempInputsArray = new double[formDTCAWizard.ListVaribaleImages.Count]; //获取该栅格的各空间变量值和其他输入变量 for (int i = 0; i < formDTCAWizard.ListVaribaleImages.Count; i++) { tempInputsArray[i] = formDTCAWizard.ListVaribaleImages[i][randomRow, randomColumn]; } //获取该栅格的邻域中城市用地数量 tempInputsArray[formDTCAWizard.ListVaribaleImages.Count - 2] = CommonLibrary.GeneralOpertor.GetNeighbors(randomRow, randomColumn, simulationImage, rowCount, columnCount, neiWindowSize, listUrbanValues); //获取该栅格当前的土地利用类型值 tempInputsArray[formDTCAWizard.ListVaribaleImages.Count - 1] = simulationImage[randomRow, randomColumn]; //计算决策树输出的转换值 int output = formDTCAWizard.CurrentDecisionTree.Compute(tempInputsArray); //如果计算为不转换,则不进行转换 if (output == 0) { continue; } //如果可以转换为城市用地 if (!formDTCAWizard.LandUseClassificationInfo.IsExistInConvertValue(simulationImage[randomRow, randomColumn])) { continue; } Random r = new Random(1); double convertThreshold = random.NextDouble(); //得到应转变为的土地利用类型值,以及当前土地利用类型值 newValue = formDTCAWizard.LandUseClassificationInfo.UrbanValues[0].LanduseTypeValue; oldValue = simulationImage[randomRow, randomColumn]; //未使用邻域因素模拟较为散,所以加入邻域因素 double neighbourValue = tempInputsArray[formDTCAWizard.ListVaribaleImages.Count - 2] / (neiWindowSize * neiWindowSize - 1); //double probability = convertThreshold * neighbourValue; //if ((oldValue != newValue) && (convertThreshold <= gamma)) //if ((oldValue != newValue) && (probability >= gamma)) //20170619添加限制层数据 // if ((VariableMaintainer.RestrictImage[randomRow, randomColumn] == 2) || (VariableMaintainer.RestrictImage[randomRow, randomColumn] == 1)) //if (VariableMaintainer.RestrictImage[randomRow, randomColumn] == 1) // continue; //引入随机因素,如果邻域因素大于随机数 if ((oldValue != newValue) && (neighbourValue > convertThreshold)) { simulationImage[randomRow, randomColumn] = newValue; CommonLibrary.GeneralOpertor.ChangeLandUseCount(newValue, oldValue, listLanduseInfoAndCount); convertCountOnce++; convertedCellCount++; //System.Diagnostics.Debug.WriteLine(convertedCellCount + " - Old: " + oldValue + " New: " + newValue); } } iteration++; //2.4.刷新外部界面并输出中间结果数据 if (convertedCellCount == 1 || (iteration % formDTCAWizard.RefreshInterval == 0 && convertedCellCount != 0)) { //刷新图像 formDTCAWizard.SimulationImage = simulationImage; VariableMaintainer.IsNeedRefresh = true; //刷新图表窗体 string landuseTypeName = ""; for (int k = 0; k < listLanduseInfoAndCount.Count; k++) { for (int l = 0; l < listPointPairListName.Count; l++) { if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHS") { landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeChsName; } else if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHT") { landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeChtName; } else { landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeEnName; } if (landuseTypeName == listPointPairListName[l]) { dockableWindowGraphy.UpdateData(iteration, listLanduseInfoAndCount[k].LanduseTypeCount, l); } } } dockableWindowGraphy.RefreshGraph(); //刷新输出结果窗体 dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String45") + iteration.ToString() + resourceManager.GetString("String46")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String47") + convertedCellCount.ToString()); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.ScrollTextbox(); Application.DoEvents(); } //输出中间结果 if (formDTCAWizard.IsOutput && (iteration % formDTCAWizard.OutputImageInterval == 0)) { GeneralOpertor.WriteDataFloat(formDTCAWizard.OutputFolder + @"\" + GeneralOpertor.GetNowString() + "_ann_iterate_" + iteration.ToString() + @".txt", simulationImage, rowCount, columnCount); } } } catch (Exception ex) { MessageBox.Show("DTCA: " + ex.Message); } //3.完成模拟,输出结果。 stopWatch.Stop(); //isFinished = true; VariableMaintainer.IsSimulationFinished = true; dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String48")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String49") + GeneralOpertor.GetElapsedTimeString(stopWatch.Elapsed)); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText("\n"); //修改结果栅格的属性表 IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass(); IRasterWorkspace rasterWorkspace = workspaceFactory.OpenFromFile( VariableMaintainer.CurrentFormDTCAWizard.OutputFolder, 0) as IRasterWorkspace; IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset(VariableMaintainer.CurrentFoucsMap.get_Layer(0).Name); IRasterDatasetEdit3 rasterDatasetEdit3 = rasterDataset as IRasterDatasetEdit3; rasterDatasetEdit3.BuildAttributeTable(); IRasterDataset3 rasterDataset3 = rasterDataset as IRasterDataset3; rasterDataset3.Refresh(); if (formDTCAWizard.SimulationEndImageName != "") { //GeneralOpertor.WriteDataFloat(formLogisticCAWizard.OutputFolder + @"\CA_ANN_Reslut" + GeneralOpertor.GetNowString() + ".txt", // simulationImage, rowCount,columnCount); StructBinaryConfusionMatrix structConfusionMatrix = GeneralOpertor.GetBinaryAccuracy( simulationImage, simulationEndImage, rowCount, columnCount, formDTCAWizard.LandUseClassificationInfo); string accuracyString = GeneralOpertor.GetBinaryAccuracyReportString(structConfusionMatrix, convertedCellCount); dockableWindowOutput.AppendText(accuracyString); DataTable dtMatrixNumber = GeneralOpertor.GetMultiTypesMatrix( simulationImage, simulationEndImage, rowCount, columnCount, formDTCAWizard.LandUseClassificationInfo); double overallAccuracy = 0d; double kappa = 0d; GeneralOpertor.GetMultiTypesAccuracy(dtMatrixNumber, ref overallAccuracy, ref kappa, formDTCAWizard.LandUseClassificationInfo); FormConfusionMatrix formConfusionMatrix = new FormConfusionMatrix(); formConfusionMatrix.DataTableValues = dtMatrixNumber; DataTable dtMatrixPercent = dtMatrixNumber.Clone(); GeneralOpertor.CopyDataTableValues(dtMatrixNumber, dtMatrixPercent); formConfusionMatrix.DataTablePercents = dtMatrixPercent; formConfusionMatrix.DataGridViewConfusionMatrix.DataSource = dtMatrixNumber; formConfusionMatrix.LabelOverallAccuracy.Text = (overallAccuracy * 100).ToString("0.00") + " %"; formConfusionMatrix.LabelKappa.Text = kappa.ToString("0.000"); float[] fomValues = GeneralOpertor.GetBinaryFoMAccuracy(simulationStartImage, simulationEndImage, simulationImage, rowCount, columnCount, formDTCAWizard.LandUseClassificationInfo.UrbanValues[0].LanduseTypeValue); formConfusionMatrix.LabelFoMValues.Text = "A: " + fomValues[0] + "\nB: " + fomValues[1] + "\nC: " + fomValues[2] + "\nD: " + fomValues[3]; formConfusionMatrix.LabelFoM.Text = fomValues[4].ToString("0.000"); formConfusionMatrix.LabelPA.Text = fomValues[5].ToString("0.000"); formConfusionMatrix.LabelUA.Text = fomValues[6].ToString("0.000"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String84")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(GeneralOpertor.WriteCoufusionMatrix(dtMatrixPercent)); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String83")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String85") + (overallAccuracy * 100).ToString("0.00") + " %"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String86") + kappa.ToString("0.000")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String87") + fomValues[4].ToString("0.000")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String88") + fomValues[5].ToString("0.000")); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText(resourceManager.GetString("String89") + fomValues[6].ToString("0.000")); dockableWindowOutput.AppendText("\n"); formConfusionMatrix.Text = resourceManager.GetString("String105") + " - " + formDTCAWizard.SimulationLayerName; formConfusionMatrix.ShowDialog(); } dockableWindowOutput.AppendText("-------------------------------------------"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.AppendText("\n"); dockableWindowOutput.ScrollTextbox(); Application.DoEvents(); }
protected override void OnClick() { try { ResourceManager resourceManager = VariableMaintainer.CurrentResourceManager; if (VariableMaintainer.CurrentModel == EnumCurrentModel.Null) { MessageBox.Show(resourceManager.GetString("String168"), resourceManager.GetString("String2"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } Thread thread = VariableMaintainer.SimulationThread; if (thread != null) { if (thread.ThreadState != ThreadState.Stopped) { MessageBox.Show(resourceManager.GetString("String39"), resourceManager.GetString("String2"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } } StructRasterMetaData structRasterMetaData = new StructRasterMetaData(); string model = ""; if (VariableMaintainer.CurrentModel == EnumCurrentModel.Simulation_CA_LogisticRegression) { model = resourceManager.GetString("String104"); } else if (VariableMaintainer.CurrentModel == EnumCurrentModel.Simulation_CA_ANN) { model = resourceManager.GetString("String102"); } else if (VariableMaintainer.CurrentModel == EnumCurrentModel.Simulation_CA_DT) { model = resourceManager.GetString("String103"); } else if (VariableMaintainer.CurrentModel == EnumCurrentModel.Optimization_Area) { model = resourceManager.GetString("String167"); } VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String82") + model + resourceManager.GetString("String101") + DateTime.Now.ToShortTimeString()); VariableMaintainer.CurrentDockableWindowOutput.AppendText("\n"); VariableMaintainer.CurrentDockableWindowOutput.AppendText("\n"); ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String58")); VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String58")); VariableMaintainer.CurrentDockableWindowOutput.AppendText("\n"); if (VariableMaintainer.CurrentModel == EnumCurrentModel.Simulation_CA_LogisticRegression) { //ArcGIS操作在另一线程中执行效率降低很多,因此把数据读取及刷新操作在线程外执行 //首先读取模拟起始时刻和/或终止时刻影像 ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String12")); VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String12") + VariableMaintainer.CurrentFormLogisticCAWizard.SimulationStartImageName + ".....\n"); VariableMaintainer.CurrentFormLogisticCAWizard.SimulationStartImage = ArcGISOperator.ReadRasterAndGetMetaData(ArcGISOperator.GetRasterLayerByName( VariableMaintainer.CurrentFormLogisticCAWizard.SimulationStartImageName), out structRasterMetaData); if (VariableMaintainer.CurrentFormLogisticCAWizard.SimulationEndImageName != "") { ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String13")); VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String13") + VariableMaintainer.CurrentFormLogisticCAWizard.SimulationEndImageName + ".....\n"); VariableMaintainer.CurrentFormLogisticCAWizard.SimulationEndImage = ArcGISOperator.ReadRaster(ArcGISOperator.GetRasterLayerByName( VariableMaintainer.CurrentFormLogisticCAWizard.SimulationEndImageName), -9999f); } //然后读取各变量影像 if (VariableMaintainer.CurrentFormLogisticCAWizard.IsUsingDefault) { foreach (string layerName in VariableMaintainer.CurrentFormLogisticCAWizard.ListVariableLayersName) { ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String14") + layerName + "....."); VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String14") + layerName + ".....\n"); VariableMaintainer.CurrentFormLogisticCAWizard.VaribaleImages.Add( ArcGISOperator.ReadRaster(ArcGISOperator.GetRasterLayerByName(layerName), -9999f)); } //获取最小空间范围 IRasterLayer rasterLayerStartImage = ArcGISOperator.GetRasterLayerByName(VariableMaintainer.CurrentFormLogisticCAWizard.SimulationStartImageName); IRasterLayer rasterLayerEndImage = ArcGISOperator.GetRasterLayerByName(VariableMaintainer.CurrentFormLogisticCAWizard.SimulationEndImageName); List <IRasterLayer> listVariablesLayers = new List <IRasterLayer>(); for (int i = 0; i < VariableMaintainer.CurrentFormLogisticCAWizard.ListVariableLayersName.Count; i++) { listVariablesLayers.Add(ArcGISOperator.GetRasterLayerByName(VariableMaintainer.CurrentFormLogisticCAWizard.ListVariableLayersName[i])); } ArcGISOperator.GetSmallestBound(rasterLayerStartImage, rasterLayerEndImage, listVariablesLayers, ref structRasterMetaData); VariableMaintainer.CurrentFormLogisticCAWizard.CurrentStructRasterMetaData = structRasterMetaData; } //最后用模拟起始时刻影像创建模拟影像 string dateTime = GeneralOpertor.GetDataTimeFullString(DateTime.Now); string rasterName = "sim" + dateTime + ".img"; ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String37")); VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String37") + rasterName + ".....\n"); IRasterLayer simulationStartImageLayer = ArcGISOperator.GetRasterLayerByName( VariableMaintainer.CurrentFormLogisticCAWizard.SimulationStartImageName); IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass(); IWorkspace workspace = workspaceFactory.OpenFromFile(VariableMaintainer.CurrentFormLogisticCAWizard.OutputFolder, 0); ISaveAs2 saveAs2 = (ISaveAs2)simulationStartImageLayer.Raster; saveAs2.SaveAs(rasterName, workspace, "IMAGINE Image"); IRasterLayer simulationImageLayer = new RasterLayerClass(); simulationImageLayer.CreateFromFilePath(VariableMaintainer.CurrentFormLogisticCAWizard.OutputFolder + @"\" + rasterName); simulationImageLayer.Renderer = simulationStartImageLayer.Renderer; ArcGISOperator.FoucsMap.AddLayer((ILayer)simulationImageLayer); VariableMaintainer.CurrentFormLogisticCAWizard.SimulationImage = ArcGISOperator.ReadRaster(simulationImageLayer, -9999f); VariableMaintainer.CurrentFormLogisticCAWizard.SimulationLayerName = rasterName; LogisticRegreesionCA lrCA = new LogisticRegreesionCA(); lrCA.DockableWindowGraphy = VariableMaintainer.CurrentDockableWindowGraphy; lrCA.DockableWindowOutput = VariableMaintainer.CurrentDockableWindowOutput; thread = new Thread(new ThreadStart(lrCA.DoSimulation)); } else if (VariableMaintainer.CurrentModel == EnumCurrentModel.Simulation_CA_ANN) { //今后应使用父类和接口进行重构 //首先读取模拟起始时刻和/或终止时刻影像 ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String12")); VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String12") + VariableMaintainer.CurrentFormANNCAWizard.SimulationStartImageName + ".....\n"); VariableMaintainer.CurrentFormANNCAWizard.SimulationStartImage = ArcGISOperator.ReadRasterAndGetMetaData(ArcGISOperator.GetRasterLayerByName( VariableMaintainer.CurrentFormANNCAWizard.SimulationStartImageName), out structRasterMetaData); //VariableMaintainer.CurrentANNCAWizard.CurrentStructRasterMetaData = structRasterMetaData; if (VariableMaintainer.CurrentFormANNCAWizard.SimulationEndImageName != "") { ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String13")); VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String13") + VariableMaintainer.CurrentFormLogisticCAWizard.SimulationEndImageName + ".....\n"); VariableMaintainer.CurrentFormANNCAWizard.SimulationEndImage = ArcGISOperator.ReadRaster(ArcGISOperator.GetRasterLayerByName( VariableMaintainer.CurrentFormANNCAWizard.SimulationEndImageName), -9999f); } //最后用模拟起始时刻影像创建模拟影像 string dateTime = GeneralOpertor.GetDataTimeFullString(DateTime.Now); string rasterName = "sim" + dateTime + ".img"; ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String37")); VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String37") + rasterName + ".....\n"); IRasterLayer simulationStartImageLayer = ArcGISOperator.GetRasterLayerByName( VariableMaintainer.CurrentFormANNCAWizard.SimulationStartImageName); IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass(); IWorkspace workspace = workspaceFactory.OpenFromFile(VariableMaintainer.CurrentFormANNCAWizard.OutputFolder, 0); ISaveAs2 saveAs2 = (ISaveAs2)simulationStartImageLayer.Raster; saveAs2.SaveAs(rasterName, workspace, "IMAGINE Image"); IRasterLayer simulationImageLayer = new RasterLayerClass(); simulationImageLayer.CreateFromFilePath(VariableMaintainer.CurrentFormANNCAWizard.OutputFolder + @"\" + rasterName); simulationImageLayer.Renderer = simulationStartImageLayer.Renderer; ArcGISOperator.FoucsMap.AddLayer((ILayer)simulationImageLayer); VariableMaintainer.CurrentFormANNCAWizard.SimulationImage = ArcGISOperator.ReadRaster(simulationImageLayer, -9999f); VariableMaintainer.CurrentFormANNCAWizard.SimulationLayerName = rasterName; ANNCA annCA = new ANNCA(); annCA.DockableWindowGraphy = VariableMaintainer.CurrentDockableWindowGraphy; annCA.DockableWindowOutput = VariableMaintainer.CurrentDockableWindowOutput; thread = new Thread(new ThreadStart(annCA.DoSimulation)); } else if (VariableMaintainer.CurrentModel == EnumCurrentModel.Simulation_CA_DT) { //今后应使用父类和接口进行重构 //首先读取模拟起始时刻和/或终止时刻影像 ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String12")); VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String12") + VariableMaintainer.CurrentFormDTCAWizard.SimulationStartImageName + ".....\n"); VariableMaintainer.CurrentFormDTCAWizard.SimulationStartImage = ArcGISOperator.ReadRasterAndGetMetaData(ArcGISOperator.GetRasterLayerByName( VariableMaintainer.CurrentFormDTCAWizard.SimulationStartImageName), out structRasterMetaData); //VariableMaintainer.CurrentDTCAWizard.CurrentStructRasterMetaData = structRasterMetaData; if (VariableMaintainer.CurrentFormDTCAWizard.SimulationEndImageName != "") { ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String13")); VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String13") + VariableMaintainer.CurrentFormLogisticCAWizard.SimulationEndImageName + ".....\n"); VariableMaintainer.CurrentFormDTCAWizard.SimulationEndImage = ArcGISOperator.ReadRaster(ArcGISOperator.GetRasterLayerByName( VariableMaintainer.CurrentFormDTCAWizard.SimulationEndImageName), -9999f); } //20170619添加限制层数据 //VariableMaintainer.CurrentDockableWindowOutput.AppendText("Add Restriction Layer " + // "ACOres" + ".....\n"); //VariableMaintainer.RestrictImage = ArcGISOperator.ReadRaster(ArcGISOperator.GetRasterLayerByName( // "ACOres"), -9999f); //最后用模拟起始时刻影像创建模拟影像 string dateTime = GeneralOpertor.GetDataTimeFullString(DateTime.Now); string rasterName = "sim" + dateTime + ".img"; ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String37")); VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String37") + rasterName + ".....\n"); IRasterLayer simulationStartImageLayer = ArcGISOperator.GetRasterLayerByName( VariableMaintainer.CurrentFormDTCAWizard.SimulationStartImageName); IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass(); IWorkspace workspace = workspaceFactory.OpenFromFile(VariableMaintainer.CurrentFormDTCAWizard.OutputFolder, 0); ISaveAs2 saveAs2 = (ISaveAs2)simulationStartImageLayer.Raster; saveAs2.SaveAs(rasterName, workspace, "IMAGINE Image"); IRasterLayer simulationImageLayer = new RasterLayerClass(); simulationImageLayer.CreateFromFilePath(VariableMaintainer.CurrentFormDTCAWizard.OutputFolder + @"\" + rasterName); simulationImageLayer.Renderer = simulationStartImageLayer.Renderer; ArcGISOperator.FoucsMap.AddLayer((ILayer)simulationImageLayer); VariableMaintainer.CurrentFormDTCAWizard.SimulationImage = ArcGISOperator.ReadRaster(simulationImageLayer, -9999f); VariableMaintainer.CurrentFormDTCAWizard.SimulationLayerName = rasterName; DecisionTreeCA dtCA = new DecisionTreeCA(); dtCA.DockableWindowGraphy = VariableMaintainer.CurrentDockableWindowGraphy; dtCA.DockableWindowOutput = VariableMaintainer.CurrentDockableWindowOutput; thread = new Thread(new ThreadStart(dtCA.DoSimulation)); } else if (VariableMaintainer.CurrentModel == EnumCurrentModel.Optimization_Area) { if (!VariableMaintainer.IsACOUtilitySet || !VariableMaintainer.IsACOParametersSet) { MessageBox.Show(resourceManager.GetString("String166"), resourceManager.GetString("String2"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } AreaOptimizationACO areaOptimizationACO = new AreaOptimizationACO(); areaOptimizationACO.Initialize(VariableMaintainer.CurrentStructACOParameters, 1, false, VariableMaintainer.CurrentDockableWindowOutput, VariableMaintainer.CurrentDockableWindowGraphy, true); thread = new Thread(new ThreadStart(areaOptimizationACO.Run)); } else { MessageBox.Show(resourceManager.GetString("String168"), resourceManager.GetString("String2"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } VariableMaintainer.SimulationThread = thread; thread.SetApartmentState(ApartmentState.STA); thread.Start(); VariableMaintainer.CurrentTimer.Interval = 500; VariableMaintainer.CurrentTimer.Tick += new EventHandler(t_Tick); VariableMaintainer.CurrentTimer.Enabled = true; VariableMaintainer.CurrentTimer.Start(); ArcMap.Application.CurrentTool = null; } catch (Exception ex) { MessageBox.Show(ex.Message); } }
//-------------------------------------------------------------------------------------------------------------- //------------------------------------------------方法---------------------------------------------------------- /// <summary> /// 方法 /// </summary> #region 方法 /// <summary> /// 初始化方法 /// </summary> #region ----------------初始化方法------------------------ public void Initialize(StructACOParameters structACOParameters, int microSearchIterationCountValue, Boolean isNeedSaveValue, DockableWindowOutput currentDockableWindowOutput, DockableWindowGraphy currentDockableWindowGraphy, Boolean isUseCompactnessValue) { q = structACOParameters.Q; //信息素强度 rho = structACOParameters.Rho; //挥发因子 alpha = structACOParameters.Alpha; //信息素权重 beta = structACOParameters.Beta; //启发函数权重 weightSutiable = structACOParameters.WeightSuitable; //阻抗性权重 weightCompact = structACOParameters.WeightCompact; //紧凑性权重 totalItearationCount = structACOParameters.InterationCount; //总迭代次数 currentIteration = 0; //当前迭代次数 currentRefreshIteration = 0; //更新次数 needFinishIterationCount = 0; microSearchIterationCount = microSearchIterationCountValue; //小搜索次数 goalUtilityAntsStatusInMicroSearch = new Ant[structACOParameters.AntCount]; //小搜索内最优状态 currentIterationInMicroSearch = 0; goalUtilityInMicroSearch = 0; isNeedSave = isNeedSaveValue; //判断是否需要保存结果 isNeedUpdate = false; //初始化判断是否需要更新最优状态 isInitialStatusSave = false; //判断是否已经保存初始状态数据 //rows = rrows; //网格行数 //cols = ccols; //网格列数 //xllcorner = xxllcorner; //输出文件左上角横坐标 //yllcorner = yyllcorner; //输出文件左上角纵坐标 //cellsize = ccellsize; //栅格大小 //noDataValue = nnodata_value; //无数据值 outputPath = structACOParameters.OutputFolder; //结果输出路径 outInitName = "_Init.txt"; //结果输出初始状态文件名 outFileName = ""; //结果输出文件名 outPreFileName = "g"; //结果输出文件名前面部分 outGoalName = "GoalFunction.txt"; //结果输出目标函数名 antsCount = structACOParameters.AntCount; //智能体个数 //cellSize = bbianChang; //网格边长 //cellArea = cellSize * cellSize * antsCount; //智能体面积 goalUtilityInAllIterations = 0; randomBound = 1; goalUtilityArray = new string[totalItearationCount + 2]; //保存目标函数值数据 suitabilityData = GetSuitabilityData(VariableMaintainer.OptimizationExpression); InitializeOccupiedAndGoalUtilityAntsStatusInAllIterations(); //初始化挖空 InitializeAnts(); //初始化智能体 InitializePheromone(); //初始化信息素 InitializeHeuristicFunction(); //初始化启发函数 string simulationLayerName = VariableMaintainer.CurrentFoucsMap.get_Layer(0).Name; IRasterLayer simulationImageLayer = ArcGISOperator.GetRasterLayerByName(simulationLayerName); string dateTime = GeneralOpertor.GetDataTimeFullString(DateTime.Now); string rasterName = "ACOArea" + dateTime + ".img"; IRasterDataset rst = ArcGISOperator.CreateRasterDataset(VariableMaintainer.DefaultOutputFolder, rasterName, simulationImageLayer, structRasterMetaData, occupiedStatus, 0); IRasterLayer n = new RasterLayerClass(); n.CreateFromDataset(rst); IColorRamp colorRamp = new RandomColorRampClass(); ArcGISOperator.UniqueValueRenderer(colorRamp, n, "Value"); ArcGISOperator.FoucsMap.AddLayer((ILayer)n); double pixelWidth = ((IRasterDefaultProps)n.Raster).DefaultPixelWidth; double pixelHeight = ((IRasterDefaultProps)n.Raster).DefaultPixelHeight; cellArea = pixelWidth * pixelHeight * antsCount; cellSize = pixelWidth; random = new Random(); dockableWindowOutput = currentDockableWindowOutput; dockableWindowGraphy = currentDockableWindowGraphy; stringBuilderMessage = new StringBuilder(); isUseCompactness = isUseCompactnessValue; dockableWindowGraphy.GraphTitle = "Goal Utility"; dockableWindowGraphy.XAxisTitle = "Iteration"; dockableWindowGraphy.YAxisTitle = "Goal Utility Value"; }
public float[,] GetSuitabilityData(string expression) { string[] splitedExpressionArray; bool isSplited = SplitExpression(expression, out splitedExpressionArray); if (isSplited == false) { MessageBox.Show("Suitibility Function Express Error", VariableMaintainer.CurrentResourceManager.GetString("String2"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return(null); } //根据获取的文件名字符串去读取相应的栅格文件 List <float[, ]> listLayers = new List <float[, ]>(); structRasterMetaData = new StructRasterMetaData(); for (int i = 0; i < splitedExpressionArray.Length; i++) { if (i > 0 && i % 2 > 0) { string layerName = splitedExpressionArray[i]; if (i == 1) { listLayers.Add(ArcGISOperator.ReadRasterAndGetMetaData( ArcGISOperator.GetRasterLayerByName(layerName), out structRasterMetaData)); } else { listLayers.Add(ArcGISOperator.ReadRaster(ArcGISOperator.GetRasterLayerByName(layerName), structRasterMetaData.NoDataValue)); } } } if (listLayers.Count == 0) { MessageBox.Show("Please select layers for calculation!", VariableMaintainer.CurrentResourceManager.GetString("String2"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return(null); } //读取全部文件后进行计算,生成适宜性图层数据,并进行归一化 float[,] suitabilityData = new float[structRasterMetaData.RowCount, structRasterMetaData.ColumnCount]; float min = 1, max = 0; Expression ex = new Expression("1+1"); //MathParser mathParser = new MathParser(); for (int i = 0; i < structRasterMetaData.RowCount; i++) { for (int j = 0; j < structRasterMetaData.ColumnCount; j++) { bool isNullData = false; for (int k = 0; k < listLayers.Count; k++) { if (listLayers[k][i, j] == structRasterMetaData.NoDataValue) { isNullData = true; break; } } if (isNullData) { suitabilityData[i, j] = structRasterMetaData.NoDataValue; } else { string calculateExpression = ""; for (int w = 0; w < splitedExpressionArray.Length; w++) { if (w > 0 && w % 2 == 1) { calculateExpression += listLayers[w / 2][i, j]; } else { calculateExpression += splitedExpressionArray[w]; } } ex = new Expression(calculateExpression); suitabilityData[i, j] = Convert.ToSingle(ex.Evaluate()); //suitabilityData[i, j] = Convert.ToSingle(mathParser.Parse(calculateExpression, false)); if (suitabilityData[i, j] < min) { min = suitabilityData[i, j]; } if (suitabilityData[i, j] > max) { max = suitabilityData[i, j]; } } } } float[,] suitabilityData2 = new float[structRasterMetaData.RowCount, structRasterMetaData.ColumnCount]; for (int i = 0; i < structRasterMetaData.RowCount; i++) { for (int j = 0; j < structRasterMetaData.ColumnCount; j++) { if (suitabilityData[i, j] == structRasterMetaData.NoDataValue) { suitabilityData2[i, j] = structRasterMetaData.NoDataValue; } else { suitabilityData2[i, j] = (suitabilityData[i, j] - min) / (max - min); } } } //将其他图层关闭,以免影响蚁群优化的刷新效果 for (int i = 0; i < VariableMaintainer.CurrentFoucsMap.LayerCount; i++) { if (VariableMaintainer.CurrentFoucsMap.get_Layer(i).Visible) { VariableMaintainer.CurrentFoucsMap.get_Layer(i).Visible = false; } } //显示适宜性图层 string dateTime = GeneralOpertor.GetDataTimeFullString(DateTime.Now); string rasterName = "suitability" + dateTime + ".img"; ArcMap.Application.StatusBar.set_Message(0, VariableMaintainer.CurrentResourceManager.GetString("String169")); VariableMaintainer.CurrentDockableWindowOutput.AppendText(VariableMaintainer.CurrentResourceManager.GetString("String169") + rasterName + ".....\n"); VariableMaintainer.CurrentDockableWindowOutput.AppendText("\n"); IRasterLayer templateImageLayer = ArcGISOperator.GetRasterLayerByName( splitedExpressionArray[1].ToString()); IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass(); IWorkspace workspace = workspaceFactory.OpenFromFile(VariableMaintainer.DefaultOutputFolder, 0); ISaveAs2 saveAs2 = (ISaveAs2)templateImageLayer.Raster; saveAs2.SaveAs(rasterName, workspace, "IMAGINE Image"); IRasterLayer sutiabilityImageLayer = new RasterLayerClass(); sutiabilityImageLayer.CreateFromFilePath(VariableMaintainer.DefaultOutputFolder + @"\" + rasterName); //sutiabilityImageLayer.Renderer = templateImageLayer.Renderer; ArcGISOperator.FoucsMap.AddLayer((ILayer)sutiabilityImageLayer); IRasterLayer simulationImageLayer = new RasterLayerClass(); simulationImageLayer.CreateFromFilePath(VariableMaintainer.DefaultOutputFolder + @"\" + rasterName); ArcGISOperator.WriteRaster(simulationImageLayer, suitabilityData2); IRasterLayer l = ArcGISOperator.GetRasterLayerByName(rasterName); IRaster2 raster = simulationImageLayer.Raster as IRaster2; IPnt fromPnt = new PntClass(); fromPnt.SetCoords(0, 0); IPnt blockSize = new PntClass(); blockSize.SetCoords(simulationImageLayer.ColumnCount, simulationImageLayer.RowCount); IPixelBlock pixelBlock = ((IRaster)raster).CreatePixelBlock(blockSize); l.Raster.Read(fromPnt, pixelBlock); ((IRasterEdit)l.Raster).Refresh(); IActiveView activeView = VariableMaintainer.CurrentFoucsMap as IActiveView; activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); return(suitabilityData2); }
/// <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(); } }
/// <summary> /// 输出摘要信息。 /// </summary> public string WriteSummay() { StringBuilder sb = new StringBuilder(); sb.AppendLine(resourceManager.GetString("String100")); sb.AppendLine(); sb.AppendLine(resourceManager.GetString("String73")); foreach (string variableName in listVariableLayersName) { sb.AppendLine(variableName); } sb.AppendLine(); sb.AppendLine(resourceManager.GetString("String74")); sb.AppendLine(resourceManager.GetString("String27")); foreach (StructLanduseInfo structLanduseInfo in landUseClassificationInfo.UrbanValues) { sb.AppendLine(structLanduseInfo.LanduseTypeChsName + resourceManager.GetString("String28") + structLanduseInfo.LanduseTypeValue.ToString()); } sb.AppendLine(); sb.AppendLine(resourceManager.GetString("String29")); foreach (StructLanduseInfo structLanduseInfo in landUseClassificationInfo.ConvertValues) { sb.AppendLine(structLanduseInfo.LanduseTypeChsName + resourceManager.GetString("String28") + structLanduseInfo.LanduseTypeValue.ToString()); } sb.AppendLine(); sb.AppendLine(resourceManager.GetString("String30")); foreach (StructLanduseInfo structLanduseInfo in landUseClassificationInfo.NotToConvertValues) { sb.AppendLine(structLanduseInfo.LanduseTypeChsName + resourceManager.GetString("String28") + structLanduseInfo.LanduseTypeValue.ToString()); } sb.AppendLine(); sb.AppendLine(resourceManager.GetString("String19")); for (int i = 0; i < coef.Length; i++) { if (i == 0) { sb.AppendLine(resourceManager.GetString("String20") + resourceManager.GetString("String21") + GeneralOpertor.FormatDouble(coef[0], "#.###")); } else { sb.AppendLine(listVariableLayersName[i - 1] + resourceManager.GetString("String21") + GeneralOpertor.FormatDouble(coef[i], "#.###")); } } sb.AppendLine(); sb.AppendLine(resourceManager.GetString("String76") + simulationStartImageName); sb.AppendLine(resourceManager.GetString("String77") + simulationEndImageName); sb.AppendLine(); sb.AppendLine(resourceManager.GetString("String22") + numericUpDownConvertCount.Value.ToString() + resourceManager.GetString("String23")); sb.AppendLine(resourceManager.GetString("String31") + numericUpDownIterations.Value.ToString() + resourceManager.GetString("String24")); sb.AppendLine(resourceManager.GetString("String25") + Convert.ToInt32(numericUpDownConvertCount.Value / numericUpDownIterations.Value).ToString() + resourceManager.GetString("String23")); sb.AppendLine(); sb.AppendLine(resourceManager.GetString("String26") + numericUpDownDelta.Value.ToString()); sb.AppendLine(); sb.AppendLine(); sb.AppendLine(resourceManager.GetString("String32")); sb.AppendLine(resourceManager.GetString("String33") + numericUpDownRefresh.Value + resourceManager.GetString("String34")); if (isOutput) { sb.AppendLine(resourceManager.GetString("String33") + numericUpDownOutputImage.Value + resourceManager.GetString("String35")); sb.AppendLine(resourceManager.GetString("String36") + textBoxOutputFolder.Text); } sb.AppendLine(); sb.AppendLine(); return(sb.ToString()); }