Example #1
0
 //解决路径
 public void SolvePath(string WeightName)
 {
     try
     {
         int    intEdgeUserClassID;
         int    intEdgeUserID;
         int    intEdgeUserSubID;
         int    intEdgeID;
         IPoint ipFoundEdgePoint;
         double dblEdgePercent;
         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;//这里的points有值吗?
         //定义一个边线旗数组
         IEdgeFlag[] pEdgeFlagList = new EdgeFlagClass[intCount];
         for (int i = 0; i < intCount; 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,
                                    out m_ipEnumNetEID_Junctions, out m_ipEnumNetEID_Edges, intCount - 1, ref vaRes);
         //计算元素成本
         m_dblPathCost = 0;
         for (int i = 0; i < vaRes.Length; i++)
         {
             double m_Va = (double)vaRes[i];//我修改过
             m_dblPathCost = m_dblPathCost + m_Va;
         }
         m_ipPolyline = null;
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.Message);
     }
 }
Example #2
0
        public void SolvePath(string WeightName)
        {
            int num;
            ITraceFlowSolver solver  = (ITraceFlowSolver) new TraceFlowSolverClass();
            INetSolver       solver2 = (INetSolver)solver;
            INetwork         network = this.m_ipGeometricNetwork.Network;

            solver2.SourceNetwork = network;
            INetElements elements = (INetElements)network;

            IEdgeFlag[] edgeOrigins = new IEdgeFlag[this.m_ipPoints.PointCount + 1];
            for (num = 0; num < this.m_ipPoints.PointCount; num++)
            {
                IPoint   point;
                int      num2;
                double   num3;
                int      num4;
                int      num5;
                int      num6;
                INetFlag flag       = new EdgeFlagClass();
                IPoint   inputPoint = this.m_ipPoints.get_Point(num);
                this.m_ipPointToEID.GetNearestEdge(inputPoint, out num2, out point, out num3);
                elements.QueryIDs(num2, esriElementType.esriETEdge, out num4, out num5, out num6);
                flag.UserClassID = num4;
                flag.UserID      = num5;
                flag.UserSubID   = num6;
                edgeOrigins[num] = (IEdgeFlag)flag;
            }
            (solver as ITraceFlowSolverGEN).PutEdgeOrigins(ref edgeOrigins);
            try
            {
                INetSolverWeights weights = (INetSolverWeights)solver;
                weights.JunctionWeight   = this.JunctionWeight;
                weights.FromToEdgeWeight = this.FromToEdgeWeight;
                weights.ToFromEdgeWeight = this.ToFromEdgeWeight;
            }
            catch
            {
            }
            object[] segmentCosts = new object[this.m_ipPoints.PointCount];
            (solver as ITraceFlowSolverGEN).FindPath(esriFlowMethod.esriFMConnected,
                                                     esriShortestPathObjFn.esriSPObjFnMinSum, out this.m_ipEnumNetEID_Junctions,
                                                     out this.m_ipEnumNetEID_Edges, this.m_ipPoints.PointCount - 1, ref segmentCosts);
            this.m_dblPathCost = 0.0;
            for (num = 0; num < segmentCosts.Length; num++)
            {
                this.m_dblPathCost += (double)segmentCosts[num];
            }
            this.m_ipPolyline = null;
        }
Example #3
0
        private void SolvePath(string weightName)
        {
            //创建ITraceFlowSolverGEN
            ITraceFlowSolverGEN pTraceFlowSolverGEN = new TraceFlowSolverClass();
            INetSolver          pNetSolver          = pTraceFlowSolverGEN as INetSolver;
            //初始化用于路径计算的Network
            INetwork pNetWork = mGeometricNetwork.Network;

            pNetSolver.SourceNetwork = pNetWork;

            //获取分析经过的点的个数
            int intCount = mPointCollectionNet.PointCount;

            if (intCount < 1)
            {
                return;
            }


            INetFlag pNetFlag;

            //用于存储路径计算得到的边
            IEdgeFlag[] pEdgeFlags = new IEdgeFlag[intCount];


            IPoint pEdgePoint = new PointClass();
            int    intEdgeEID;
            IPoint pFoundEdgePoint;
            double dblEdgePercent;

            //用于获取几何网络元素的UserID, UserClassID,UserSubID
            INetElements pNetElements = pNetWork as INetElements;
            int          intEdgeUserClassID;
            int          intEdgeUserID;
            int          intEdgeUserSubID;

            for (int i = 0; i < intCount; i++)
            {
                pNetFlag = new EdgeFlagClass();
                //获取用户点击点
                pEdgePoint = mPointCollectionNet.get_Point(i);
                //获取距离用户点击点最近的边
                mPointToEID.GetNearestEdge(pEdgePoint, out intEdgeEID, out pFoundEdgePoint, out dblEdgePercent);
                if (intEdgeEID <= 0)
                {
                    continue;
                }
                //根据得到的边查询对应的几何网络中的元素UserID, UserClassID,UserSubID
                pNetElements.QueryIDs(intEdgeEID, esriElementType.esriETEdge,
                                      out intEdgeUserClassID, out intEdgeUserID, out intEdgeUserSubID);
                if (intEdgeUserClassID <= 0 || intEdgeUserID <= 0)
                {
                    continue;
                }

                pNetFlag.UserClassID = intEdgeUserClassID;
                pNetFlag.UserID      = intEdgeUserID;
                pNetFlag.UserSubID   = intEdgeUserSubID;
                pEdgeFlags[i]        = pNetFlag as IEdgeFlag;
            }
            //设置路径求解的边
            pTraceFlowSolverGEN.PutEdgeOrigins(ref pEdgeFlags);

            //路径计算权重
            INetSchema pNetSchema = pNetWork as INetSchema;
            INetWeight pNetWeight = pNetSchema.get_WeightByName(weightName);

            if (pNetWeight == null)
            {
                return;
            }

            //设置权重,这里双向的权重设为一致
            INetSolverWeights pNetSolverWeights = pTraceFlowSolverGEN as INetSolverWeights;

            pNetSolverWeights.ToFromEdgeWeight = pNetWeight;
            pNetSolverWeights.FromToEdgeWeight = pNetWeight;

            object[] arrResults = new object[intCount - 1];
            //执行路径计算
            pTraceFlowSolverGEN.FindPath(esriFlowMethod.esriFMConnected, esriShortestPathObjFn.esriSPObjFnMinSum,
                                         out mEnumNetEID_Junctions, out mEnumNetEID_Edges, intCount - 1, ref arrResults);

            //获取路径计算总代价(cost)
            mdblPathCost = 0;
            for (int i = 0; i < intCount - 1; i++)
            {
                mdblPathCost += (double)arrResults[i];
            }
        }
Example #4
0
        private bool slovePath()
        {
            try
            {
                double costLength = 0;
                m_ipPointToEID                  = new PointToEIDClass();
                m_ipPointToEID.SourceMap        = m_HookHelper.ActiveView.FocusMap;
                m_ipPointToEID.GeometricNetwork = m_ipGeometricNetwork;
                m_ipPointToEID.SnapTolerance    = m_HookHelper.ActiveView.Extent.Envelope.Width / 100;


                INetwork ipNetwork;

                INetElements ipNetElements;
                INetFlag     ipNetFlag;

                //IEdgeFlag ipEdgeFlag;

                IEdgeFlag [] EdgeFlagArray;

                int    pEdgeID;
                IPoint pLocation;
                double dblEdgePercent;
                int    iUserClassID, iUserID, iUserSubID;

                // look up the EID for the current point  (this will populate intEdgeID and dblEdgePercent)

                ipTraceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolver;

                //get the inetsolver interface
                ipNetSolver = ipTraceFlowSolver as INetSolver;

                ipNetwork = m_ipGeometricNetwork.Network;

                //set the net solver's source network
                ipNetSolver.SourceNetwork = ipNetwork;

                //make edge flags from the points
                //the INetElements interface is needed to get UserID, UserClassID,
                //and UserSubID from an element id

                EdgeFlagArray = new IEdgeFlag[mPointArray.PointCount];
                ipNetElements = ipNetwork as INetElements;


                for (int ii = 0; ii < mPointArray.PointCount; ii++)
                {
                    ipNetFlag = new EdgeFlagClass();

                    point = mPointArray.get_Point(ii);



                    m_ipPointToEID.GetNearestEdge(point, out pEdgeID, out pLocation, out dblEdgePercent);

                    //iUserClassID是featureclass ID,userID是objectID,userSubID
                    ipNetElements.QueryIDs(pEdgeID, esriElementType.esriETEdge, out iUserClassID, out iUserID, out iUserSubID);

                    ipNetFlag.UserClassID = iUserClassID;

                    ipNetFlag.UserID = iUserID;

                    ipNetFlag.UserSubID = iUserSubID;

                    EdgeFlagArray[ii] = ipNetFlag as IEdgeFlag;

                    //MessageBox.Show(iUserID.ToString());
                }

                //添加到TraceFlowSolver中
                ITraceFlowSolverGEN pTFSolverGEN = ipTraceFlowSolver as ITraceFlowSolverGEN;
                pTFSolverGEN.PutEdgeOrigins(ref EdgeFlagArray);



                //get the INetSchema interface
                INetSchema ipNetSchema = ipNetwork as INetSchema;

                INetWeight ipNetWeight = ipNetSchema.get_Weight(0);

                //MessageBox.Show(ipNetWeight.WeightName);

                INetSolverWeights ipNetSolverWeights = ipTraceFlowSolver as INetSolverWeights;

                //来回使用同一个权重



                ipNetSolverWeights.FromToEdgeWeight = ipNetWeight;

                ipNetSolverWeights.ToFromEdgeWeight = ipNetWeight;



                object [] totalCost = new object[mPointArray.PointCount - 1];



                pTFSolverGEN.FindPath(esriFlowMethod.esriFMConnected,
                                      esriShortestPathObjFn.esriSPObjFnMinSum,
                                      out m_ipEnumNetEID_Junctions,
                                      out m_ipEnumNetEID_Edges,
                                      mPointArray.PointCount - 1, ref totalCost);
                //MessageBox.Show(totalCost[0].ToString());



                for (int ii = 0; ii < totalCost.Length; ii++)
                {
                    costLength += (double)(totalCost[ii]);
                }
                pStatusBar.Panels[0].Text = "水管长度:" + costLength.ToString();
                return(true);
            }
            catch (Exception e) {
                MessageBox.Show(e.Message);
                return(false);
            }
        }