《2022年最短路径分析 .pdf》由会员分享,可在线阅读,更多相关《2022年最短路径分析 .pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、最短路径分析(源码)using System; ArcEngine using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.NetworkAnalysis;/12 namespace GisEditor / / 最短路径分析/ public class ClsPathFinder private IGeometricNetwork m_ipGeometricNetwork; private IMap m_ipMap; private IPointC
2、ollection m_ipPoints; private IPointToEID m_ipPointToEID; private double m_dblPathCost =0; private IEnumNetEID m_ipEnumNetEID_Junctions; private IEnumNetEID m_ipEnumNetEID_Edges; private IPolyline m_ipPolyline; #region Public Function /返回和设置当前地图 public IMap SetOrGetMap set m_ipMap = value; getreturn
3、 m_ipMap; /打开几何数据集的网络工作空间 public void OpenFeatureDatasetNetwork(IFeatureDataset FeatureDataset) CloseWorkspace(); if (!InitializeNetworkAndMap(FeatureDataset) Console.WriteLine( 打开 network 出错); /输入点的集合 public IPointCollection StopPoints setm_ipPoints= value; getreturn m_ipPoints; 名师资料总结 - - -精品资料欢迎下
4、载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - /路径成本 public double PathCost get return m_dblPathCost; /返回路径的几何体 public IPolyline PathPolyLine() IEIDInfo ipEIDInfo; IGeometry ipGeometry; if(m_ipPolyline!=null)return m_ipPolyline; m_ipPolyline = new PolylineCl
5、ass(); IGeometryCollection ipNewGeometryColl = m_ipPolyline as IGeometryCollection; ISpatialReference ipSpatialReference = m_ipMap.SpatialReference; IEIDHelper ipEIDHelper = new EIDHelperClass(); ipEIDHelper.GeometricNetwork = m_ipGeometricNetwork; ipEIDHelper.OutputSpatialReference = ipSpatialRefer
6、ence; ipEIDHelper.ReturnGeometries = true; IEnumEIDInfo ipEnumEIDInfo = ipEIDHelper.CreateEnumEIDInfo(m_ipEnumNetEID_Edges); int count = ipEnumEIDInfo.Count; ipEnumEIDInfo.Reset(); for(int i =0;icount;i+) ipEIDInfo = ipEnumEIDInfo.Next(); ipGeometry = ipEIDInfo.Geometry; ipNewGeometryColl.AddGeometr
7、yCollection( ipGeometry as IGeometryCollection); return m_ipPolyline; /解决路径 public void SolvePath(string WeightName) try 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - int intEdgeUserClassID; int intEdgeUserID; int intEdgeUserSubID; int in
8、tEdgeID; IPoint ipFoundEdgePoint; double dblEdgePercent; /*PutEdgeOrigins方法的第二个参数要求是IEdgeFlag 类型的数组 , * 在 VB等其他语言的代码中,只需传人该类型数组的第一个元素即 * 可,但 C# 中的机制有所不同,需要作出如下修改:使用 * ITraceFlowSolverGEN替代 ITraceFlowSolver */ ITraceFlowSolverGEN ipTraceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN;
9、INetSolver ipNetSolver = ipTraceFlowSolver as INetSolver; INetwork ipNetwork = m_ipGeometricNetwork.Network; ipNetSolver.SourceNetwork = ipNetwork; INetElements ipNetElements = ipNetwork as INetElements; int intCount = m_ipPoints.PointCount; /定义一个边线旗数组 IEdgeFlag pEdgeFlagList = new EdgeFlagClassintC
10、ount; for(int i = 0;iintCount ;i+) INetFlag ipNetFlag = new EdgeFlagClass()as INetFlag; IPoint ipEdgePoint = m_ipPoints.get_Point(i); /查找输入点的最近的边线 m_ipPointToEID.GetNearestEdge(ipEdgePoint, out intEdgeID,out ipFoundEdgePoint, out dblEdgePercent); ipNetElements.QueryIDs( intEdgeID, esriElementType.es
11、riETEdge, out intEdgeUserClassID, out intEdgeUserID,out intEdgeUserSubID); ipNetFlag.UserClassID = intEdgeUserClassID; ipNetFlag.UserID = intEdgeUserID; ipNetFlag.UserSubID = intEdgeUserSubID; IEdgeFlag pTemp = (IEdgeFlag)(ipNetFlag as IEdgeFlag); pEdgeFlagListi=pTemp; ipTraceFlowSolver.PutEdgeOrigi
12、ns(ref pEdgeFlagList); INetSchema ipNetSchema = ipNetwork as INetSchema; INetWeight ipNetWeight = ipNetSchema.get_WeightByName(WeightName); INetSolverWeights ipNetSolverWeights = ipTraceFlowSolver as INetSolverWeights; ipNetSolverWeights.FromToEdgeWeight = ipNetWeight;/开始边线的权名师资料总结 - - -精品资料欢迎下载 - -
13、 - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - - - - - 重 ipNetSolverWeights.ToFromEdgeWeight = ipNetWeight;/终止边线的权重 object vaRes =new objectintCount-1; /通过 findpath得到边线和交汇点的集合 ipTraceFlowSolver.FindPath(esriFlowMethod.esriFMConnected, esriShortestPathObjFn.esriSPObjFnMin
14、Sum, out m_ipEnumNetEID_Junctions,out m_ipEnumNetEID_Edges, intCount-1, ref vaRes); /计算元素成本 m_dblPathCost = 0; for (int i =0;ivaRes.Length;i+) double m_Va =(double) vaResi; m_dblPathCost = m_dblPathCost + m_Va; m_ipPolyline = null; catch(Exception ex) Console.WriteLine(ex.Message); #endregion #regio
15、n Private Function /初始化几何网络和地图 private bool InitializeNetworkAndMap(IFeatureDataset FeatureDataset) IFeatureClassContainer ipFeatureClassContainer; IFeatureClass ipFeatureClass ; IGeoDataset ipGeoDataset; ILayer ipLayer ; IFeatureLayer ipFeatureLayer; IEnvelope ipEnvelope, ipMaxEnvelope ; double dbl
16、SearchTol; INetworkCollection ipNetworkCollection = FeatureDataset as INetworkCollection; int count = ipNetworkCollection.GeometricNetworkCount; /获取第一个几何网络工作空间 m_ipGeometricNetwork = ipNetworkCollection.get_GeometricNetwork(0); INetwork ipNetwork = m_ipGeometricNetwork.Network; 名师资料总结 - - -精品资料欢迎下载
17、- - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - if(m_ipMap!=null) m_ipMap = new MapClass(); ipFeatureClassContainer = m_ipGeometricNetwork as IFeatureClassContainer; count = ipFeatureClassContainer.ClassCount; for(int i =0;icount;i+) ipFeatureClass = ipFeatureC
18、lassContainer.get_Class(i); ipFeatureLayer = new FeatureLayerClass(); ipFeatureLayer.FeatureClass = ipFeatureClass; m_ipMap.AddLayer( ipFeatureLayer); count = m_ipMap.LayerCount; ipMaxEnvelope = new EnvelopeClass(); for(int i =0;i dblHeight) dblSearchTol = dblWidth / 100; else dblSearchTol = dblHeig
19、ht / 100; m_ipPointToEID.SnapTolerance = dblSearchTol; return true ; /关闭工作空间 private void CloseWorkspace() m_ipGeometricNetwork = null; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - m_ipPoints = null; m_ipPointToEID = null; m_ipEnumNetEID
20、_Junctions = null; m_ipEnumNetEID_Edges = null; m_ipPolyline = null; #endregion 备注:在调用该类时的次序:ClsPathFinder m_ipPathFinder; if(m_ipPathFinder=null)/打开几何网络工作空间 m_ipPathFinder = new ClsPathFinder(); ipMap = this.m_ActiveView.FocusMap; ipLayer = ipMap.get_Layer(0); ipFeatureLayer = ipLayer as IFeatureLa
21、yer; ipFDB = ipFeatureLayer.FeatureClass.FeatureDataset; m_ipPathFinder.SetOrGetMap = ipMap; m_ipPathFinder.OpenFeatureDatasetNetwork(ipFDB); private void ViewMap_OnMouseDown(object sender, ESRI.ArcGIS.MapControl.IMapControlEvents2_OnMouseDownEvent e)/获取地图上鼠标输入的点 IPoint ipNew ; if( m_ipPoints=null)
22、m_ipPoints = new MultipointClass(); m_ipPathFinder.StopPoints = m_ipPoints; ipNew = ViewMap.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x,e.y); object o = Type.Missing; m_ipPoints.AddPoint(ipNew,ref o,ref o); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - m_ipPathFinder.SolvePath(Weight);/先解析路径IPolyline ipPolyResult = m_ipPathFinder.PathPolyLine();/最后返回最短路径名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -