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