/// <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); } }
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; } }
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); } }
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); } }