/// <summary> /// 获取当前各数据的最小空间范围。 /// </summary> /// <param name="trainingStartLayer"></param> /// <param name="trainingEndLayer"></param> /// <param name="variablesLayers"></param> /// <param name="structRasterMetaData"></param> public static void GetSmallestBound(IRasterLayer trainingStartLayer, IRasterLayer trainingEndLayer, List <IRasterLayer> variablesLayers, ref StructRasterMetaData structRasterMetaData) { int rowCount = structRasterMetaData.RowCount; int columnCount = structRasterMetaData.ColumnCount; if ((trainingStartLayer.RowCount < rowCount) && (trainingStartLayer.ColumnCount < columnCount)) { rowCount = trainingStartLayer.RowCount; columnCount = trainingStartLayer.ColumnCount; } if ((trainingEndLayer.RowCount < rowCount) && (trainingEndLayer.ColumnCount < columnCount)) { rowCount = trainingEndLayer.RowCount; columnCount = trainingEndLayer.ColumnCount; } for (int i = 0; i < variablesLayers.Count; i++) { if ((variablesLayers[i].RowCount < rowCount) && (variablesLayers[i].ColumnCount < columnCount)) { rowCount = variablesLayers[i].RowCount; columnCount = variablesLayers[i].ColumnCount; } } structRasterMetaData.RowCount = rowCount; structRasterMetaData.ColumnCount = columnCount; }
/// <summary> /// 读取栅格数据,并得到图层数据的元数据。 /// </summary> public static float[,] ReadRasterAndGetMetaData(IRasterLayer rasterLayer, out StructRasterMetaData structRasterMetaData) { int rowCount, columnCount; structRasterMetaData.ColumnCount = rasterLayer.ColumnCount; columnCount = structRasterMetaData.ColumnCount; structRasterMetaData.RowCount = rasterLayer.RowCount; rowCount = structRasterMetaData.RowCount; IEnvelope visiableExtent = rasterLayer.VisibleExtent; structRasterMetaData.XMin = visiableExtent.XMin; structRasterMetaData.XMax = visiableExtent.XMax; structRasterMetaData.YMin = visiableExtent.YMin; structRasterMetaData.YMax = visiableExtent.YMax; structRasterMetaData.NoDataValue = -9999f; IRaster2 raster = rasterLayer.Raster as IRaster2; IPnt fromPnt = new PntClass(); fromPnt.SetCoords(0, 0); IPnt blockSize = new PntClass(); blockSize.SetCoords(columnCount, rowCount); IPixelBlock pixedBlock = ((IRaster)raster).CreatePixelBlock(blockSize); rasterLayer.Raster.Read(fromPnt, pixedBlock); float[,] data = new float[rowCount, columnCount]; for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { object value = pixedBlock.GetVal(0, j, i); if (value != null) { data[i, j] = Convert.ToSingle(value); } else { data[i, j] = structRasterMetaData.NoDataValue; } } } return(data); }
/// <summary> /// 执行清空操作。 /// </summary> public void Clear() { comboBoxTrainingStartImage.Items.Clear(); comboBoxTrainingEndImage.Items.Clear(); comboBoxSimStartImage.Items.Clear(); comboBoxSimEndImage.Items.Clear(); listAllLayersInMapName.Clear(); listVariableLayersName.Clear(); trainingStartImageName = ""; trainingEndImageName = ""; simulationStartImageName = ""; simulationEndImageName = ""; convertCount = 0; simulationIterations = 0; delta = 1; refreshInterval = 1; outputImageInterval = 1; outputFolder = ""; isOutput = false; isUsingDefault = false; isFinish = false; varibaleImages.Clear(); landUseClassificationInfo = new LandUseClassificationInfo(); structRasterMetaData = new StructRasterMetaData(); this.dataGridViewVariableDatas.Rows.Clear(); this.comboBoxTrainingStartImage.SelectedIndex = -1; this.comboBoxTrainingEndImage.SelectedIndex = -1; this.comboBoxSimStartImage.SelectedIndex = -1; this.comboBoxSimEndImage.SelectedIndex = -1; this.comboBoxTrainingStartImage.Text = ""; this.comboBoxTrainingEndImage.Text = ""; this.comboBoxSimStartImage.Text = ""; this.comboBoxSimEndImage.Text = ""; VariableMaintainer.IsSimulationFinished = false; this.numericUpDownConvertCount.Value = 100; this.numericUpDownIterations.Value = 10; isRegressed = false; }
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); } }
public static IRasterDataset CreateRasterDataset(string filePath, string fileName, IRasterLayer rasterLayer, StructRasterMetaData structRasterMetaData, int[,] data, int noDataValue) { try { IRasterWorkspace2 rasterWorkspace2 = OpenRasterWorkspace(filePath); //Define the origin for the raster dataset, which is the lower left corner of the raster. IPoint originPoint = new PointClass(); originPoint.PutCoords(structRasterMetaData.XMin, structRasterMetaData.YMin); //Define the dimensions of the raster dataset. int width = structRasterMetaData.RowCount; //This is the width of the raster dataset. int height = structRasterMetaData.ColumnCount; //This is the height of the raster dataset. IRaster r = rasterLayer.Raster; IRasterDefaultProps rdp = r as IRasterDefaultProps; double xCellSize = rdp.DefaultPixelWidth; //This is the cell size in x direction. double yCellSize = rdp.DefaultPixelHeight; //This is the cell size in y direction. ISpatialReference spatialReference = rdp.DefaultSpatialReference; int bandCount = 1; // This is the number of bands the raster dataset contains. //Create a raster dataset in TIFF format. IRasterDataset rasterDataset = rasterWorkspace2.CreateRasterDataset(fileName, "IMAGINE Image", originPoint, height, width, xCellSize, yCellSize, bandCount, rstPixelType.PT_UCHAR, spatialReference, true); //If you need to set NoData for some of the pixels, you need to set it on band //to get the raster band. IRasterBandCollection rasterBands = (IRasterBandCollection)rasterDataset; IRasterBand rasterBand; IRasterProps rasterProps; rasterBand = rasterBands.Item(0); rasterProps = (IRasterProps)rasterBand; //Set NoData if necessary. For a multiband image, a NoData value needs to be set for each band. rasterProps.NoDataValue = -9999f; //Create a raster from the dataset. IRaster raster = rasterDataset.CreateDefaultRaster(); //Create a pixel block using the weight and height of the raster dataset. //If the raster dataset is large, a smaller pixel block should be used. //Refer to the topic "How to access pixel data using a raster cursor". IPnt blocksize = new PntClass(); blocksize.SetCoords(height, width); IPixelBlock3 pixelblock = raster.CreatePixelBlock(blocksize) as IPixelBlock3; object temp = pixelblock.get_PixelDataByRef(0); System.Byte[,] pixelData = (System.Byte[, ])temp; for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { if (data[i, j] == -9999f) { pixelData[j, i] = (System.Byte)noDataValue; //System.Diagnostics.Debug.WriteLine(i.ToString() + "+" + j.ToString()); } else { if (pixelData[j, i] != Convert.ToByte(data[i, j])) { pixelData[j, i] = Convert.ToByte(data[i, j]); } //System.Diagnostics.Debug.WriteLine(i.ToString() + "-" + j.ToString()); } } } pixelblock.set_PixelData(0, pixelData); //Define the location that the upper left corner of the pixel block is to write. IPnt upperLeft = new PntClass(); upperLeft.SetCoords(0, 0); //Write the pixel block. IRasterEdit rasterEdit = (IRasterEdit)raster; rasterEdit.Write(upperLeft, (IPixelBlock)pixelblock); //Release rasterEdit explicitly. System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterEdit); return(rasterDataset); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); return(null); } }
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="independentVariables">进行抽样的自变量的数值集合。</param> /// <param name="dependentVariable">因变量的值。</param> /// <param name="samplePrecent">抽样比例。乘以总样本数为抽样样本总数。</param> /// <param name="trueDataPercent">变化为真(值为1,未变化值为0)的值占整个抽样样本数的比例。</param> /// /// <param name="structRasterMetaData">记录当前影像数据元数据(包括非空值)的结构体。</param> /// <returns></returns> public float[,] SamplingData(List <float[, ]> independentVariables, float[,] dependentVariable, double samplePrecent, float trueDataPercent, StructRasterMetaData structRasterMetaData, List <int> notNullRows, List <int> notNullColumns) { samplingCellsCount = Convert.ToInt32(notNullRows.Count * samplePrecent / 100); //要抽取的样本总数。 int trueDataCount = Convert.ToInt32(samplingCellsCount * trueDataPercent / 100); //要抽取的真值的样本总数。 int falseDataCount = samplingCellsCount - trueDataCount; //要抽取的非真值的样本总数。 float[,] result = new float[samplingCellsCount, independentVariables.Count + 1]; int sum = 0; //当前抽取的样本总数。 int trueSum = 0; //当前抽取的真值的样本总数。 int falseSum = 0; //当前抽取的非真值的样本总数。 int randomIndex = 0; //随机抽取的行列号的索引。 int randomRow = 0; //由随机抽取的行列号的索引得到的非空数据的行号。 int randomColumn = 0; //由随机抽取的行列号的索引得到的非空数据的列号。 bool isExistNullValue = false; //记录当前选择的行列号在空间因子图层中是否存在非空值。 try { while (sum < samplingCellsCount) { randomIndex = random.Next(0, notNullRows.Count); randomRow = notNullRows[randomIndex]; randomColumn = notNullColumns[randomIndex]; if ((randomRow >= structRasterMetaData.RowCount) || (randomColumn >= structRasterMetaData.ColumnCount)) { continue; } isExistNullValue = false; //要判断变量如果某点该变量的值为空值,则不抽样该点。 //(该原因的造成是数据问题,可能开始年份的数据非空,但其他数据该点为空值。) for (int j = 0; j < independentVariables.Count; j++) { if (independentVariables[j][randomRow, randomColumn] == structRasterMetaData.NoDataValue) { isExistNullValue = true; break; } } if (isExistNullValue) { continue; } //如果其因变量为真值 if (dependentVariable[randomRow, randomColumn] == 1f) { //如果真值数据还未抽样完毕,添加一条抽样结果。 if (trueSum < trueDataCount) { for (int j = 0; j < independentVariables.Count; j++) { result[sum, j] = independentVariables[j][randomRow, randomColumn]; } result[sum, independentVariables.Count] = dependentVariable[randomRow, randomColumn]; trueSum++; sum++; } } //如果其因变量为非真值 else if (dependentVariable[randomRow, randomColumn] == 0f) { //如果非真值数据还未抽样完毕,添加一条抽样结果。 if (falseSum < falseDataCount) { for (int j = 0; j < independentVariables.Count; j++) { result[sum, j] = independentVariables[j][randomRow, randomColumn]; } result[sum, independentVariables.Count] = dependentVariable[randomRow, randomColumn]; falseSum++; sum++; } } else { //如果因变量为数据空值,则跳过该点。(处理数据有问题时的情况,应该不会出现。) continue; } } } catch (Exception ex) { MessageBox.Show(ex.Message); } return(result); }
/// <summary> /// 进行基于ANN的数据抽样。 /// </summary> /// <param name="listSpatialVariables"></param> /// <param name="trainningStartImage"></param> /// <param name="trainningEndImage"></param> /// <param name="landuseClassificationInfo"></param> /// <param name="structRasterMetaData"></param> /// <param name="neiWindowSize"></param> /// <param name="listNotNullRows"></param> /// <param name="listNotNullColumns"></param> /// <param name="inputs"></param> /// <param name="outputs"></param> /// <param name="samplingCellsCount"></param> /// <param name="inputNeuronsCount"></param> /// <param name="outputNeuronsCount"></param> public void ANNSamplingData(List <float[, ]> listSpatialVariables, float[,] trainningStartImage, float[,] trainningEndImage, LandUseClassificationInfo landuseClassificationInfo, StructRasterMetaData structRasterMetaData, int neiWindowSize, List <int> listNotNullRows, List <int> listNotNullColumns, ref float[][] inputs, ref float[][] outputs, int samplingCellsCount, int inputNeuronsCount, int outputNeuronsCount) { float[] tempInputsArray = null; float[] tempOutputsArray = null; List <int> listChoosen = new List <int>(); for (int z = 0; z < listNotNullRows.Count; z++) { listChoosen.Add(0); } int index, rowIndex, columnIndex; //在抽样时,目前是随机采样。可以考虑分层抽样,即发生变化的元胞取一半,未变化的取一半。 try { for (int s = 0; s < samplingCellsCount; s++) { index = random.Next(0, listNotNullRows.Count); if (listChoosen[index] == 1) { s--; continue; } rowIndex = listNotNullRows[index]; columnIndex = listNotNullColumns[index]; if ((rowIndex >= structRasterMetaData.RowCount) || (columnIndex >= structRasterMetaData.ColumnCount)) { s--; continue; } if ((trainningStartImage[rowIndex, columnIndex] == -9999f) || (trainningEndImage[rowIndex, columnIndex] == -9999f)) { s--; continue; } tempInputsArray = new float[inputNeuronsCount]; tempOutputsArray = new float[outputNeuronsCount]; //1.输入的列 //1.1先去各个空间变量获取 bool isNull = false; for (int i = 0; i < listSpatialVariables.Count; i++) { tempInputsArray[i] = listSpatialVariables[i][rowIndex, columnIndex]; if (tempInputsArray[i] == -9999f) { isNull = true; break; } } if (isNull) { s--; continue; } //1.2再去获取邻域信息 NeighbourOperator neighbourOperator = new NeighbourOperator(); List <float> listLanduseValues = new List <float>(); for (int j = 0; j < landuseClassificationInfo.AllTypesCount; j++) { listLanduseValues.Add(landuseClassificationInfo.AllTypes[j].LanduseTypeValue); } float[] counts = neighbourOperator.GetNeighbourCount(trainningStartImage, rowIndex, columnIndex, neiWindowSize, structRasterMetaData.RowCount, structRasterMetaData.ColumnCount, landuseClassificationInfo.AllTypesCount, listLanduseValues); for (int z = 0; z < counts.Length; z++) { tempInputsArray[listSpatialVariables.Count + z] = counts[z] / (neiWindowSize * neiWindowSize - 1); } //1.3最后获取土地利用类型 tempInputsArray[inputNeuronsCount - 1] = trainningStartImage[rowIndex, columnIndex]; inputs[s] = tempInputsArray; //2.输出的列。是根据当前元胞在终止土地利用数据中是哪种土地利用类型值,从而形成0,1序列。0代表这种土地利用类型转换的概率为0。 for (int k = 0; k < landuseClassificationInfo.AllTypesCount; k++) { if (trainningEndImage[rowIndex, columnIndex] == landuseClassificationInfo.AllTypes[k].LanduseTypeValue) { tempOutputsArray[k] = 1.0f; break; } } outputs[s] = tempOutputsArray; listChoosen[index] = 1; } } catch (Exception ex) { System.Windows.Forms.MessageBox.Show("ANNSamplingData: " + ex.Message); } ////输出抽样结果数据 //GeneralOpertor.WriteDataFloat(@"C:\DanLi\Download\annSamplingData.txt", inputs, outputs, samplingCellsCount, // inputNeuronsCount, outputNeuronsCount); }