ArcEngine几何网络分析(整理-最短路径)

  这是在平时学习的时候,对几何网络分析相关资料的整理,中间有不对的地方,希望各位给予指出,共同学习。

    几何网络分手是网络分析的一种,是用来解决现实世界中的水网、煤气网、电网等设施网络,因此几何网络也称为设施网络。几何网络是有向网络,一网络中的流通资源是无法改变连通性或方向的,只能按照建立几何网络时设立的规则进行。主要可以用来实现:1.寻找连通或不连通的管线。2上/下游追踪。3寻找环路。4寻找通路。5 爆管分析。      

     Geometric NetWork(几何网络)是由edge和junctions两部分组成,并且两部分都是由数据库中的FeatureClass组成。形成网络分析必须是数据库中的数据集,不可以是shapefile文件。另外edge是有两种类型:第一是simple edge,连接两个junctions,每一端各连接一个,第二是complex edge,每个edge可以连接多个junctions,端点可以连接两个或更多个junctions,也可以在中间连接junctions。几何网络分源和汇,源表示从该点流出,汇表示流入改点,在几何网络中只需要设置一个源或汇即可,否在会出现不能确定流向的区域。在创建几何网络时会在edge中创建enabled字段用来表示该edge是否可以流通。还可以创建两种连通规则即edge-junctions和edge-edge。

    下面来看一下几何网络的构建。

首先需要建立一个数据集,在数据集中新建两个要素类分别用来组成(edge和junctions),然后右击数据集点击新建“几何网络”后,如下图:

                                                       ArcEngine几何网络分析(整理-最短路径)_第1张图片

然后点击”下一步“,如图 :

                                                      ArcEngine几何网络分析(整理-最短路径)_第2张图片

     输入几何网络的名称,然后选择是否指定容差内捕捉,因为在进行矢量化时可能会造成线的末端和节点不能完全重合,可能造成不匹配,不匹配则生成的几何网络便会出现问题,设置容差之后表示系统可以在容差范围内的对要素进行移动。然后点击下一步。

                                                   ArcEngine几何网络分析(整理-最短路径)_第3张图片

  选择用来构建几何网络的要素。

                                                      ArcEngine几何网络分析(整理-最短路径)_第4张图片

下一步,如图:

                                                      ArcEngine几何网络分析(整理-最短路径)_第5张图片

设置源和汇以便来设置网络的流向,一般选择是。

                                                      ArcEngine几何网络分析(整理-最短路径)_第6张图片

设置几何网络中的权重,在这里我们以length为权重,点击下一步。

                                                     ArcEngine几何网络分析(整理-最短路径)_第7张图片

新建几何网络数据完成。

     到这里几何网络数据集其实已经建成了,但是还需要设置源汇,点击开始编辑,然后将AncillaryRole中需要设置成源或汇的设置好,然后点击保存,,停止编辑,这样几何网络的数据集的源汇便设计好了,紧接着再点击编辑,然后点击几何网络分析中的设置流向、显示箭头,即可。如下图:

                             ArcEngine几何网络分析(整理-最短路径)_第8张图片

     在创建完成几何网络之后,需要用编程实现相应的功能,在几何网络的分析中我们要经过以下几个步骤:1打开几何网络数据集2.建立边或节点的旗帜(这两中方式在最后的分析结果略有不同,这个对于初学者来说需要注意)3.设置障碍点(在爆管分析中用到)4.设置权重5.分析得到的边或点的EID 6.最后得到相应的要素进行处理显示。

如:最短路径分析(建立节点的旗帜):

     第一步:打开几何网络数据集。

      IWorkspaceFactroy pWF=new FileGDBWorkspaceFactoryClass();

      IWorkspace pW=pWF.OpenFromFile("数据库的存储路径");

      IFeatureDataset pFeaDataset=(pW as IFeatureWorkspace).OpenFeatureDataset("geometics") ;

      INetworkCollection pNetColl=pFeaDataset  as INetworkCollection; //获取数据库中的网络数据集

      IGeometricNetwork pGeometricNet=pNetColl.get_GeometricNetwork(0);//由于数据集中只有一个网络数据集,因此获取第一个

     第二步:建立节点的旗帜

     int intJunctionUserClassID;

     int intJunctionUserID;

     int intJunctionUserSubID;

     int intJunctionID;

     IPoint pFoundJunctionPoint;

    //ITraceFlowSolverGEN这个接口是几何网络分析中的重要接口,大部分的功能都是由此接口完成,现在需要获取逻辑网络,对逻辑网络进行设置。

     ITraceFlowSolverGEN pTraceFlowSolverG = new TraceFlowSolverClass() as ITraceFlowSolverGEN;    

     INetSolver  pNetSolver=pTraceFlowSolverG as INetSolver;

     INetWork pNetWork=pGeometricNet.NetWork;

     pNetSolver.SourceNetwork = pNetwork;

      INetElements pNetElements = pNetwork as INetElements; 

     int pCount=pCollection.PointCount;//获取输入点的个数,来建立旗帜的数组

     IJunctionFlag[] pJunctionFlag=new JunctionFlagClass[pCount];

     IPointToEID pPointToEID=new PointToEIDClass();

     pPointToEID.SourceMap=pMap;

     pPointToEID.GeometricNetWork=pGeometricNet;

     pPointToEID.SnapTolerance =pDisc;

   第三  获取节点的旗帜

      for (int i = 0; i < pCount; i++)

       {

                 INetFlag pNetFlag = new JunctionFlagClass() as INetFlag;

                 IPoint pEdgePoint = _pPoints.get_Point(i); //查找输入点的最近的节点

                 pPointToEID.GetNearestJunction(pEdgePoint, out intEdgeID, out pFoundEdgePoint);

                pNetElements.QueryIDs(intEdgeID, esriElementType.esriETJunction,out intEdgeUserClassID,out intEdgeUserID,out intEdgeUserSubID);

                pNetFlag.UserClassID = intEdgeUserClassID; pNetFlag.UserID = intEdgeUserID;

                pNetFlag.UserSubID = intEdgeUserSubID;

                IJunctionFlag pJuncF= (IJunctionFlag)(pNetFlag as IJunctionFlag);

               pJunctionFlag[i] = pJuncF;

        }

    pTraceFlowSolverG.PutJunctionOrigins(ref pJunctionFlag);

  第四 设置边线权重,也可以设置点的权重

    INetSchema pNetSchema = pNetwork as INetSchema;

    INetWeight pNetWeight = pNetSchema.get_WeightByName("length");  

     INetSolverWeightsGEN   pNetSolverWeightsG   =pTraceFlowSolverG  as INetSolverWeightsGEN;

     pNetSolverWeightsG.FromToEdgeWeight = pNetWeight;//开始边线的权重   

     pNetSolverWeightsG.ToFromEdgeWeight = pNetWeight;//终止边线的权重

   第五 获取边线和交汇点的集合

    pTraceFlowSolver.FindPath(esriFlowMethod.esriFMConnected, esriShortestPathObjFn.esriSPObjFnMinSum,   out pEnumNetEID_Junctions, out pEnumNetEID_Edges, pCount - 1, ref pRes);//pRes用来获取每条记录的权重数组

   第六 获取最短线路

     IGeometryCollection pGeometryCollection=pPolyline as IGeometryCollection;

     ISpatialReference pSpatialReference = pMap.SpatialReference;

     IEIDHelper pEIDHelper = new EIDHelperClass();

     pEIDHelper.GeometricNetwork = _pGeometricNetwork;

     pEIDHelper.OutputSpatialReference = pSpatialReference;

     pEIDHelper.ReturnGeometries = true;

     IEnumEIDInfo pEnumEIDInfo = pEIDHelper.CreateEnumEIDInfo(pEnumNetEID_Edges);

     int Count = pEnumEIDInfo.Count;

     pEnumEIDInfo.Reset();

     for (int i = 0; i < Count; i++)

        {

            IEIDInfo pEIDInfo = pEnumEIDInfo.Next();

            IGeometry pGeometry = pEIDInfo.Geometry;

            pGeometryCollection.AddGeometryCollection(pGeometry as IGeometryCollection);

       }

至此几何网络分析的最短路径完成,这其中关键的是ITraceFlowSolverGEN接口。

你可能感兴趣的:(gis)