示例#1
0
 //应急资源到达各个应急处置空间位置的时间进行冒泡法排序
 public void BubbleSort(List <EmergencyDepotResource> emergencydepotresource)
 {
     try
     {
         for (int m = emergencydepotresource.Count - 1; m > 0; m--)
         {
             for (int n = 0; n < m; n++)
             {
                 if (emergencydepotresource[n].DepotArriveDeptTime > emergencydepotresource[n + 1].DepotArriveDeptTime)
                 {
                     EmergencyDepotResource pEmergencyDepotResource = emergencydepotresource[n];
                     emergencydepotresource[n]     = emergencydepotresource[n + 1];
                     emergencydepotresource[n + 1] = pEmergencyDepotResource;
                 }
             }
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message + "\n" + ex.ToString(), "异常");
     }
 }
示例#2
0
        private void button5_Click(object sender, EventArgs e)
        {
            try
            {
                if (comboBox2.Text == "")
                {
                    MessageBox.Show("请输入应急资源仓库数据", "输入应急资源仓库数据", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
                }
                else if (comboBox3.Text == "")
                {
                    MessageBox.Show("请输入污染物扩散模拟数据", "输入污染物扩散模拟数据", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
                }
                else
                {
                    //获取各个应急资源仓库到达应急处置空间位置的时间
                    pFeatureLayerDepot = CDataImport.ImportFeatureLayerFromControltext(comboBox2.Text);
                    String pFeatureFID = "FID=" + Convert.ToString(Convert.ToInt32(comboBox4.Text) - 1);
                    EmergencySpaceSelectionDijkstra pEmergencySpaceSelection = new EmergencySpaceSelectionDijkstra();
                    List <Result> resultlist = new List <Result>();
                    resultlist = pEmergencySpaceSelection.DepotToDest(pFeatureLayerDepot, pFeatureLayerDept, pFeatureFID);

                    //判断应急资源需求的种类
                    int EmergencyNumber = 0;
                    if (checkBox1.Checked == true)
                    {
                        EmergencyNumber++;
                    }
                    for (int i = 0; i < pCheckBox.Length; i++)
                    {
                        if (pCheckBox[i].Checked == true)
                        {
                            EmergencyNumber++;
                        }
                    }

                    //获取应急资需求的名称
                    string[] EmergencyVarietyName      = new string[EmergencyNumber];
                    int      EmergencyVarietyNameIndex = 0;
                    if (checkBox1.Checked == true)
                    {
                        int EmergencyVarietyIndex = label8.Text.LastIndexOf(":");
                        EmergencyVarietyName[EmergencyVarietyNameIndex] = label8.Text.Substring(0, EmergencyVarietyIndex);
                        EmergencyVarietyNameIndex++;
                    }
                    for (int j = 0; j < pLabel.Length; j++)
                    {
                        if (pCheckBox[j].Checked == true)
                        {
                            int EmergencyVarietyIndex = pLabel[j].Text.LastIndexOf(":");
                            EmergencyVarietyName[EmergencyVarietyNameIndex] = pLabel[j].Text.Substring(0, EmergencyVarietyIndex);
                            EmergencyVarietyNameIndex++;
                        }
                    }

                    //获取应急处置空间位置应急资源需求
                    pEmergencyDeptResource = new List <EmergencyDeptResource>();
                    int EmergencyDemandResourceNumber = 0;
                    if (checkBox1.Checked == true)
                    {
                        EmergencyDeptResource emergencydeptresource = new EmergencyDeptResource();
                        int EmergencyDemandResourceIndex            = label8.Text.LastIndexOf(":");
                        emergencydeptresource.EmergencyDemandResourceName   = EmergencyVarietyName[EmergencyDemandResourceNumber];
                        emergencydeptresource.EmergencyDemandResourceNumber = Convert.ToDouble(label8.Text.Substring(EmergencyDemandResourceIndex + 1));
                        pEmergencyDeptResource.Add(emergencydeptresource);
                        EmergencyDemandResourceNumber++;
                    }
                    for (int k = 0; k < pLabel.Length; k++)
                    {
                        if (pCheckBox[k].Checked == true)
                        {
                            EmergencyDeptResource emergencydeptresource = new EmergencyDeptResource();
                            int EmergencyDemandResourceIndex            = pLabel[k].Text.LastIndexOf(":");
                            emergencydeptresource.EmergencyDemandResourceName   = EmergencyVarietyName[EmergencyDemandResourceNumber];
                            emergencydeptresource.EmergencyDemandResourceNumber = Convert.ToDouble(pLabel[k].Text.Substring(EmergencyDemandResourceIndex + 1));
                            pEmergencyDeptResource.Add(emergencydeptresource);
                            EmergencyDemandResourceNumber++;
                        }
                    }


                    //获取应急资源仓库存储的的应急资源
                    IFeatureClass  pFeatureClassDepot    = pFeatureLayerDepot.FeatureClass;
                    int            DepotNumber           = pFeatureClassDepot.FeatureCount(null);
                    IFeatureCursor pFeatureCursorDepot   = pFeatureClassDepot.Search(null, false);
                    IFeature       pFeatureDepot         = pFeatureCursorDepot.NextFeature();
                    int            DepotNumberArriveDept = 0;
                    pEmergencyDepotResource = new List <EmergencyDepotResource>();
                    while (pFeatureDepot != null)
                    {
                        EmergencyDepotResource emergencydepotresource = new EmergencyDepotResource();
                        emergencydepotresource.DepotName           = Convert.ToString(pFeatureDepot.get_Value(pFeatureDepot.Fields.FindField("Name")));
                        emergencydepotresource.DepotArriveDeptTime = Math.Round(Convert.ToDouble(resultlist[DepotNumberArriveDept].WeightTime), 4);
                        DepotNumberArriveDept++;
                        emergencydepotresource.EmergencyVarietyNameNumber = new double[EmergencyNumber];
                        emergencydepotresource.EmergencyVarietyName       = new string[EmergencyNumber];
                        for (int k = 0; k < EmergencyNumber; k++)
                        {
                            emergencydepotresource.EmergencyVarietyName[k]       = EmergencyVarietyName[k];
                            emergencydepotresource.EmergencyVarietyNameNumber[k] = Convert.ToDouble(pFeatureDepot.get_Value(pFeatureDepot.Fields.FindField(EmergencyVarietyName[k])));
                        }
                        pEmergencyDepotResource.Add(emergencydepotresource);
                        pFeatureDepot = pFeatureCursorDepot.NextFeature();
                    }



                    //获取污染物扩散到达应急处置空间位置的时间
                    double        pollutionArriveTime = 0.0;
                    IFeatureClass pFeatureClassDept   = pFeatureLayerDept.FeatureClass;
                    IQueryFilter  pQueryFilterDept    = new QueryFilterClass();
                    pQueryFilterDept.WhereClause = "FID=" + Convert.ToString(Convert.ToInt32(comboBox4.Text) - 1);
                    IFeatureCursor pFeatureCursorDept = pFeatureClassDept.Search(pQueryFilterDept, false);
                    IFeature       pFeatureDept       = pFeatureCursorDept.NextFeature();
                    IPoint         point = new PointClass();
                    while (pFeatureDept != null)
                    {
                        point        = pFeatureDept.Shape as IPoint;
                        pFeatureDept = pFeatureCursorDept.NextFeature();
                    }
                    double X = 0.0, Y = 0.0;
                    X = Math.Round(point.X, 4);
                    Y = Math.Round(point.Y, 4);
                    int          column = 0, row = 0;
                    IRasterLayer pRasterLayer = CDataImport.ImportRasterLayerFromControltext(comboBox3.Text);
                    RasterManagement.XYconvertNumber(pRasterLayer, X, Y, ref column, ref row);
                    pollutionArriveTime = Convert.ToDouble(RasterManagement.GetPixelValue(pRasterLayer, 0, column, row));

                    //读取构架应急工程措施的时间
                    double SetProjectTime = Math.Round(Convert.ToDouble(textBox1.Text), 4);

                    //对各个应急资源仓库到达应急处置空间位置的时间进行排序
                    BubbleSort(pEmergencyDepotResource);

                    //进行应急资源调度
                    List <EmergencyResourceResult> pEergencyResourceResult = new List <EmergencyResourceResult>();
                    for (int k = 0; k < DepotNumber; k++)                                                          //按照到达应急处置空间位置的应急仓库进行排序
                    {
                        if (pEmergencyDepotResource[k].DepotArriveDeptTime + SetProjectTime < pollutionArriveTime) //判断到达应急处置空间位置与构建工程时间之和小于污染物扩散到达时间
                        {
                            //创建应急资源调度的结果
                            EmergencyResourceResult emergencyresourceresult = new EmergencyResourceResult();
                            emergencyresourceresult.EmergencyResourceName   = new string[pEmergencyDepotResource[k].EmergencyVarietyName.Length];
                            emergencyresourceresult.EmergencyResourceNumber = new double[pEmergencyDepotResource[k].EmergencyVarietyNameNumber.Length];
                            for (int l = 0; l < pEmergencyDeptResource.Count; l++)                               //应急处置空间位置需要的应急资源种类
                            {
                                for (int h = 0; h < pEmergencyDepotResource[k].EmergencyVarietyName.Length; h++) //对应急资源仓库的应急资源名称进行查找和应急处置空间位置名称相同
                                {
                                    if (pEmergencyDepotResource[k].EmergencyVarietyName[h] == pEmergencyDeptResource[l].EmergencyDemandResourceName && pEmergencyDepotResource[k].EmergencyVarietyNameNumber[h] > 0)
                                    {
                                        emergencyresourceresult.DepotName = pEmergencyDepotResource[k].DepotName;
                                        emergencyresourceresult.EmergencyResourceArriveTime = pEmergencyDepotResource[k].DepotArriveDeptTime;
                                        if (pEmergencyDeptResource[l].EmergencyDemandResourceNumber <= pEmergencyDepotResource[k].EmergencyVarietyNameNumber[h])
                                        {
                                            emergencyresourceresult.EmergencyResourceName[l]          = pEmergencyDeptResource[l].EmergencyDemandResourceName;
                                            emergencyresourceresult.EmergencyResourceNumber[l]        = pEmergencyDeptResource[l].EmergencyDemandResourceNumber;
                                            pEmergencyDepotResource[k].EmergencyVarietyNameNumber[h] -= pEmergencyDeptResource[l].EmergencyDemandResourceNumber;
                                            pEmergencyDepotResource[k].EmergencyDepotBool             = true;
                                            pEmergencyDeptResource[l].EmergencyDemandResourceNumber  -= pEmergencyDeptResource[l].EmergencyDemandResourceNumber;
                                        }
                                        else
                                        {
                                            emergencyresourceresult.EmergencyResourceName[l]         = pEmergencyDeptResource[l].EmergencyDemandResourceName;
                                            emergencyresourceresult.EmergencyResourceNumber[l]       = pEmergencyDepotResource[k].EmergencyVarietyNameNumber[h];
                                            pEmergencyDeptResource[l].EmergencyDemandResourceNumber -= pEmergencyDepotResource[k].EmergencyVarietyNameNumber[l];
                                            pEmergencyDepotResource[k].EmergencyVarietyNameNumber[l] = 0.0;
                                            pEmergencyDepotResource[k].EmergencyDepotBool            = true;
                                        }
                                    }
                                }
                            }


                            //将有应急资源仓库调度资源的显示在ListBox中
                            for (int f = 0; f < emergencyresourceresult.EmergencyResourceNumber.Length; f++)
                            {
                                if (emergencyresourceresult.EmergencyResourceNumber[f] > 0)
                                {
                                    listBox1.Items.Add(pEmergencyDepotResource[k].DepotName);
                                    break;
                                }
                            }


                            //将应急资源调度的结果显示在ListBox
                            for (int a = 0; a < emergencyresourceresult.EmergencyResourceNumber.Length; a++)
                            {
                                if (emergencyresourceresult.EmergencyResourceNumber[a] > 0)
                                {
                                    listBox1.Items.Add(emergencyresourceresult.EmergencyResourceName[a] + ":" + Convert.ToString(emergencyresourceresult.EmergencyResourceNumber[a]));
                                }
                            }
                        }
                        else
                        {
                            //listBox1.Items.Add("其他的应急资源仓库的应急资源无法到达应急处置空间位置!");
                            break;
                        }

                        //如果应急处置空间位置的应急资源满足,则跳出应急资源调度过程
                        int DeptVarietyNumber = 0;
                        for (int b = 0; b < pEmergencyDeptResource.Count; b++)
                        {
                            if (pEmergencyDeptResource[b].EmergencyDemandResourceNumber == 0)
                            {
                                DeptVarietyNumber++;
                                continue;
                            }
                        }
                        if (DeptVarietyNumber == pEmergencyDeptResource.Count)
                        {
                            break;
                        }
                    }

                    //刷新应急处置点信息情况
                    for (int c = 0; c < pEmergencyDeptResource.Count; c++)
                    {
                        for (int d = 0; d < pLabel.Length; d++)
                        {
                            string VarietyName = pLabel[d].Text.Substring(0, pLabel[d].Text.LastIndexOf(":"));
                            if (VarietyName == pEmergencyDeptResource[c].EmergencyDemandResourceName)
                            {
                                pLabel[d].Text = pEmergencyDeptResource[c].EmergencyDemandResourceName + ":" + pEmergencyDeptResource[c].EmergencyDemandResourceNumber.ToString();
                                break;
                            }
                        }
                    }
                    groupBox4.Enabled = true;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "\n" + ex.ToString(), "异常");
            }
        }