/// <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);
            }
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        /// <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);
        }
Exemple #8
0
        /// <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);
        }