⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 AE+vb来实现的最短路径的实现功能!gis
💻 CS
📖 第 1 页 / 共 5 页
字号:
			//{
			//	this.TOC2D.Refresh();
			//	((IActiveView)this.Map2D.Map).Refresh();
			//}
			//else
			//{
			this.TOC2D.Refresh();
			((IActiveView)this.Map2D.Map).Refresh();
			this.TOC3D.Refresh();
			this.Map3D.SceneGraph.Invalidate(pSA3DLayer as ILayer,true,false);
			this.Map3D.SceneGraph.Invalidate(pPolygonBarrier3DLayer as ILayer,true,false);
			this.Map3D.SceneGraph.Invalidate(pStops3D as ILayer,true,false);
			this.Map3D.SceneGraph.RefreshViewers();
			//}
		}

		private void tabPage1_Click(object sender, System.EventArgs e)
		{
		
		}

		private void BtnGO_Click(object sender, System.EventArgs e)
		{
			try
			{
				this.Cursor = Cursors.WaitCursor;

				this.BtnAnimate.Enabled = false;
				this.LblSlider.Text = "Calculating...";		

				Log("Solving...");
				//Initialize variables
				INALayer pNALayer = m_pAppProperties.NetworkLayer;
				INAContext pNAContext = pNALayer.Context;
				IGPMessages pGPMessages = new GPMessagesClass();
				INASolver pNASolver = pNAContext.Solver;
				//Set impedance
				((INASolverSettings)pNASolver).ImpedanceAttributeName = this.LstImpendances.Text;
				//Set restrictions
				IStringArray pRestrictions = ((INASolverSettings)pNASolver).RestrictionAttributeNames;
				pRestrictions.RemoveAll();
				int iTotalRestrictions = this.ChkRestrictions.CheckedItems.Count;
				for(int i = 0;i<iTotalRestrictions;i++)
				{
					string sRestriction = this.ChkRestrictions.CheckedItems[i].ToString();
					pRestrictions.Add (sRestriction);
				}
				((INASolverSettings)pNASolver).RestrictionAttributeNames = pRestrictions;

				int iTotalIncidents = 0; //Only used if solver is closest facility
				//Update Context
				IDatasetComponent pDSCom = pNAContext.NetworkDataset as IDatasetComponent;
				pNASolver.UpdateContext(pNAContext,pDSCom.DataElement as IDENetworkDataset,pGPMessages);
				switch(this.LstSolvers.Text)
				{
					case "Area of reach":
						INAServiceAreaSolver pSASolver = pNASolver as INAServiceAreaSolver;

						IFeatureClass pFCSA = pNAContext.NAClasses.get_ItemByName("SAPolygons")as IFeatureClass;
						IFeatureLayer pFLayerSA3D = ESRIControlUtils.GetLayerFromMap(this.Map3D,m_sServiceArea3D) as IFeatureLayer;
						IFeatureClass pFCSA3D = pFLayerSA3D.FeatureClass;
						MiscUtils.CleanupFC(pFCSA3D);

						//Set breaks
						IDoubleArray pDoubleArray = new DoubleArrayClass();
						pDoubleArray.Add(Convert.ToDouble(this.SliderAreaOfReach.Value));
						pSASolver.DefaultBreaks = pDoubleArray;
						//Calculate area of reach per each floor
						int iTotalFloors = m_FloorNames.Length;
						IStringArray pSourcesToExclude = new StrArrayClass();  
						for (int i = 0;i<iTotalFloors;i++)
						{
							pSourcesToExclude.RemoveAll();
							for (int i2 = 0;i2<iTotalFloors;i2++)
							{
								if (m_FloorNames[i] != m_FloorNames[i2])
								{
									pSourcesToExclude.Add (m_FloorNames[i2]);
								}
							}
							pSASolver.ExcludeSourcesFromPolygons = pSourcesToExclude;
							pNAContext.Solver.Solve(pNAContext,pGPMessages,null);
							Log("Adding ouput to map...");
							//Flag 2D polygons (using the floor field);
						
							//Add 3D polygons to scene and attribute every polygon with its floor
							MiscUtils.Add3DServiceArea(pFCSA3D,pFCSA,m_FloorNames[i],MiscUtils.GetFloorHeight(m_FloorNames,m_FloorHeights,m_FloorNames[i]));
						}
						this.Map3D.SceneGraph.Invalidate(pFLayerSA3D as ILayer,true,false);
						break;
					default: //Shortest path or Closest Facility
						pNASolver.Solve(pNAContext,pGPMessages,null);
						Log("Adding ouput to map 3D...");
						//Get  Route3D 
						IFeatureLayer pFLayerRoute3D = ESRIControlUtils.GetLayerFromMap(this.Map3D,"Route3D") as IFeatureLayer;
						IFeatureClass pFCRoute3D = pFLayerRoute3D.FeatureClass;

						//Get the traversal result
						INATraversalResultQuery pTraverse = pNAContext.Result as INATraversalResultQuery;
						if (pTraverse==null)return;
						IFeatureClass pFCEdges = pTraverse.get_FeatureClass(ESRI.ArcGIS.Geodatabase.esriNetworkElementType.esriNETEdge);
						//Add 3D features to Route3D
						//MiscUtils.Create3DRoute(pFCRoute3D,pFCEdges,m_FloorNames,m_FloorHeights,pNAContext.NetworkDataset);
						MiscUtils.Create3DRoute(pFCRoute3D,pNALayer);
						
						iTotalIncidents = pFCRoute3D.FeatureCount(null);
						//Add 2D features to Route2D (every segment will have its floor name)
						Log("Adding ouput to map 2D...");
						IFeatureClass pFCRoute2D = ((IFeatureLayer)m_pRoute2DActiveLayer).FeatureClass;
						MiscUtils.Create2DRoutes(pFCRoute2D,pFCEdges,m_FloorNames,m_FloorHeights,pNAContext.NetworkDataset);
						this.Map3D.SceneGraph.Invalidate(pFLayerRoute3D as ILayer,true,false);
						break;
				}
				Log("Refreshing display...");
				//Refresh
				this.Map3D.SceneGraph.RefreshViewers();
				((IActiveView)this.Map2D.Map).Refresh();
				Application.DoEvents();
				Log("");

				if(this.LstSolvers.Text == "Find Closest")
				{
					if (iTotalIncidents < 5)
					{
						System.Threading.ThreadStart pThreadStart = new System.Threading.ThreadStart(this.ConfigureEvacuationObjects);
						System.Threading.Thread pModelThread = new System.Threading.Thread(pThreadStart);
						pModelThread.Priority = System.Threading.ThreadPriority.Highest;
						pModelThread.Start();
					}
					else
					{
						ConfigureEvacuationObjects();
					}
				}

			}
			catch(Exception exx)
			{
				Log(exx.Message + " \n Solve_Click()");
				MessageBox.Show(exx.Message + " \n Solve_Click()");
			}
			finally
			{
				this.Cursor = Cursors.Default;
			}
			
		}

		private void BtnClean_Click(object sender, System.EventArgs e)
		{
			//CleanUp SceneRoutes 
			IFeatureLayer pFLayerRoute3D = ESRIControlUtils.GetLayerFromMap(this.Map3D,"Route3D") as IFeatureLayer;
			IFeatureClass pFCRoute3D = pFLayerRoute3D.FeatureClass;
			MiscUtils.CleanupFC(pFCRoute3D);
			this.Map3D.SceneGraph.Invalidate(pFLayerRoute3D as ILayer,true,false);
			//Cleanup SceneMarkers
			IFeatureLayer pFLayerStops3D = ESRIControlUtils.GetLayerFromMap(this.Map3D,m_sStops3D) as IFeatureLayer;
			IFeatureClass pFCStops3D = pFLayerStops3D.FeatureClass;
			MiscUtils.CleanupFC(pFCStops3D);
			this.Map3D.SceneGraph.Invalidate(pFLayerStops3D as ILayer,true,false);
			// Clean Up 3D Service Areas
			IFeatureLayer pFLayerSA3D = ESRIControlUtils.GetLayerFromMap(this.Map3D,m_sServiceArea3D) as IFeatureLayer;
			MiscUtils.CleanupFC(pFLayerSA3D.FeatureClass);
			this.Map3D.SceneGraph.Invalidate(pFLayerSA3D as ILayer,true,false);
			// Clean up Polygon Barriers
			IFeatureLayer pFLayerPolygonBarriers3D = ESRIControlUtils.GetLayerFromMap(this.Map3D,m_sPolygonBarriers3D) as IFeatureLayer;
			MiscUtils.CleanupFC(pFLayerPolygonBarriers3D.FeatureClass);
			this.Map3D.SceneGraph.Invalidate(pFLayerPolygonBarriers3D as ILayer,true,false);
			// Clean up animations
			MiscUtils.CleanupFC( ((IFeatureLayer)m_AgentAnimation2DLayer).FeatureClass );

			//CleanUp 2D Layers

			//Cleanup 2DRoute 
			IFeatureClass pFCRoute2D = ((IFeatureLayer)m_pRoute2DActiveLayer).FeatureClass;
			MiscUtils.CleanupFC(pFCRoute2D);
			//Cleanup Route NALayer
			INALayer pFLayerRoute = ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sRouteLayer)as INALayer;
			MiscUtils.RemoveNAObjects(pFLayerRoute,"Stops");
			MiscUtils.RemoveNAObjects(pFLayerRoute,"Barriers");
			MiscUtils.RemoveNAObjects(pFLayerRoute ,"Routes");
			//Cleanup Closest Facility NALayer
			INALayer pFLayerCF = ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sClosestFacilityLayer)as INALayer;
			MiscUtils.RemoveNAObjects(pFLayerCF,"Incidents");
			MiscUtils.RemoveNAObjects(pFLayerCF,"Barriers");
			MiscUtils.RemoveNAObjects(pFLayerCF ,"CFRoutes");
			//Cleanup Service Area NALayer
			INALayer pFLayerSA = ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sServiceAreaLayer)as INALayer;
			MiscUtils.RemoveNAObjects(pFLayerSA,"Facilities");
			MiscUtils.RemoveNAObjects(pFLayerSA,"Barriers");
			MiscUtils.RemoveNAObjects(pFLayerSA ,"SAPolygons");

			this.BtnAnimate.Enabled = false;

			((IActiveView)this.Map2D.Map).Refresh();
			this.Map3D.SceneGraph.RefreshViewers();
		}

		private void LstSolvers_SelectedIndexChanged(object sender, System.EventArgs e)
		{
			this.groupClosestFacility.Visible = false;
			this.groupBoxAreaOfReach.Visible = false;

			ILayer pNALayer = null;
			ILayer pEmergencyExits3DLayer = ESRIControlUtils.GetLayerFromMap(this.Map3D, m_EmergencyExits3DLayer);
			pEmergencyExits3DLayer.Visible = false;

			//Switch Layers visibility
			switch(this.LstSolvers.Text)
			{
				case "Route Solver":
					pNALayer = ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sRouteLayer);
					pNALayer.Visible = true;
					ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sClosestFacilityLayer).Visible = false;
					ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sServiceAreaLayer).Visible = false;
					break;
				case "Find Closest":
					pNALayer = ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sClosestFacilityLayer);
					pNALayer.Visible = true;
					ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sRouteLayer).Visible = false;
					ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sServiceAreaLayer).Visible = false;
					pEmergencyExits3DLayer.Visible = true;
					this.groupClosestFacility.Visible = true;
					break;
				case "Area of reach":
					this.groupBoxAreaOfReach.Visible = true;
					this.LblAreaOfReachUnits.Text = this.SliderSeconds.Value.ToString()  + " " + this.SliderAreaOfReach.Value.ToString();
					
					pNALayer = ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sServiceAreaLayer);
					pNALayer.Visible = true;
					ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sRouteLayer).Visible = false;
					ESRIControlUtils.GetLayerFromMap(this.Map2D,m_sClosestFacilityLayer).Visible = false;
					break;
				default: 

					break;
			}
			//Update 'map' Network Layer (custom property)
			m_pAppProperties.NetworkLayer = pNALayer as INALayer;
			this.Map2D.CustomProperty = m_pAppProperties;

			//Cleanup previous outputs and refresh
			BtnClean_Click(sender,e);
		}

		private void SliderSeconds_ValueChanged(object sender, System.EventArgs e)
		{
			if (this.LstSolvers.Text == "Area of Reach")
			{
				this.LblSlider.Text = this.SliderSeconds.Value.ToString() + " " + this.LstImpendances.Text;
			}
			else
			{
				this.LblSlider.Text = MiscUtils.SecondsToString(this.SliderSeconds.Value * 0.75);
			}
		}

		private void SliderSeconds_Scroll(object sender, System.EventArgs e)
		{
		
		}

		private void Map2D_OnKeyDown(object sender, ESRI.ArcGIS.MapControl.IMapControlEvents2_OnKeyDownEvent e)
		{
			if (e.keyCode.ToString()=="83")
			{
				this.BtnGO_Click(null,null);
				return;
			}
			SwitchView( e.keyCode.ToString() == "90");
		}

		private void Map3D_OnKeyDown(object sender, ESRI.ArcGIS.SceneControl.ISceneControlEvents_OnKeyDownEvent e)
		{
			if (e.keyCode.ToString()=="83")
			{
				this.BtnGO_Click(null,null);
				return;
			}
			SwitchView( e.keyCode.ToString() == "90");

		}
		private void TOC3D_OnKeyDown(object sender, ESRI.ArcGIS.TOCControl.ITOCControlEvents_OnKeyDownEvent e)
		{
			if (e.keyCode.ToString()=="83")
			{
				this.BtnGO_Click(null,null);
				return;
			}
			SwitchView( e.keyCode.ToString() == "90");
		}

		private void TOC2D_OnKeyDown(object sender, ESRI.ArcGIS.TOCControl.ITOCControlEvents_OnKeyDownEvent e)
		{
			if (e.keyCode.ToString()=="83")
			{
				this.BtnGO_Click(null,null);
				return;
			}
			SwitchView( e.keyCode.ToString() == "90");
		}

		private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
		{
			if (e.KeyCode.ToString()=="83")
			{
				this.BtnGO_Click(null,null);
				return;
			}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -