ArcEngine+最短路径分析(C源码) 下载本文

内容发布更新时间 : 2024/5/17 14:17:29星期一 下面是文章的全部内容请认真阅读。

ArcEngine 最短路径分析(源码)

using System;

using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.NetworkAnalysis; namespace GisEditor {

///

/// 最短路径分析 ///

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( \打开network出错\ }

//输入点的集合

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;

/*PutEdgeOrigins方法的第二个参数要求是IEdgeFlag类型的数组, * 在VB等其他语言的代码中,只需传人该类型数组的第一个元素即 * 可,但C#中的机制有所不同,需要作出如下修改:使用 * ITraceFlowSolverGEN替代ITraceFlowSolver */

ITraceFlowSolverGEN ipTraceFlowSolver = new TraceFlowSolverClass() ITraceFlowSolverGEN;

INetSolver ipNetSolver = ipTraceFlowSolver as INetSolver; INetwork ipNetwork = m_ipGeometricNetwork.Network; ipNetSolver.SourceNetwork = ipNetwork;

INetElements ipNetElements = ipNetwork as INetElements; int intCount = m_ipPoints.PointCount;

as

//定义一个边线旗数组

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[i]=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,