private double TranslateCircleRadius(double radius, SpatialUnits units) { if (units == SpatialUnits.Miles) radius *= Constants.MilesToKm; return (radius / Constants.EarthMeanRadiusKm) * RadiansToDegrees; }
public SpatialOptions BoundingBoxIndex(SpatialUnits circleRadiusUnits = SpatialUnits.Kilometers) { return(new SpatialOptions { Type = SpatialFieldType.Geography, Strategy = SpatialSearchStrategy.BoundingBox, Units = circleRadiusUnits }); }
private double TranslateCircleRadius(double radius, SpatialUnits units) { if (units == SpatialUnits.Miles) { radius *= Constants.MilesToKm; } return((radius / Constants.EarthMeanRadiusKm) * RadiansToDegrees); }
public SpatialOptions BoundingBoxIndex(SpatialUnits circleRadiusUnits = SpatialUnits.Kilometers) { return new SpatialOptions { Type = SpatialFieldType.Geography, Strategy = SpatialSearchStrategy.BoundingBox, Units = circleRadiusUnits }; }
public static double TranslateCircleRadius(double radius, SpatialUnits units) { if (units == SpatialUnits.Miles) { radius *= Constants.Documents.Indexing.Spatial.MilesToKm; } return((radius / Constants.Documents.Indexing.Spatial.EarthMeanRadiusKm) * RadiansToDegrees); }
public Shape ReadShape(string shape, SpatialUnits? unitOverride = null) { shape = shapeStringConverter.ConvertToWKT(shape); shape = WktSanitizer.Sanitize(shape); // Circle translation should be done last, before passing to NtsShapeReadWriter if (options.Type == SpatialFieldType.Geography) shape = TranslateCircleRadius(shape, unitOverride.HasValue ? unitOverride.Value : options.Units); return ntsShapeReadWriter.ReadShape(shape); }
public static string GetQueryShapeFromLatLon(double lat, double lng, double radius, SpatialUnits units = SpatialUnits.Kilometers) { const double kilometersInMile = 1.60934; var radiusInKilometers = units == SpatialUnits.Kilometers ? radius : radius * kilometersInMile; return "Circle(" + lng.ToString("F6", CultureInfo.InvariantCulture) + " " + lat.ToString("F6", CultureInfo.InvariantCulture) + " " + "d=" + radiusInKilometers.ToString("F6", CultureInfo.InvariantCulture) + ")"; }
public static IndexQuery FromQueryString(string queryString) { var fields = queryString.Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries) .Select(segment => { var parts = segment.Split(new[] { '=' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 1) { return(new { Key = parts[0], Value = string.Empty }); } else { return (new { Key = parts[0], Value = Uri.UnescapeDataString(parts[1]) }); } }).ToLookup(f => f.Key, f => f.Value); var query = new IndexQuery { Query = Uri.UnescapeDataString(fields["query"].FirstOrDefault() ?? ""), Start = fields.GetStart(), Cutoff = fields.GetCutOff(), CutoffEtag = fields.GetCutOffEtag(), PageSize = fields.GetPageSize(250), SkipTransformResults = fields.GetSkipTransformResults(), FieldsToFetch = fields["fetch"].ToArray(), GroupBy = fields["groupBy"].ToArray(), AggregationOperation = fields.GetAggregationOperation(), SortedFields = fields["sort"] .EmptyIfNull() .Select(x => new SortedField(x)) .ToArray() }; double lat = fields.GetLat(), lng = fields.GetLng(), radius = fields.GetRadius(); SpatialUnits units = fields.GetRadiusUnits(); if (lat != 0 || lng != 0 || radius != 0) { return(new SpatialIndexQuery(query) { QueryShape = SpatialIndexQuery.GetQueryShapeFromLatLon(lat, lng, radius, units), SpatialRelation = SpatialRelation.Within, /* TODO */ SpatialFieldName = Constants.DefaultSpatialFieldName, /* TODO */ }); } return(query); }
public SpatialOptions QuadPrefixTreeIndex(int maxTreeLevel, SpatialUnits circleRadiusUnits = SpatialUnits.Kilometers) { if (maxTreeLevel == 0) maxTreeLevel = SpatialOptions.DefaultQuadTreeLevel; return new SpatialOptions { Type = SpatialFieldType.Geography, MaxTreeLevel = maxTreeLevel, Strategy = SpatialSearchStrategy.QuadPrefixTree, Units = circleRadiusUnits }; }
private string TranslateCircleRadius(string shapeWKT, SpatialUnits units) { var match = CircleShape.Match(shapeWKT); if (match.Success == false) return shapeWKT; var radCapture = match.Groups[3]; var radius = double.Parse(radCapture.Value, CultureInfo.InvariantCulture); radius = TranslateCircleRadius(radius, units); return shapeWKT.Substring(0, radCapture.Index) + radius.ToString("F6", CultureInfo.InvariantCulture) + shapeWKT.Substring(radCapture.Index + radCapture.Length); }
public SpatialOptions QuadPrefixTreeIndex(int maxTreeLevel, SpatialUnits circleRadiusUnits = SpatialUnits.Kilometers) { if (maxTreeLevel == 0) { maxTreeLevel = SpatialOptions.DefaultQuadTreeLevel; } return(new SpatialOptions { Type = SpatialFieldType.Geography, MaxTreeLevel = maxTreeLevel, Strategy = SpatialSearchStrategy.QuadPrefixTree, Units = circleRadiusUnits }); }
public Circle(ICircle circle, SpatialUnits units, SpatialOptions options) : base(SpatialShapeType.Circle) { if (circle == null) { throw new ArgumentNullException(nameof(circle)); } if (options == null) { throw new ArgumentNullException(nameof(options)); } Center = new Coordinates(circle.Center); Radius = ShapeStringReadWriter.TranslateDegreesToRadius(circle.Radius, units, options); Units = units; }
public static double TranslateDegreesToRadius(double degrees, SpatialUnits units, SpatialOptions options) { if (options.Type == SpatialFieldType.Cartesian) { return(degrees); } var radius = (degrees * Constants.Documents.Indexing.Spatial.EarthMeanRadiusKm) / RadiansToDegrees; if (units == SpatialUnits.Miles) { radius /= Constants.Documents.Indexing.Spatial.MilesToKm; } return(radius); }
private string TranslateCircleRadius(string shapeWKT, SpatialUnits units) { var match = CircleShape.Match(shapeWKT); if (match.Success == false) { return(shapeWKT); } var radCapture = match.Groups[3]; var radius = double.Parse(radCapture.Value, CultureInfo.InvariantCulture); radius = TranslateCircleRadius(radius, units); return(shapeWKT.Substring(0, radCapture.Index) + radius.ToString("F6", CultureInfo.InvariantCulture) + shapeWKT.Substring(radCapture.Index + radCapture.Length)); }
protected override object GenerateQueryWithinRadiusOf(string fieldName, double radius, double latitude, double longitude, double distanceErrorPct = 0.025, SpatialUnits radiusUnits = SpatialUnits.Kilometers) { return(GenerateSpatialQueryData(fieldName, SpatialIndexQuery.GetQueryShapeFromLatLon(latitude, longitude, radius, radiusUnits), SpatialRelation.Within, distanceErrorPct)); }
/// <inheritdoc /> IAsyncDocumentQuery <T> IFilterDocumentQueryBase <T, IAsyncDocumentQuery <T> > .RelatesToShape(string fieldName, string shapeWkt, SpatialRelation relation, SpatialUnits units, double distanceErrorPct) { Spatial(fieldName, shapeWkt, relation, units, distanceErrorPct); return(this); }
/// <summary> /// Defines a Geohash Prefix Tree index using a default Max Tree Level <see cref="SpatialOptions.DefaultGeohashLevel" /> /// </summary> /// <returns></returns> public SpatialOptions Default(SpatialUnits circleRadiusUnits = SpatialUnits.Kilometers) { return GeohashPrefixTreeIndex(0, circleRadiusUnits); }
/// <summary> /// Defines a Geohash Prefix Tree index using a default Max Tree Level <see cref="SpatialOptions.DefaultGeohashLevel" /> /// </summary> /// <returns></returns> public SpatialOptions Default(SpatialUnits circleRadiusUnits = SpatialUnits.Kilometers) { return(GeohashPrefixTreeIndex(0, circleRadiusUnits)); }
/// <inheritdoc /> IAsyncDocumentQuery <T> IFilterDocumentQueryBase <T, IAsyncDocumentQuery <T> > .RelatesToShape <TValue>(Expression <Func <T, TValue> > propertySelector, string shapeWkt, SpatialRelation relation, SpatialUnits units, double distanceErrorPct) { Spatial(propertySelector.ToPropertyPath(), shapeWkt, relation, units, distanceErrorPct); return(this); }
/// <summary> /// Filter matches to be inside the specified radius /// </summary> /// <param name="radius">The radius.</param> /// <param name="latitude">The latitude.</param> /// <param name="longitude">The longitude.</param> /// <param name="radiusUnits">The units of the <paramref name="radius"/>.</param> public IDocumentQuery <T> WithinRadiusOf(double radius, double latitude, double longitude, SpatialUnits radiusUnits = SpatialUnits.Kilometers) { return(GenerateQueryWithinRadiusOf(Constants.DefaultSpatialFieldName, radius, latitude, longitude, radiusUnits: radiusUnits)); }
public Query MakeQuery(Query existingQuery, SpatialStrategy spatialStrategy, string shapeWKT, SpatialRelation relation, double distanceErrorPct = 0.025, SpatialUnits? unitOverride = null) { SpatialOperation spatialOperation; var shape = ReadShape(shapeWKT, unitOverride); switch (relation) { case SpatialRelation.Within: spatialOperation = SpatialOperation.IsWithin; break; case SpatialRelation.Contains: spatialOperation = SpatialOperation.Contains; break; case SpatialRelation.Disjoint: spatialOperation = SpatialOperation.IsDisjointTo; break; case SpatialRelation.Intersects: spatialOperation = SpatialOperation.Intersects; break; case SpatialRelation.Nearby: // only sort by this, do not filter return new FunctionQuery(spatialStrategy.MakeDistanceValueSource(shape.GetCenter())); default: throw new ArgumentOutOfRangeException("relation"); } var args = new SpatialArgs(spatialOperation, shape) { DistErrPct = distanceErrorPct }; if (existingQuery is MatchAllDocsQuery) return new CustomScoreQuery(spatialStrategy.MakeQuery(args), new ValueSourceQuery(spatialStrategy.MakeRecipDistanceValueSource(shape))); return spatialStrategy.MakeQuery(args); }
/// <summary> /// Filter matches to be inside the specified radius /// </summary> /// <param name="radius">The radius.</param> /// <param name="latitude">The latitude.</param> /// <param name="longitude">The longitude.</param> /// <param name="radiusUnits">The units of the <paramref name="radius"/>.</param> IAsyncDocumentQuery <T> IDocumentQueryBase <T, IAsyncDocumentQuery <T> > .WithinRadiusOf(double radius, double latitude, double longitude, SpatialUnits radiusUnits) { return(GenerateQueryWithinRadiusOf(Constants.DefaultSpatialFieldName, radius, latitude, longitude, radiusUnits: radiusUnits)); }
public Shape ReadShape(string shapeWKT, SpatialUnits? unitOverride = null) { return shapeStringReadWriter.ReadShape(shapeWKT, unitOverride); }
public IDocumentQuery <T> WithinRadiusOf(string fieldName, double radius, double latitude, double longitude, SpatialUnits radiusUnits = SpatialUnits.Kilometers) { return(GenerateQueryWithinRadiusOf(fieldName, radius, latitude, longitude, radiusUnits: radiusUnits)); }
public SpatialCriteria Within(string shapeWkt, SpatialUnits units, double distErrorPercent = Constants.Documents.Indexing.Spatial.DefaultDistanceErrorPct) { return(RelatesToShape(shapeWkt, SpatialRelation.Within, units, distErrorPercent)); }
/// <summary> /// Filter matches to be inside the specified radius /// </summary> IAsyncDocumentQuery <T> IDocumentQueryBase <T, IAsyncDocumentQuery <T> > .WithinRadiusOf(string fieldName, double radius, double latitude, double longitude, SpatialUnits radiusUnits) { return(GenerateQueryWithinRadiusOf(fieldName, radius, latitude, longitude, radiusUnits: radiusUnits)); }
public static string GetQueryShapeFromLatLon(double lat, double lng, double radius, SpatialUnits units = SpatialUnits.Kilometers) { const double kilometersInMile = 1.60934; var radiusInKilometers = units == SpatialUnits.Kilometers ? radius : radius * kilometersInMile; return("Circle(" + lng.ToString("F6", CultureInfo.InvariantCulture) + " " + lat.ToString("F6", CultureInfo.InvariantCulture) + " " + "d=" + radiusInKilometers.ToString("F6", CultureInfo.InvariantCulture) + ")"); }