示例#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>
        /// 设置边线权重
        /// </summary>
        /// <param name="weightName"></param>
        /// <param name="pTraceFlowGen"></param>
        /// <param name="pNetwork"></param>
        private static void SetWeight(string weightName, ITraceFlowSolverGEN pTraceFlowGen, INetwork pNetwork)
        {
            INetSchema pNetSchema = pNetwork as INetSchema;
            //根据名字获取权重
            INetWeight           pNetWeight          = pNetSchema.get_WeightByName(weightName);
            INetSolverWeightsGEN pNetSolverWeightGen = pTraceFlowGen as INetSolverWeightsGEN;

            //开始边线权重
            pNetSolverWeightGen.FromToEdgeWeight = pNetWeight;
            //终止边线权重
            pNetSolverWeightGen.ToFromEdgeWeight = pNetWeight;
        }
        /// <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);
            }
        }
        /// <summary>
        /// set weights in traceFlowSolver
        /// </summary>
        /// <param name="traceFlowSolver">object traceFlowSolver</param>
        private void SetWeights(ref ITraceFlowSolverGEN traceFlowSolver)
        {
            INetSolverWeightsGEN netSolverWeights = traceFlowSolver as INetSolverWeightsGEN;

            // Junction Weight
            if (this.JunctionWeight != null)
            {
                netSolverWeights.JunctionWeight = this.JunctionWeight;
            }

            // FromTo Edge Weight
            if (this.FromToEdgeWeight != null)
            {
                netSolverWeights.FromToEdgeWeight = this.FromToEdgeWeight;
            }

            // ToFrom Edge Weight
            if (this.ToFromEdgeWeight != null)
            {
                netSolverWeights.ToFromEdgeWeight = this.ToFromEdgeWeight;
            }

            // Junction Filter Weight
            if (this.JunctionFilterWeight != null)
            {
                netSolverWeights.JunctionFilterWeight = this.JunctionFilterWeight;
                netSolverWeights.SetFilterType(esriElementType.esriETJunction, esriWeightFilterType.esriWFRange, this.JunctionFilterNotOperator);
                object[] junctionFilterRangesFrom = this.JunctionFilterRangesFrom.ToArray();
                object[] junctionFilterRangesTo   = this.JunctionFilterRangesTo.ToArray();
                netSolverWeights.SetFilterRanges(esriElementType.esriETJunction, ref junctionFilterRangesFrom, ref junctionFilterRangesTo);
            }

            // FromTo ToFrom Edge Filter Weight
            if ((this.FromToEdgeFilterWeight != null) && (this.ToFromEdgeFilterWeight != null))
            {
                netSolverWeights.FromToEdgeFilterWeight = this.FromToEdgeFilterWeight;
                netSolverWeights.ToFromEdgeFilterWeight = this.ToFromEdgeFilterWeight;
                netSolverWeights.SetFilterType(esriElementType.esriETEdge, esriWeightFilterType.esriWFRange, this.EdgeFilterNotOperator);
                object[] edgeFilterRangesFrom = this.EdgeFilterRangesFrom.ToArray();
                object[] edgeFilterRangesTo   = this.EdgeFilterRangesTo.ToArray();
                netSolverWeights.SetFilterRanges(esriElementType.esriETEdge, ref edgeFilterRangesFrom, ref edgeFilterRangesTo);
            }
        }
示例#5
0
        /// <summary>
        /// set barrier for traceFlowSolver
        /// </summary>
        /// <param name="traceFlowSolver">object ITraceFlowSolverGEN</param>
        protected void SetBarriers(ref ITraceFlowSolverGEN traceFlowSolver)
        {
            INetSolver netSolver = traceFlowSolver as INetSolver;

            if (this.edgeBarriers.Length > 0)
            {
                INetElementBarriersGEN netElementBarriersGEN = new NetElementBarriersClass() as INetElementBarriersGEN;
                netElementBarriersGEN.ElementType = esriElementType.esriETEdge;
                netElementBarriersGEN.Network     = this.geometricNetwork.Network;
                netElementBarriersGEN.SetBarriersByEID(ref this.edgeBarriers);
                INetElementBarriers netElementBarriers = netElementBarriersGEN as INetElementBarriers;
                netSolver.set_ElementBarriers(esriElementType.esriETEdge, netElementBarriers);
            }

            if (this.junctionBarriers.Length > 0)
            {
                INetElementBarriersGEN netElementBarriersGEN = new NetElementBarriersClass() as INetElementBarriersGEN;
                netElementBarriersGEN.ElementType = esriElementType.esriETJunction;
                netElementBarriersGEN.Network     = this.geometricNetwork.Network;
                netElementBarriersGEN.SetBarriersByEID(ref this.junctionBarriers);
                INetElementBarriers netElementBarriers = netElementBarriersGEN as INetElementBarriers;
                netSolver.set_ElementBarriers(esriElementType.esriETJunction, netElementBarriers);
            }
        }
        void ITraceTask.OnTraceExecution()
        {
            // prepare the network solver
            ITraceFlowSolverGEN tfs = UTIL_coreTraceSetup();

            if (tfs == null)
            {
                return;
            }

            // perform the trace task
            IEnumNetEID      resultJuncs, resultEdges;
            ITraceTasks      traceTasks   = m_utilNetExt as ITraceTasks;
            esriFlowElements flowElements = traceTasks.TraceFlowElements;

            if (traceTasks.TraceEnds)
            {
                // find the features stopping the trace
                tfs.FindFlowEndElements(esriFlowMethod.esriFMUpstream, flowElements, out resultJuncs, out resultEdges);
            }
            else
            {
                // return the traced features
                tfs.FindFlowElements(esriFlowMethod.esriFMUpstream, flowElements, out resultJuncs, out resultEdges);
            }

            // copy the results to the class level
            INetworkAnalysisExt nax = m_utilNetExt as INetworkAnalysisExt;

            if (resultJuncs == null)
            {
                // junctions were not returned -- create an empty enumeration
                IEnumNetEIDBuilder eidBuilder = new EnumNetEIDArrayClass();
                eidBuilder.Network     = nax.CurrentNetwork.Network;
                eidBuilder.ElementType = esriElementType.esriETJunction;
                m_resultJunctions      = eidBuilder as IEnumNetEID;
            }
            else
            {
                m_resultJunctions = resultJuncs;
            }
            if (resultEdges == null)
            {
                // edges were not returned -- create an empty enumeration
                IEnumNetEIDBuilder eidBuilder = new EnumNetEIDArrayClass();
                eidBuilder.Network     = nax.CurrentNetwork.Network;
                eidBuilder.ElementType = esriElementType.esriETEdge;
                m_resultEdges          = eidBuilder as IEnumNetEID;
            }
            else
            {
                m_resultEdges = resultEdges;
            }

            // update the extension with the results
            INetworkAnalysisExtResults naxResults = m_utilNetExt as INetworkAnalysisExtResults;

            naxResults.ClearResults();               // first remove the old results
            if (naxResults.ResultsAsSelection)
            {
                naxResults.CreateSelection(resultJuncs, resultEdges);
            }
            else
            {
                naxResults.SetResults(resultJuncs, resultEdges);
            }
        }
示例#7
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);
            }
        }
示例#8
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);
            }
        }
示例#9
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);

            }
        }