예제 #1
0
        private double TranslateCircleRadius(double radius, SpatialUnits units)
        {
            if (units == SpatialUnits.Miles)
                radius *= Constants.MilesToKm;

            return (radius / Constants.EarthMeanRadiusKm) * RadiansToDegrees;
        }
예제 #2
0
 public SpatialOptions BoundingBoxIndex(SpatialUnits circleRadiusUnits = SpatialUnits.Kilometers)
 {
     return(new SpatialOptions
     {
         Type = SpatialFieldType.Geography,
         Strategy = SpatialSearchStrategy.BoundingBox,
         Units = circleRadiusUnits
     });
 }
예제 #3
0
        private double TranslateCircleRadius(double radius, SpatialUnits units)
        {
            if (units == SpatialUnits.Miles)
            {
                radius *= Constants.MilesToKm;
            }

            return((radius / Constants.EarthMeanRadiusKm) * RadiansToDegrees);
        }
예제 #4
0
		public SpatialOptions BoundingBoxIndex(SpatialUnits circleRadiusUnits = SpatialUnits.Kilometers)
		{
			return new SpatialOptions
			{
				Type = SpatialFieldType.Geography,
				Strategy = SpatialSearchStrategy.BoundingBox,
				Units = circleRadiusUnits
			};
		}
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
		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) +
			       ")";
		}
예제 #8
0
        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);
        }
예제 #9
0
		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
			};
		}
예제 #10
0
        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);
        }
예제 #11
0
        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
            });
        }
예제 #12
0
파일: Circle.cs 프로젝트: ikvm/ravendb
        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;
        }
예제 #13
0
        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);
        }
예제 #14
0
        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));
        }
예제 #15
0
 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));
 }
예제 #16
0
 /// <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);
 }
예제 #17
0
		/// <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);
		}
예제 #18
0
 /// <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));
 }
예제 #19
0
 /// <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);
 }
예제 #20
0
 /// <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));
 }
예제 #21
0
		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);
		}
예제 #22
0
 /// <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));
 }
예제 #23
0
		public Shape ReadShape(string shapeWKT, SpatialUnits? unitOverride = null)
		{
			return shapeStringReadWriter.ReadShape(shapeWKT, unitOverride);
		}
예제 #24
0
 public IDocumentQuery <T> WithinRadiusOf(string fieldName, double radius, double latitude, double longitude, SpatialUnits radiusUnits = SpatialUnits.Kilometers)
 {
     return(GenerateQueryWithinRadiusOf(fieldName, radius, latitude, longitude, radiusUnits: radiusUnits));
 }
예제 #25
0
 public SpatialCriteria Within(string shapeWkt, SpatialUnits units, double distErrorPercent = Constants.Documents.Indexing.Spatial.DefaultDistanceErrorPct)
 {
     return(RelatesToShape(shapeWkt, SpatialRelation.Within, units, distErrorPercent));
 }
예제 #26
0
 /// <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));
 }
예제 #27
0
        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) +
                   ")");
        }