Пример #1
0
        /// <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);
        }
Пример #2
0
        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));
                }
            }
        }
Пример #3
0
        /// <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());
        }
Пример #4
0
        /// <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;
        }