/// <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); }
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)); }
/// <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<String, AttributeValue> item : queryRadiusResult.getItem()) { /// System.out.println("item: " + 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)); }