private IEnumerable <ResultModel> GetResults(Coordinate originCoordinate, double radius, DistanceUnit distanceUnit) { // Get the boundaries (min and max) latitude and longitude values. This forms a "square" around the origin coordinate // with each leg of the square exactly "X" miles from the origin, where X is the selected radius. var boundaries = new CoordinateBoundaries(originCoordinate.Latitude, originCoordinate.Longitude, radius, distanceUnit); // Select from all of the locations return(Locations // Where the location's latitude is between the min and max latitude boundaries .Where(x => x.Latitude >= boundaries.MinLatitude && x.Latitude <= boundaries.MaxLatitude) // And where the location's longitude is between the min and max longitude boundaries .Where(x => x.Longitude >= boundaries.MinLongitude && x.Longitude <= boundaries.MaxLongitude) // Populate an instance of the Result class with the desired data, including distance/direction calculation .Select(result => new ResultModel { Name = result.Name, Distance = GeoCalculator.GetDistance(originCoordinate.Latitude, originCoordinate.Longitude, result.Latitude, result.Longitude, distanceUnit: distanceUnit), Direction = GeoCalculator.GetDirection(originCoordinate.Latitude, originCoordinate.Longitude, result.Latitude, result.Longitude) }) // Filter by distance. This is necessary because a radius is a circle, yet we've defined a square around the origin coordinate. // This filter removes any extraneous results that would appear in the square's "corners" (imagine placing a circle inside a square of the // same size for visualization). .Where(x => x.Distance <= radius) // Sort by distance .OrderBy(x => x.Distance)); }
public void GetDirectionThrowsArgumentExceptionWithInvalidDestinationCoordinates() { Coordinate origin = Constants.Coordinates.ValidCoordinate; Coordinate destination = Constants.Coordinates.LatitudeBelowMinimum; var ex = Assert.Throws <ArgumentException>(() => GeoCalculator.GetDirection(origin.Latitude, origin.Longitude, destination.Latitude, destination.Longitude)); Assert.AreEqual("Invalid destination coordinates supplied.", ex.Message); }
public void GetDirectionWithCoordinateObjectReturnsCorrectNorthWestResult() { Coordinate origin = Constants.Coordinates.ValidCoordinate; Coordinate destination = Constants.Coordinates.ValidDestinationCoordinate; string direction = GeoCalculator.GetDirection(origin, destination); const string expectedResult = "NW"; Assert.AreEqual(expectedResult, direction); }
public void GetDirectionReturnsCorrectNorthWestResult() { Coordinate origin = Constants.Coordinates.ValidCoordinate; Coordinate destination = Constants.Coordinates.ValidDestinationCoordinate; string direction = GeoCalculator.GetDirection(origin.Latitude, origin.Longitude, destination.Latitude, destination.Longitude); const string expectedResult = "NW"; Assert.AreEqual(direction, expectedResult); }
public async Task <ActionResult> GetBusinessforCustomer(BusinessForClientViewmodel businessForClientViewmodel) { var totalFeedBack = 0.0; var response = await context.Businesses.Include(bt => bt.businessType).Include(f => f.FeedBacks).Where(iv => iv.isVisible).AsNoTracking().ToListAsync(); for (int i = 0; i < response.Count; i++) { if (response[i].FeedBacks.Count > 0) { for (int j = 0; j < response[i].FeedBacks.Count; j++) { if (response[i].FeedBacks[j].OverallRating.HasValue) { totalFeedBack += response[i].FeedBacks[j].OverallRating.Value; } } response[i].OverallRating = totalFeedBack / double.Parse(response[i].FeedBacks.Count.ToString()); } } Coordinate origin = new Coordinate(businessForClientViewmodel.UserLatitude, businessForClientViewmodel.UserLongitude); CoordinateBoundaries boundaries = new CoordinateBoundaries(origin, 10); double minLatitude = boundaries.MinLatitude; double maxLatitude = boundaries.MaxLatitude; double minLongitude = boundaries.MinLongitude; double maxLongitude = boundaries.MaxLongitude; var results = response .Where(x => x.Latitude >= minLatitude && x.Latitude <= maxLatitude) .Where(x => x.Longitude >= minLongitude && x.Longitude <= maxLongitude) .Select(result => new { Store = result, Distance = GeoCalculator.GetDistance(origin.Latitude, origin.Longitude, result.Latitude, result.Longitude, 1), Direction = GeoCalculator.GetDirection(origin.Latitude, origin.Longitude, result.Latitude, result.Longitude) }) .Where(x => x.Distance <= 10) .OrderBy(x => x.Distance) .ToList(); response = results.Select(x => x.Store).ToList(); return(new OkObjectResult(response)); }
protected void btnSearch_Click(object sender, EventArgs e) { double radius = Convert.ToDouble(Radius.SelectedValue); // These coordinates would normally be retrieved from a geocoding API such as Google's or Bing's. // See https://github.com/scottschluer/Geocoder for an easy to use Geocoder API for Google. Coordinate originCoordinate = new Coordinate { Latitude = 34.076234, Longitude = -118.395314 }; // Get the boundaries (min and max) latitude and longitude values. This forms a "square" around the origin coordinate // with each leg of the square exactly "X" miles from the origin, where X is the selected radius. CoordinateBoundaries boundaries = new CoordinateBoundaries(originCoordinate.Latitude, originCoordinate.Longitude, radius); // Select from all of the locations IEnumerable <Result> results = _locations // Where the location's latitude is between the min and max latitude boundaries .Where(x => x.Latitude >= boundaries.MinLatitude && x.Latitude <= boundaries.MaxLatitude) // And where the location's longitude is between the min and max longitude boundaries .Where(x => x.Longitude >= boundaries.MinLongitude && x.Longitude <= boundaries.MaxLongitude) // Populate an instance of the Result class with the desired data, including distance/direction calculation .Select(result => new Result { Name = result.Name, Distance = GeoCalculator.GetDistance(originCoordinate.Latitude, originCoordinate.Longitude, result.Latitude, result.Longitude, 1), Direction = GeoCalculator.GetDirection(originCoordinate.Latitude, originCoordinate.Longitude, result.Latitude, result.Longitude) }) // Filter by distance. This is necessary because a radius is a circle, yet we've defined a square around the origin coordinate. // This filter removes any extraneous results that would appear in the square's "corners" (imagine placing a circle inside a square of the // same size for visualization). .Where(x => x.Distance <= radius) // Sort by distance .OrderBy(x => x.Distance); gvLocations.DataSource = results; gvLocations.DataBind(); }