/// <summary> /// Locates line route location with the specified route identifier. /// </summary> /// <param name="routeId">The route identifier.</param> /// <param name="polyline">The polyline.</param> /// <param name="error">The error that occured during location.</param> /// <returns> /// Returns a <see cref="IGeometry" /> representing the location. /// </returns> public IGeometry Locate(object routeId, IPolyline polyline, out esriLocatingError error) { IRouteLocation routeLocation = new RouteMeasureLineLocationClass(); routeLocation.RouteID = routeId; IMSegmentation segmentation = (IMSegmentation)polyline; IRouteMeasureLineLocation lineLocation = (IRouteMeasureLineLocation)routeLocation; lineLocation.FromMeasure = segmentation.MMin; lineLocation.ToMeasure = segmentation.MMax; IGeometry result; this.Locator.Locate(routeLocation, out result, out error); return(result.IsEmpty ? null : result); }
public static IEnumerable <IRouteLocation2> ToRouteLocations(this IEnumerable <JsonObject> jArray) { int elementNo = -1; foreach (var jToken in jArray) { elementNo++; bool hasRouteId = jToken.TryGetString("RouteID", out string routeId); bool hasMeasure = jToken.TryGetAsDouble("Measure", out double?measure); var hasFromMeasure = jToken.TryGetAsDouble("FromMeasure", out double?fromMeasure); var hasToMeasure = jToken.TryGetAsDouble("ToMeasure", out double?toMeasure); if (hasMeasure) { var location = new RouteMeasurePointLocationClass { RouteID = routeId, Measure = measure.Value }; yield return(location); } else if (fromMeasure.HasValue && toMeasure.HasValue) { var location = new RouteMeasureLineLocationClass { RouteID = routeId, FromMeasure = fromMeasure.Value, ToMeasure = toMeasure.Value }; yield return(location); } else { throw new ArgumentException($"Input JArray element #{elementNo} did not have valid measure value(s): {jToken.ToString()}", nameof(jArray)); } } }
/// <summary> /// Handler operation Line Location /// </summary> /// <param name="boundVariables">list of variables bound</param> /// <param name="operationInput">input of operation</param> /// <param name="outputFormat">format of output</param> /// <param name="requestProperties">list of request properties</param> /// <param name="responseProperties">list of response properties </param> /// <returns>response in byte</returns> private byte[] LineLocationOperHandler(NameValueCollection boundVariables, JsonObject operationInput, string outputFormat, string requestProperties, out string responseProperties) { responseProperties = "{\"Content-Type\" : \"application/json\"}"; int routeLayerID = Convert.ToInt32(boundVariables["RouteLayersID"], CultureInfo.InvariantCulture); esriUnits routeMeasureUnit = DSUtility.GetMeasureUnit(operationInput, MeasureUnit.routeMeasureUnit); esriUnits routeLocationMeasureUnit = DSUtility.GetMeasureUnit(operationInput, MeasureUnit.routeLocationMeasureUnit); double?fromMeasure; operationInput.TryGetAsDouble("fromMeasure", out fromMeasure); double?toMeasure; operationInput.TryGetAsDouble("toMeasure", out toMeasure); if (!fromMeasure.HasValue && !toMeasure.HasValue) { throw new DynamicSegmentationException("Set at least fromMeasure or toMeasure!"); } double?lateralOffset; bool found = operationInput.TryGetAsDouble("lateralOffset", out lateralOffset); if (!found || !lateralOffset.HasValue) { lateralOffset = 0; } IFeatureClass featureClass = this.GetRouteFeatureClass(routeLayerID); string routeIDFieldNameValue = DSUtility.GetRouteIDFieldName(operationInput); IFields fields = featureClass.Fields; int indexField = fields.FindField(routeIDFieldNameValue); if (indexField == -1) { throw new DynamicSegmentationException(string.Format(CultureInfo.InvariantCulture, "routeIDFieldName {0} not found!", routeIDFieldNameValue)); } object routeID; found = operationInput.TryGetObject("routeID", out routeID); if (!found) { throw new DynamicSegmentationException("routeID not valid"); } IField field = fields.get_Field(indexField); this.CheckRouteID(routeID, field); IRouteLocator2 routeLocator = DSUtility.GetRouteLocator(featureClass, routeIDFieldNameValue, routeMeasureUnit); IRouteLocation routeLocation = new RouteMeasureLineLocationClass(); routeLocation.RouteID = routeID; routeLocation.MeasureUnit = routeLocationMeasureUnit; routeLocation.LateralOffset = lateralOffset.Value; IRouteMeasureLineLocation routeMeasureLineLocation = (IRouteMeasureLineLocation)routeLocation; if (fromMeasure.HasValue) { routeMeasureLineLocation.FromMeasure = fromMeasure.Value; } if (toMeasure.HasValue) { routeMeasureLineLocation.ToMeasure = toMeasure.Value; } IGeometry geometry; esriLocatingError locatingError; routeLocator.Locate(routeLocation, out geometry, out locatingError); int errorId = (int)locatingError; JsonObject result = null; if (errorId != 0) { string errorDescription = string.Format(CultureInfo.InvariantCulture, "{0} ({1})", Enum.GetName(typeof(esriLocatingError), locatingError), errorId); IObjectJson jsonObjectError = new ObjectError(errorDescription); result = jsonObjectError.ToJsonObject(); } if ((geometry != null) && (!geometry.IsEmpty)) { if (result == null) { result = new JsonObject(); } result.AddJsonObject("geometries", Conversion.ToJsonObject(geometry)); } return(result.JsonByte()); }
/// <summary> /// 线性参考代码 /// </summary> /// <param name="_pRouteFC"></param> /// <param name="_pPKName"></param> /// <param name="_pID"></param> /// <param name="_pFrom"></param> /// <param name="_pTo"></param> /// <returns></returns> IPolyline FindRoutByMeasure(IFeatureClass _pRouteFC, string _pPKName,object _pID, double _pFrom, double _pTo) { IDataset pDataset = (IDataset)_pRouteFC; IName pName = pDataset.FullName; IRouteLocatorName pRouteLocatorName = new RouteMeasureLocatorNameClass(); pRouteLocatorName.RouteFeatureClassName = pName; pRouteLocatorName.RouteIDFieldName = _pPKName; pRouteLocatorName.RouteMeasureUnit = esriUnits.esriFeet; pName = (IName)pRouteLocatorName; IRouteLocator2 pRouteLocator = (IRouteLocator2)pName.Open(); IRouteLocation pRouteLoc = new RouteMeasureLineLocationClass(); pRouteLoc.MeasureUnit = esriUnits.esriFeet; pRouteLoc.RouteID = _pID; IRouteMeasureLineLocation rMLineLoc = (IRouteMeasureLineLocation)pRouteLoc; rMLineLoc.FromMeasure = _pFrom; rMLineLoc.ToMeasure = _pTo; IGeometry pGeo = null; esriLocatingError locError; pRouteLocator.Locate(pRouteLoc , out pGeo, out locError); return pGeo as IPolyline; }