示例#1
0
        public async Task<SearchResult[]> Search(Position position, double radius)
        {
            var tasks = new List<Task<KeyValuePosition[]>>();
            foreach (var key in position.GetQuadKeysInRadius(radius))
            {
                var quadKeyGrain = GrainFactory.GetGrain<IQuadKeyGrain>(key);
                tasks.Add(quadKeyGrain.GetItems());
            }

            await Task.WhenAll(tasks);

            var results = new List<SearchResult>();
            foreach (var item in tasks)
            {
                results.AddRange(item.Result.Select(x =>
                {
                    return new SearchResult
                    {
                        ETag = x.ETag,
                        Key = x.Key,
                        Position = x.Position,
                        Value = x.Value,
                        Distance = x.Position.DistanceTo(position)
                    };
                }));
            }
            return results.Where(x => x.Distance <= radius).ToArray();
        }
示例#2
0
        public static IEnumerable<Change> GetDelta(this Position from, Position to)
        {
            if (from != null && from.Latitude == 0 && from.Longitude == 0) from = null;
            if (to != null && to.Latitude == 0 && to.Longitude == 0) to = null;

            return GetDelta(from.ToQuadKey(), to.ToQuadKey());
        }
示例#3
0
        public void TestDistanceBetweenPoints()
        {
            var position1 = new Position { Latitude = 50, Longitude = 1 };
            var position2 = new Position { Latitude = 51, Longitude = 2 };
            var distance = position1.DistanceTo(position2);

            // should be about 131 km
            Assert.AreEqual(131, Math.Floor(distance / 1000));
        }
示例#4
0
        public static double DistanceTo(this Position position1, Position position2)
        {
            var φ1 = DegreesToRadians(position1.Latitude);
            var φ2 = DegreesToRadians(position2.Latitude);
            var Δφ = DegreesToRadians(position2.Latitude - position1.Latitude);
            var Δλ = DegreesToRadians(position2.Longitude - position1.Longitude);

            var a = Math.Sin(Δφ / 2) * Math.Sin(Δφ / 2) + Math.Cos(φ1) * Math.Cos(φ2) * Math.Sin(Δλ / 2) * Math.Sin(Δλ / 2);
            var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));

            return EarthRadius * c;
        }
示例#5
0
        public void TestGetQuadKeysInRadius()
        {
            var keys = new Position { Latitude = 50, Longitude = 1 }.GetQuadKeysInRadius(1000).ToArray();
            Assert.AreEqual(9, keys.Length);

            var keys2 = new Position { Latitude = 50, Longitude = 1 }.GetQuadKeysInRadius(10000).ToArray();
            Assert.AreEqual(9, keys2.Length);
            Assert.AreNotEqual(keys[0], keys2[0]);

            Assert.IsTrue(keys[4].StartsWith(keys2[4]));
        }
示例#6
0
 public void TestGetQuadKey()
 {
     var key = new Position { Latitude = 50, Longitude = 1 }.ToQuadKey();
     Assert.IsNotNull(key);
     Assert.AreEqual(23, key.Length);
 }