示例#1
0
        private void ResultBtn_Click(object sender, EventArgs e)
        {
            try
            {
                #region 设置管点分析分析条件
                //为追踪任务分析器设置管点
                IJunctionFlag[] arrayJunctionFlag = new IJunctionFlag[listJunctionsFlag.Count];
                for (int i = 0; i < arrayJunctionFlag.Length; i++)
                {
                    arrayJunctionFlag[i] = listJunctionsFlag[i];
                }
                traceFlowsolverGen.PutJunctionOrigins(ref arrayJunctionFlag);
                //为追踪任务分析器设置管线
                IEdgeFlag[] arrayEdgeFlag = new IEdgeFlag[listEdgeFlag.Count];
                for (int i = 0; i < arrayEdgeFlag.Length; i++)
                {
                    traceFlowsolverGen.PutEdgeOrigins(ref arrayEdgeFlag);
                }

                //为管点分析器设置障碍点
                INetElementBarriersGEN netElementBarriersGEN = new NetElementBarriersClass();
                netElementBarriersGEN.Network = m_GeometryNetwork.Network;
                if (JunctionBarrierEIDs.Count > 0)
                {
                    int[] junctionBarrierEIDs = new int[JunctionBarrierEIDs.Count];
                    for (int j = 0; j < junctionBarrierEIDs.Length; j++)
                    {
                        junctionBarrierEIDs[j] = JunctionBarrierEIDs[j];
                    }
                    netElementBarriersGEN.ElementType = esriElementType.esriETJunction;
                    netElementBarriersGEN.SetBarriersByEID(ref junctionBarrierEIDs);
                    netsolver.set_ElementBarriers(esriElementType.esriETJunction, netElementBarriersGEN as INetElementBarriers);
                }
                else  //否则将管点设置为空
                {
                    netsolver.set_ElementBarriers(esriElementType.esriETJunction, null);
                }
                //未管点分析器设置障碍线
                if (EdgeBarrierEIDs.Count > 0)
                {
                    int[] edgeBarrierEIDs = new int[EdgeBarrierEIDs.Count];
                    for (int j = 0; j < EdgeBarrierEIDs.Count; j++)
                    {
                        edgeBarrierEIDs[j] = EdgeBarrierEIDs[j];
                    }
                    netElementBarriersGEN.ElementType = esriElementType.esriETEdge;
                    netElementBarriersGEN.SetBarriersByEID(ref edgeBarrierEIDs);
                    netsolver.set_ElementBarriers(esriElementType.esriETEdge, netElementBarriersGEN as INetElementBarriers);
                }
                else //否则将管线设置为空
                {
                    netsolver.set_ElementBarriers(esriElementType.esriETEdge, null);
                }

                #endregion

                //定义相关变量
                IEnumNetEID junctionEIDs = new EnumNetEIDArrayClass();
                IEnumNetEID edgeEIDs     = new EnumNetEIDArrayClass();

                object[] segmentsCosts = null;
                object   totalCost     = null;
                int      Counts        = -1;
                #region 各种几何网络分析的结果
                switch (this.AnalysisCategoryCmbx.SelectedIndex)
                {
                //查询共同祖先
                case 0:
                    traceFlowsolverGen.FindCommonAncestors(esriFlowElements.esriFEJunctionsAndEdges, out junctionEIDs, out edgeEIDs);
                    break;

                //查找相连接的网络要素
                case 1:
                    traceFlowsolverGen.FindFlowElements(esriFlowMethod.esriFMConnected, esriFlowElements.esriFEJunctionsAndEdges, out junctionEIDs, out edgeEIDs);
                    break;

                //查找网络中连接的环
                case 2:
                    traceFlowsolverGen.FindCircuits(esriFlowElements.esriFEJunctionsAndEdges, out junctionEIDs, out edgeEIDs);
                    break;

                //查找未连接的网络要素
                case 3:
                    traceFlowsolverGen.FindFlowUnreachedElements(esriFlowMethod.esriFMConnected, esriFlowElements.esriFEJunctionsAndEdges, out junctionEIDs, out edgeEIDs);
                    break;

                //查找上游路径,同时跟踪耗费
                case 4:
                    Counts        = GetSegmentCounts();
                    segmentsCosts = new object[Counts];
                    traceFlowsolverGen.FindSource(esriFlowMethod.esriFMUpstream, esriShortestPathObjFn.esriSPObjFnMinSum, out junctionEIDs, out edgeEIDs, Counts, ref segmentsCosts);
                    break;

                //获取网络路径,追踪网络耗费。count比所有的的标识总数少一个,但如果管点和管线标识同时存在的时候该功能不可用
                case 5:
                    if (listEdgeFlag.Count > 0 && listJunctionsFlag.Count > 0)
                    {
                        break;
                    }
                    else if (listJunctionsFlag.Count > 0)
                    {
                        Counts = listJunctionsFlag.Count - 1;
                    }
                    else if (listEdgeFlag.Count > 0)
                    {
                        Counts = listEdgeFlag.Count - 1;
                    }
                    else
                    {
                        break;
                    }
                    segmentsCosts = new object[Counts];
                    traceFlowsolverGen.FindPath(esriFlowMethod.esriFMConnected, esriShortestPathObjFn.esriSPObjFnMinSum, out junctionEIDs, out edgeEIDs, Counts, ref segmentsCosts);
                    break;

                //下游追踪
                case 6:
                    traceFlowsolverGen.FindFlowElements(esriFlowMethod.esriFMDownstream, esriFlowElements.esriFEJunctionsAndEdges, out junctionEIDs, out edgeEIDs);
                    break;

                //查找上游路径消耗,同时获取网络追踪的耗费
                case 7:
                    totalCost = new object();
                    traceFlowsolverGen.FindAccumulation(esriFlowMethod.esriFMUpstream, esriFlowElements.esriFEJunctionsAndEdges, out junctionEIDs, out edgeEIDs, out totalCost);
                    break;

                //上游追踪
                case 8:
                    Counts        = GetSegmentCounts();
                    segmentsCosts = new object[Counts];
                    traceFlowsolverGen.FindSource(esriFlowMethod.esriFMUpstream, esriShortestPathObjFn.esriSPObjFnMinSum, out junctionEIDs, out edgeEIDs, Counts, ref segmentsCosts);
                    break;

                default:
                    break;
                }

                #endregion

                //绘制结果图像
                DrawTraceRsult(junctionEIDs, edgeEIDs);
                this.Mapcontrol.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, this.Mapcontrol.ActiveView.Extent);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
        }
示例#2
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);
            }
        }