예제 #1
0
 public SpatialField(string fieldName, SpatialOptions options)
 {
     this.options          = options;
     ntsContext            = CreateNtsContext(options);
     shapeStringReadWriter = new ShapeStringReadWriter(options, ntsContext);
     strategy = CreateStrategy(fieldName, options, ntsContext);
 }
예제 #2
0
 public SpatialField(string fieldName, SpatialOptions options)
 {
     _options = options ?? throw new ArgumentNullException(nameof(options));
     _ntsContext = CreateNtsContext(options);
     _shapeStringReadWriter = new ShapeStringReadWriter(options, _ntsContext);
     Strategy = CreateStrategy(fieldName, options, _ntsContext);
 }
예제 #3
0
 private NtsShapeReadWriter CreateNtsShapeReadWriter(SpatialOptions opt, NtsSpatialContext ntsContext)
 {
     if (opt.Type == SpatialFieldType.Cartesian)
     {
         return(new NtsShapeReadWriter(ntsContext, false));
     }
     return(geoShapeReadWriter ?? (geoShapeReadWriter = new NtsShapeReadWriter(ntsContext, false)));
 }
예제 #4
0
 private static NtsSpatialContext CreateNtsContext(SpatialOptions options)
 {
     if (options.Type == SpatialFieldType.Cartesian)
     {
         var nts = new NtsSpatialContext(new GeometryFactory(), false, new CartesianDistCalc(), null);
         nts.GetWorldBounds().Reset(options.MinX, options.MaxX, options.MinY, options.MaxY);
         return nts;
     }
     return GeoContext;
 }
예제 #5
0
 internal SpatialOptions(SpatialOptions options)
 {
     Type         = options.Type;
     Strategy     = options.Strategy;
     MaxTreeLevel = options.MaxTreeLevel;
     MinX         = options.MinX;
     MaxX         = options.MaxX;
     MinY         = options.MinY;
     MaxY         = options.MaxY;
     Units        = options.Units;
 }
예제 #6
0
 private static NtsSpatialContext CreateNtsContext(SpatialOptions options)
 {
     if (options.Type == SpatialFieldType.Cartesian)
     {
         var nts = new NtsSpatialContext(new NtsSpatialContextFactory {
             geo = false, distCalc = new CartesianDistCalc(), worldBounds = null
         });
         nts.WorldBounds.Reset(options.MinX, options.MaxX, options.MinY, options.MaxY);
         return(nts);
     }
     return(GeoContext);
 }
예제 #7
0
        private static SpatialStrategy CreateStrategy(string fieldName, SpatialOptions opt, NtsSpatialContext context)
        {
            switch (opt.Strategy)
            {
                case SpatialSearchStrategy.GeohashPrefixTree:
                    return new RecursivePrefixTreeStrategyThatSupportsWithin(new GeohashPrefixTree(context, opt.MaxTreeLevel), fieldName);
                case SpatialSearchStrategy.QuadPrefixTree:
                    return new RecursivePrefixTreeStrategyThatSupportsWithin(new QuadPrefixTree(context, opt.MaxTreeLevel), fieldName);
                case SpatialSearchStrategy.BoundingBox:
                    return new BBoxStrategyThatSupportsAllShapes(context, fieldName);
            }

            return null;
        }
예제 #8
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;
        }
예제 #9
0
 public void UpdateFromSpatialOptions(SpatialOptions spatialOptions)
 {
     Type = spatialOptions.Type;
     ResetToDefaults();
     Strategy     = spatialOptions.Strategy;
     MaxTreeLevel = spatialOptions.MaxTreeLevel;
     if (spatialOptions.Type == SpatialFieldType.Geography)
     {
         Units = spatialOptions.Units;
     }
     else
     {
         MinX = spatialOptions.MinX;
         MaxX = spatialOptions.MaxX;
         MinY = spatialOptions.MinY;
         MaxY = spatialOptions.MaxY;
     }
 }
예제 #10
0
        protected bool Equals(SpatialOptions other)
        {
            var result = Type == other.Type && Strategy == other.Strategy;

            if (Type == SpatialFieldType.Geography)
            {
                result = result && Units == other.Units;
            }

            if (Strategy != SpatialSearchStrategy.BoundingBox)
            {
                result = result && MaxTreeLevel == other.MaxTreeLevel;

                if (Type == SpatialFieldType.Cartesian)
                {
                    result = result &&
                             MinX.Equals(other.MinX) &&
                             MaxX.Equals(other.MaxX) &&
                             MinY.Equals(other.MinY) &&
                             MaxY.Equals(other.MaxY);
                }
            }
            return(result);
        }
예제 #11
0
		protected bool Equals(SpatialOptions other)
		{
			var result = Type == other.Type && Strategy == other.Strategy;

			if (Type == SpatialFieldType.Geography)
			{
				result = result && Units == other.Units;
			}

			if (Strategy != SpatialSearchStrategy.BoundingBox)
			{
				result = result && MaxTreeLevel == other.MaxTreeLevel;

				if (Type == SpatialFieldType.Cartesian)
				{
					result = result
						&& MinX.Equals(other.MinX)
						&& MaxX.Equals(other.MaxX)
						&& MinY.Equals(other.MinY)
						&& MaxY.Equals(other.MaxY);
				}
			}
			return result;
		}
예제 #12
0
 public ShapeStringReadWriter(SpatialOptions options, NtsSpatialContext context)
 {
     this.options              = options;
     this.ntsShapeReadWriter   = CreateNtsShapeReadWriter(options, context);
     this.shapeStringConverter = new ShapeStringConverter(options);
 }
예제 #13
0
 public ShapeStringConverter(SpatialOptions options)
 {
     this.options = options;
 }
예제 #14
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);
        }
예제 #15
0
 public ShapeStringReadWriter(SpatialOptions options, NtsSpatialContext context)
 {
     _options = options;
     _context = context;
     _shapeStringConverter = new ShapeStringConverter(options);
 }
예제 #16
0
 public IndexSettings()
 {
     Spatial = new SpatialOptions();
     Search  = new SearchOptions();
 }