Пример #1
0
        /// <summary>
        ///     Filter out any points outside of the queried area from the input list.
        /// </summary>
        /// <param name="list">List of items return by Amazon DynamoDB. It may contains points outside of the actual area queried.</param>
        /// <param name="geoQueryRequest">List of items within the queried area.</param>
        /// <returns></returns>
        private IEnumerable <IDictionary <string, AttributeValue> > Filter(IEnumerable <IDictionary <string, AttributeValue> > list,
                                                                           GeoQueryRequest geoQueryRequest)
        {
            var result = new List <IDictionary <String, AttributeValue> >();

            S2LatLngRect?latLngRect    = null;
            S2LatLng?    centerLatLng  = null;
            double       radiusInMeter = 0;

            if (geoQueryRequest is QueryRectangleRequest)
            {
                latLngRect = S2Util.GetBoundingLatLngRect(geoQueryRequest);
            }
            foreach (var item in list)
            {
                var geoJson  = item[_config.GeoJsonAttributeName].S;
                var geoPoint = GeoJsonMapper.GeoPointFromString(geoJson);

                var latLng = S2LatLng.FromDegrees(geoPoint.lat, geoPoint.lng);
                if (latLngRect != null && latLngRect.Value.Contains(latLng))
                {
                    result.Add(item);
                }
                else if (centerLatLng != null && radiusInMeter > 0 &&
                         centerLatLng.Value.GetEarthDistance(latLng) <= radiusInMeter)
                {
                    result.Add(item);
                }
            }

            return(result);
        }
Пример #2
0
        public async Task <QueryRectangleResult> QueryRectangleAsync(QueryRectangleRequest queryRectangleRequest, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (queryRectangleRequest == null)
            {
                throw new ArgumentNullException("queryRectangleRequest");
            }
            var latLngRect = S2Util.GetBoundingLatLngRect(queryRectangleRequest);

            var cellUnion = S2Manager.FindCellIds(latLngRect);
            var ranges    = MergeCells(cellUnion);

            var result = await DispatchQueries(ranges, queryRectangleRequest, cancellationToken).ConfigureAwait(false);

            return(new QueryRectangleResult(result));
        }
Пример #3
0
        /// <summary>
        ///     <p>
        ///         Query a circular area constructed by a center point and its radius.
        ///     </p>
        ///     <b>Sample usage:</b>
        ///     <pre>
        ///         GeoPoint centerPoint = new GeoPoint(47.5, -122.3);
        ///         QueryRadiusRequest queryRadiusRequest = new QueryRadiusRequest(centerPoint, 100);
        ///         QueryRadiusResult queryRadiusResult = geoIndexManager.queryRadius(queryRadiusRequest);
        ///         for (Map&lt;String, AttributeValue&gt; item : queryRadiusResult.getItem()) {
        ///         System.out.println(&quot;item: &quot; + item);
        ///         }
        ///     </pre>
        /// </summary>
        /// <param name="queryRadiusRequest">Container for the necessary parameters to execute radius query request.</param>
        /// <returns>Result of radius query request.</returns>
        public async Task <QueryRadiusResult> QueryRadiusAsync(QueryRadiusRequest queryRadiusRequest, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (queryRadiusRequest == null)
            {
                throw new ArgumentNullException("queryRadiusRequest");
            }
            if (queryRadiusRequest.RadiusInMeter <= 0 || queryRadiusRequest.RadiusInMeter > S2LatLng.EarthRadiusMeters)
            {
                throw new ArgumentOutOfRangeException("queryRadiusRequest", "RadiusInMeter needs to be > 0  and <= " + S2LatLng.EarthRadiusMeters);
            }

            var latLngRect = S2Util.GetBoundingLatLngRect(queryRadiusRequest);

            var cellUnion = S2Manager.FindCellIds(latLngRect);

            var ranges = MergeCells(cellUnion);

            var result = await DispatchQueries(ranges, queryRadiusRequest, cancellationToken).ConfigureAwait(false);

            return(new QueryRadiusResult(result));
        }