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(); }
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()); }
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)); }
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; }
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])); }
public void TestGetQuadKey() { var key = new Position { Latitude = 50, Longitude = 1 }.ToQuadKey(); Assert.IsNotNull(key); Assert.AreEqual(23, key.Length); }