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