ArcEngine+最短路径分析(C#源码)

更新时间:2023-11-07 18:17:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

using ESRI.ArcGIS.NetworkAnalysis; public class ClsPathFinder {

private IGeometricNetwork m_ipGeometricNetwork; private IMap m_ipMap;

private IPointCollection 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;} get{return m_ipMap;} }

//打开网络

public void OpenFeatureDatasetNetwork(IFeatureDataset FeatureDataset) {

CloseWorkspace();

if (!InitializeNetworkAndMap(FeatureDataset)) Console.WriteLine( \打开出错\ }

//输入点的集合

public IPointCollection StopPoints {

set{m_ipPoints= value;} get{return m_ipPoints;} }

//路径成本

public double PathCost {

get {return m_dblPathCost;} }

//返回路径

public IPolyline PathPolyLine() {

IEIDInfo ipEIDInfo; IGeometry ipGeometry;

if(m_ipPolyline!=null)return m_ipPolyline;

m_ipPolyline = new PolylineClass();

IGeometryCollection ipNewGeometryColl = m_ipPolyline as IGeometryCollection;

ISpatialReference ipSpatialReference = m_ipMap.SpatialReference; IEIDHelper ipEIDHelper = new EIDHelperClass(); ipEIDHelper.GeometricNetwork = m_ipGeometricNetwork; ipEIDHelper.OutputSpatialReference = ipSpatialReference; ipEIDHelper.ReturnGeometries = true;

IEnumEIDInfo ipEnumEIDInfo =

ipEIDHelper.CreateEnumEIDInfo(m_ipEnumNetEID_Edges); int count = ipEnumEIDInfo.Count; ipEnumEIDInfo.Reset(); for(int i =0;i

ipEIDInfo = ipEnumEIDInfo.Next(); ipGeometry = ipEIDInfo.Geometry;

ipNewGeometryColl.AddGeometryCollection( ipGeometry as IGeometryCollection); }

return m_ipPolyline; }

//解决路径

public void SolvePath(string WeightName) { try {

int intEdgeUserClassID; int intEdgeUserID; int intEdgeUserSubID; int intEdgeID;

IPoint ipFoundEdgePoint; double dblEdgePercent; /*C#中使用

*ITraceFlowSolverGEN替代ITraceFlowSolver */

ITraceFlowSolverGEN ipTraceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN;

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 EdgeFlagClass[intCount]; for(int i = 0;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.esriETEdge, out intEdgeUserClassID, out intEdgeUserID,out intEdgeUserSubID);

ipNetFlag.UserClassID = intEdgeUserClassID; ipNetFlag.UserID = intEdgeUserID; ipNetFlag.UserSubID = intEdgeUserSubID;

IEdgeFlag pTemp = (IEdgeFlag)(ipNetFlag as IEdgeFlag); pEdgeFlagList=pTemp; } ipTraceFlowSolver.PutEdgeOrigins(ref pEdgeFlagList); INetSchema ipNetSchema = ipNetwork as INetSchema; INetWeight ipNetWeight = ipNetSchema.get_WeightByName(WeightName); INetSolverWeights ipNetSolverWeights = ipTraceFlowSolver as INetSolverWeights; ipNetSolverWeights.FromToEdgeWeight = ipNetWeight;//开始边线的权重 ipNetSolverWeights.ToFromEdgeWeight = ipNetWeight;//终止边线的权重 object [] vaRes =new object[intCount-1]; //通过findpath得到边线和交汇点的集合 ipTraceFlowSolver.FindPath(esriFlowMethod.esriFMConnected, esriShortestPathObjFn.esriSPObjFnMinSum, out m_ipEnumNetEID_Junctions,out m_ipEnumNetEID_Edges, intCount-1, ref vaRes); //计算成本 m_dblPathCost = 0; for (int i =0;i

本文来源:https://www.bwwdw.com/article/pd62.html

Top