Exemple #1
0
        /// <summary>
        /// set origin flag for traceFlowSolver
        /// </summary>
        /// <param name="traceFlowSolver">object ITraceFlowSolverGEN</param>
        protected void SetFlagsOrigin(ref ITraceFlowSolverGEN traceFlowSolver)
        {
            if (this.edgeFlags.Length > 0)
            {
                traceFlowSolver.PutEdgeOrigins(ref this.edgeFlags);
            }

            if (this.junctionFlags.Length > 0)
            {
                traceFlowSolver.PutJunctionOrigins(ref this.junctionFlags);
            }
        }
        /// <summary>
        /// Add two junction flags to TraceSolver
        /// </summary>
        /// <param name="traceFlowSolver">object TraceSolver</param>
        /// <param name="netflag1">1° junction flag</param>
        /// <param name="netflag2">2° junction flag</param>
        internal static void AddTwoJunctionFlagsToTraceSolver(ref ITraceFlowSolverGEN traceFlowSolver, INetFlag netflag1, INetFlag netflag2)
        {
            IJunctionFlag junctionflag1 = netflag1 as IJunctionFlag;
            IJunctionFlag junctionflag2 = netflag2 as IJunctionFlag;

            if (junctionflag1 != null && junctionflag2 != null)
            {
                IJunctionFlag[] junctionflags = new IJunctionFlag[2];
                junctionflags[0] = junctionflag1 as IJunctionFlag;
                junctionflags[1] = junctionflag2 as IJunctionFlag;
                traceFlowSolver.PutJunctionOrigins(ref junctionflags);
            }
        }
Exemple #3
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;
            }
        }
Exemple #4
0
        private void setUpstreamJunctionFlag(IPoint pPoint)
        {
            try
            {
                if (pGeometricNetwork == null)
                {
                    openGeoNetwork();
                }

                IEnumNetEID m_ipEnumNetEID_Junctions, m_ipEnumNetEID_Edges;               //用来存放搜索结果的Junctions和Edges

                ipNetwork = pGeometricNetwork.Network;

                /*
                 * IMarkerSymbol pMarkerSym=SpatialHelperFunction.FindMarkerSym("Civic.ServerStyle", "Default", "Pin Flag Square");
                 * if(pMarkerSym==null){
                 *      MessageBox.Show("无法取得Symbol");
                 *      return;
                 * }
                 *
                 * IRgbColor pRGBColor=Utility.getRGBColor(255, 0, 0);
                 *
                 * pMarkerSym.Color=pRGBColor;
                 * pMarkerSym.Size=26;
                 * pMarkerSym.XOffset=10;
                 * pMarkerSym.YOffset=10;
                 * //无法使用 IFlagDisplay,只有 INetworkAnalysisExtFlags才可以使用IFlagDisplay
                 *
                 * Utility.drawPointToGraphicLayer(m_HookHelper.ActiveView,pPoint,pMarkerSym);
                 */


                int          pJunctionID;
                IPoint       pLocation;
                int          iUserClassID, iUserID, iUserSubID;
                INetElements ipNetElements;

                ipNetElements = ipNetwork as INetElements;                 //得到network中所有的Elements

                mPointToEID = new PointToEIDClass();

                //设置它的GeometricNetwork
                mPointToEID.GeometricNetwork = pGeometricNetwork;

                //设置容限值
                mPointToEID.SnapTolerance = m_HookHelper.ActiveView.Extent.Envelope.Width / 100;

                //设置Source Map
                mPointToEID.SourceMap = m_HookHelper.ActiveView.FocusMap;

                //得到最近的JunctionID
                mPointToEID.GetNearestJunction(pPoint, out pJunctionID, out pLocation);

                //Each element in a logical network has a unique element ID (EID).
                ipNetElements.QueryIDs(pJunctionID, esriElementType.esriETJunction, out iUserClassID, out iUserID, out iUserSubID);

                //得到所在Junction的ID

                //无法使用 IFlagDisplay,只有 INetworkAnalysisExtFlags才可以使用IFlagDisplay

                INetFlag ipNetFlag = new JunctionFlagClass();

                ipNetFlag.UserClassID = iUserClassID;

                ipNetFlag.UserID = iUserID;

                ipNetFlag.UserSubID = iUserSubID;



                IJunctionFlag [] pArrayJFlag = new IJunctionFlag[1];

                pArrayJFlag[0] = ipNetFlag as IJunctionFlag;

                ipTraceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN;

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

                ipNetSolver.SourceNetwork = pGeometricNetwork.Network;



                ipTraceFlowSolver.PutJunctionOrigins(ref pArrayJFlag);

                ipTraceFlowSolver.TraceIndeterminateFlow = false;

                object[] totalCost = new object[1];


                //ipTraceFlowSolver.FindSource(esriFlowMethod.esriFMUpstream,esriShortestPathObjFn.esriSPObjFnMinSum,out m_ipEnumNetEID_Junctions,out m_ipEnumNetEID_Edges,1,ref totalCost);

                ipTraceFlowSolver.FindFlowElements(esriFlowMethod.esriFMUpstream,
                                                   esriFlowElements.esriFEEdges,
                                                   out m_ipEnumNetEID_Junctions,
                                                   out m_ipEnumNetEID_Edges);


                SpatialHelperFunction.pathToPolyline(pGeometricNetwork, m_HookHelper.ActiveView, m_ipEnumNetEID_Edges);



                //ipTraceFlowSolver.FindFlowEndElements(esriFlowMethod.esriFMUpstream,esriFlowElements.esriFEJunctionsAndEdges,out m_ipEnumNetEID_Junctions,out m_ipEnumNetEID_Edges);

                m_HookHelper.ActiveView.Refresh();
            }
            catch (Exception e) {
                MessageBox.Show(e.Message);
            }
        }
Exemple #5
0
        private void setUpstreamJunctionFlag(IPoint pPoint)
        {
            try
            {

                if(pGeometricNetwork==null){
                    openGeoNetwork();

                }

                IEnumNetEID m_ipEnumNetEID_Junctions,m_ipEnumNetEID_Edges;//����������������Junctions��Edges

                ipNetwork=pGeometricNetwork.Network;

                /*
                IMarkerSymbol pMarkerSym=SpatialHelperFunction.FindMarkerSym("Civic.ServerStyle", "Default", "Pin Flag Square");
                if(pMarkerSym==null){
                    MessageBox.Show("�޷�ȡ��Symbol");
                    return;
                }

                IRgbColor pRGBColor=Utility.getRGBColor(255, 0, 0);

                pMarkerSym.Color=pRGBColor;
                pMarkerSym.Size=26;
                pMarkerSym.XOffset=10;
                pMarkerSym.YOffset=10;
                //�޷�ʹ�� IFlagDisplay��ֻ�� INetworkAnalysisExtFlags�ſ���ʹ��IFlagDisplay

                Utility.drawPointToGraphicLayer(m_HookHelper.ActiveView,pPoint,pMarkerSym);
                */

                int pJunctionID;
                IPoint pLocation;
                int iUserClassID,iUserID,iUserSubID;
                INetElements ipNetElements;

                ipNetElements = ipNetwork as INetElements; //�õ�network�����е�Elements

                mPointToEID=new PointToEIDClass();

                //��������GeometricNetwork
                mPointToEID.GeometricNetwork=pGeometricNetwork;

                //��������ֵ
                mPointToEID.SnapTolerance=m_HookHelper.ActiveView.Extent.Envelope.Width/100;

                //����Source Map
                mPointToEID.SourceMap=m_HookHelper.ActiveView.FocusMap;

                //�õ������JunctionID
                mPointToEID.GetNearestJunction(pPoint,out pJunctionID,out pLocation);

                //Each element in a logical network has a unique element ID (EID).
                ipNetElements.QueryIDs(pJunctionID,esriElementType.esriETJunction,out iUserClassID,out iUserID,out iUserSubID);

                //�õ�����Junction��ID

                //�޷�ʹ�� IFlagDisplay��ֻ�� INetworkAnalysisExtFlags�ſ���ʹ��IFlagDisplay

                INetFlag ipNetFlag=new JunctionFlagClass();

                ipNetFlag.UserClassID=iUserClassID;

                ipNetFlag.UserID=iUserID;

                ipNetFlag.UserSubID=iUserSubID;

                IJunctionFlag [] pArrayJFlag=new IJunctionFlag[1];

                pArrayJFlag[0]=ipNetFlag as IJunctionFlag;

                ipTraceFlowSolver=new TraceFlowSolverClass() as ITraceFlowSolverGEN;

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

                ipNetSolver.SourceNetwork=pGeometricNetwork.Network;

                ipTraceFlowSolver.PutJunctionOrigins(ref pArrayJFlag);

                ipTraceFlowSolver.TraceIndeterminateFlow=false;

                object[] totalCost=new object[1];

                //ipTraceFlowSolver.FindSource(esriFlowMethod.esriFMUpstream,esriShortestPathObjFn.esriSPObjFnMinSum,out m_ipEnumNetEID_Junctions,out m_ipEnumNetEID_Edges,1,ref totalCost);

                ipTraceFlowSolver.FindFlowElements(esriFlowMethod.esriFMUpstream,
                    esriFlowElements.esriFEEdges,
                    out m_ipEnumNetEID_Junctions,
                    out m_ipEnumNetEID_Edges);

                SpatialHelperFunction.pathToPolyline(pGeometricNetwork,m_HookHelper.ActiveView,m_ipEnumNetEID_Edges);

                //ipTraceFlowSolver.FindFlowEndElements(esriFlowMethod.esriFMUpstream,esriFlowElements.esriFEJunctionsAndEdges,out m_ipEnumNetEID_Junctions,out m_ipEnumNetEID_Edges);

                m_HookHelper.ActiveView.Refresh();
            }
            catch(Exception e){
                MessageBox.Show(e.Message);

            }
        }