/// <summary> /// Initializes a new instance of the GeometricNetworkTracer class /// </summary> /// <param name="geometricNetwork">object geometricNetwork</param> /// <param name="geometricNetworkParameters">object IGeometricNetworkParameters</param> /// <param name="traceSolverType">trace Solver Type</param> /// <param name="flowMethod">flow method</param> /// <param name="traceIndeterminateFlow">trace Indeterminate Flow</param> public GeometricNetworkTracer(ESRI.ArcGIS.Geodatabase.IGeometricNetwork geometricNetwork, IGeometricNetworkParameters geometricNetworkParameters, TraceSolverType traceSolverType, esriFlowMethod flowMethod, bool traceIndeterminateFlow) : base(geometricNetwork, geometricNetworkParameters) { this.TraceSolverType = traceSolverType; this.FlowMethod = flowMethod; this.TraceIndeterminateFlow = traceIndeterminateFlow; this.DisableLayers = new List <int>(); }
/// <summary> /// Initializes a new instance of the <see cref="GeometricNetworkInfo"/> class /// </summary> /// <param name="id">id of layer</param> /// <param name="name">name of layer</param> /// <param name="geometricNetwork">object IGeometricNetwork</param> public GeometricNetworkInfo(int id, string name, ESRI.ArcGIS.Geodatabase.IGeometricNetwork geometricNetwork) { this.Name = name; this.ID = id; IGeoDataset geodataset = geometricNetwork as IGeoDataset; this.SpatialReference = geodataset.SpatialReference; this.Extent = geodataset.Extent; this.GeometricNetwork = geometricNetwork; }
/// <summary> /// search the eid nearest from point /// </summary> /// <param name="geometricNetwork">geometric Network</param> /// <param name="searchTolerance">tolerance for search</param> /// <param name="point">point input</param> /// <param name="elementType">type of element</param> /// <returns>return eid</returns> internal static int GetEIDFromPoint(ESRI.ArcGIS.Geodatabase.IGeometricNetwork geometricNetwork, double searchTolerance, IPoint point, esriElementType elementType) { IEnumFeatureClass enumFeatureClassSimple = null; IEnumFeatureClass enumFeatureClassComlex = null; if (elementType == esriElementType.esriETEdge) { enumFeatureClassSimple = geometricNetwork.get_ClassesByType(esriFeatureType.esriFTSimpleEdge); enumFeatureClassComlex = geometricNetwork.get_ClassesByType(esriFeatureType.esriFTComplexEdge); } else if (elementType == esriElementType.esriETJunction) { enumFeatureClassSimple = geometricNetwork.get_ClassesByType(esriFeatureType.esriFTSimpleJunction); enumFeatureClassComlex = geometricNetwork.get_ClassesByType(esriFeatureType.esriFTComplexJunction); } double distance = double.PositiveInfinity; int featureClassID = -1; IGeometry featureGeometry = null; Helper.FindNearestDistance(enumFeatureClassSimple, point, searchTolerance, ref distance, ref featureClassID, ref featureGeometry); Helper.FindNearestDistance(enumFeatureClassComlex, point, searchTolerance, ref distance, ref featureClassID, ref featureGeometry); if (featureClassID == -1) { return(-1); } IProximityOperator proximityPoint = featureGeometry as IProximityOperator; IPoint p = proximityPoint.ReturnNearestPoint(point, esriSegmentExtension.esriNoExtension); if (elementType == esriElementType.esriETEdge) { return(geometricNetwork.get_EdgeElement(p)); } else if (elementType == esriElementType.esriETJunction) { return(geometricNetwork.get_JunctionElement(p)); } return(-1); }
/// <summary> /// Initializes a new instance of the GeometricNetwork class /// </summary> /// <param name="geometricNetwork">object geometricNetwork</param> /// <param name="geometricNetworkParameters">object IGeometricNetworkParameters</param> public GeometricNetwork(ESRI.ArcGIS.Geodatabase.IGeometricNetwork geometricNetwork, IGeometricNetworkParameters geometricNetworkParameters) { this.geometricNetwork = geometricNetwork; this.EdgeFlags = geometricNetworkParameters.EdgeFlags; this.JunctionFlags = geometricNetworkParameters.JunctionFlags; this.EdgeBarriers = geometricNetworkParameters.EdgeBarriers; this.JunctionBarriers = geometricNetworkParameters.JunctionBarriers; this.MaxFeatures = geometricNetworkParameters.MaxFeatures; this.Tolerance = geometricNetworkParameters.Tolerance; this.FlowElements = geometricNetworkParameters.FlowElements; this.OutFields = new string[] { "*" }; this.edgeFlags = new EdgeFlag[] { }; this.junctionFlags = new JunctionFlag[] { }; this.edgeBarriers = new int[] { }; this.junctionBarriers = new int[] { }; this.SetFlagsGeometricNetwork(); this.SetBarriersGeometricNetwork(); }
/// <summary> /// Trace Geometry Network /// </summary> /// <param name="geometricNetwork">Geometric Network</param> /// <param name="traceSolverType">trace Solver Type</param> /// <param name="flowElements">flow Elements</param> /// <param name="edgeFlags">edge Flags</param> /// <param name="junctionFlags">junction Flags</param> /// <param name="edgeBarriers">edge Barriers</param> /// <param name="junctionBarriers">junction Barriers</param> /// <param name="flowMethod">method flow</param> /// <param name="outFields">output fields</param> /// <param name="maxFeatures">max Features</param> /// <param name="tolerance">parameter tolerance</param> /// <param name="traceIndeterminateFlow">trace Indeterminate Flow</param> /// <param name="shortestPathObjFn">shortest Path Obj Fn</param> /// <param name="disableLayers">list of disable layers</param> /// <param name="netJunctionWeight">Junction Weight</param> /// <param name="netFromToEdgeWeight">FromTo Edge Weight</param> /// <param name="netToFromEdgeWeight">ToFrom Edge Weight</param> /// <param name="netJunctionFilterWeight">Junction Filter Weight</param> /// <param name="junctionFilterRangesFrom">junction Filter Ranges From</param> /// <param name="junctionFilterRangesTo">junction Filter Ranges To</param> /// <param name="junctionFilterNotOperator">junction Filter Not Operator</param> /// <param name="netFromToEdgeFilterWeight">FromTo Edge Filter Weight</param> /// <param name="netToFromEdgeFilterWeight">ToFrom Edge Filter Weight</param> /// <param name="edgeFilterRangesFrom">edge Filter Ranges From</param> /// <param name="edgeFilterRangesTo">edge Filter Ranges To</param> /// <param name="edgeFilterNotOperator">edge Filter Not Operator</param> /// <returns>Trace Geometric Network</returns> internal static byte[] GetTraceGeometryNetwork(ESRI.ArcGIS.Geodatabase.IGeometricNetwork geometricNetwork, TraceSolverType traceSolverType, esriFlowElements flowElements, List <IPoint> edgeFlags, List <IPoint> junctionFlags, List <IPoint> edgeBarriers, List <IPoint> junctionBarriers, esriFlowMethod flowMethod, string[] outFields, int maxFeatures, double tolerance, bool traceIndeterminateFlow, esriShortestPathObjFn shortestPathObjFn, List <int> disableLayers, INetWeight netJunctionWeight, INetWeight netFromToEdgeWeight, INetWeight netToFromEdgeWeight, INetWeight netJunctionFilterWeight, List <object> junctionFilterRangesFrom, List <object> junctionFilterRangesTo, bool junctionFilterNotOperator, INetWeight netFromToEdgeFilterWeight, INetWeight netToFromEdgeFilterWeight, List <object> edgeFilterRangesFrom, List <object> edgeFilterRangesTo, bool edgeFilterNotOperator) { IGeometricNetworkParameters geometricNetworkParameters = new GeometricNetworkParameters(); geometricNetworkParameters.EdgeFlags = edgeFlags; geometricNetworkParameters.JunctionFlags = junctionFlags; geometricNetworkParameters.EdgeBarriers = edgeBarriers; geometricNetworkParameters.JunctionBarriers = junctionBarriers; geometricNetworkParameters.MaxFeatures = maxFeatures; geometricNetworkParameters.Tolerance = tolerance; geometricNetworkParameters.FlowElements = flowElements; IGeometricNetworkTracer geometricNetworkTracer = new GeometricNetworkTracer(geometricNetwork, geometricNetworkParameters, traceSolverType, flowMethod, traceIndeterminateFlow); geometricNetworkTracer.OutFields = outFields; geometricNetworkTracer.DisableLayers = disableLayers; geometricNetworkTracer.JunctionWeight = netJunctionWeight; geometricNetworkTracer.FromToEdgeWeight = netFromToEdgeWeight; geometricNetworkTracer.ToFromEdgeWeight = netToFromEdgeWeight; geometricNetworkTracer.JunctionFilterWeight = netJunctionFilterWeight; geometricNetworkTracer.JunctionFilterRangesFrom = junctionFilterRangesFrom; geometricNetworkTracer.JunctionFilterRangesTo = junctionFilterRangesTo; geometricNetworkTracer.JunctionFilterNotOperator = junctionFilterNotOperator; geometricNetworkTracer.FromToEdgeFilterWeight = netFromToEdgeFilterWeight; geometricNetworkTracer.ToFromEdgeFilterWeight = netToFromEdgeFilterWeight; geometricNetworkTracer.EdgeFilterRangesFrom = edgeFilterRangesFrom; geometricNetworkTracer.EdgeFilterRangesTo = edgeFilterRangesTo; geometricNetworkTracer.EdgeFilterNotOperator = edgeFilterNotOperator; if ((traceSolverType == TraceSolverType.FindPath) || (traceSolverType == TraceSolverType.FindSource)) { geometricNetworkTracer.ShortestPathObjFn = shortestPathObjFn; } return(geometricNetworkTracer.Solve().JsonByte()); }
/// <summary> /// object polyline. Distance negative -> upstream /// </summary> /// <param name="geometricNetwork">object geometricNetwork</param> /// <param name="resultEdges">objects resultEdges</param> /// <param name="distance">value of distance</param> /// <param name="point">object point</param> /// <param name="offset">offset of polyline</param> /// <param name="messageInfo">info on result</param> /// <returns>object IGeometry (polyline or point)</returns> internal static IGeometry GetPolylinePosAlong(ESRI.ArcGIS.Geodatabase.IGeometricNetwork geometricNetwork, IEnumNetEID resultEdges, double distance, IPoint point, double?offset, ref string messageInfo) { IGeometry geometryBag = new GeometryBagClass(); geometryBag.SpatialReference = point.SpatialReference; IGeometryCollection geometryCollection = geometryBag as IGeometryCollection; IEIDHelper eidHelper = new EIDHelperClass(); eidHelper.GeometricNetwork = geometricNetwork; eidHelper.ReturnGeometries = true; eidHelper.ReturnFeatures = false; IEnumEIDInfo enumEIDinfo = eidHelper.CreateEnumEIDInfo(resultEdges); enumEIDinfo.Reset(); IEIDInfo eidInfo = enumEIDinfo.Next(); while (eidInfo != null) { IGeometry geometry = eidInfo.Geometry; geometryCollection.AddGeometry(geometry); eidInfo = enumEIDinfo.Next(); } ITopologicalOperator unionedPolyline = new PolylineClass(); unionedPolyline.ConstructUnion(geometryBag as IEnumGeometry); IPolyline pl = unionedPolyline as IPolyline; if (distance < 0) { pl.ReverseOrientation(); distance = Math.Abs(distance); } IMAware mAware = pl as IMAware; mAware.MAware = true; IMSegmentation3 mSegmentation = unionedPolyline as IMSegmentation3; mSegmentation.SetMsAsDistance(false); IPoint ptTmp = new PointClass(); double distanceAlong = 0; double distanceFromCurve = 0; bool rightSide = false; pl.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, point, false, ptTmp, ref distanceAlong, ref distanceFromCurve, ref rightSide); object mStartArray = mSegmentation.GetMsAtDistance(distanceAlong, false); double[] mStart = mStartArray as double[]; double distanceDownStream = distanceAlong + distance; IPolyline resultPolyline = mSegmentation.GetSubcurveBetweenMs(mStart[0], distanceDownStream) as IPolyline; if (resultPolyline.IsEmpty) { return(point); } if (mSegmentation.MMax < distanceDownStream) { messageInfo = "The set distance exceeds the length of network"; } return(Helper.ConstructOffset(resultPolyline, offset)); }
/// <summary> /// Initializes a new instance of the GeometricNetworkValveIsolation class /// </summary> /// <param name="geometricNetwork">object geometricNetwork</param> /// <param name="geometricNetworkParameters">object IGeometricNetworkParameters</param> /// <param name="valve">feature class valve</param> /// <param name="station">feature class station</param> public GeometricNetworkValveIsolation(ESRI.ArcGIS.Geodatabase.IGeometricNetwork geometricNetwork, IGeometricNetworkParameters geometricNetworkParameters, IFeatureClass valve, IFeatureClass station) : base(geometricNetwork, geometricNetworkParameters) { this.Valve = valve; this.Station = station; }