У меня есть страница, где я показываю компании, находящиеся в пределах определенного количества миль от пользователя. Я храню широту и долготу пользователя и бизнеса в базе данных. В настоящее время я использую NHibernate для возврата всех предприятий в базу данных, а затем проверки каждого бизнеса, чтобы узнать, является ли он лат/длинным в пределах X миль от пользователя, а затем создает новый список только предприятий в этом радиусе и возвращает их.Выполнение поиска по длине/длительности поиска
public static List<Business> FindNearbyBusinesses(Coordinates coordinates, int radiusInMiles)
{//TODO: figure out better way to do this performance-wise!
//get all businesses.
var criteria = DetachedCriteria.For<Core.Models.Business>();
var businesses = FindAll(criteria);
//find nearby businesses.
var nearbyBusinesses = new List<Business>();
foreach (var business in businesses)
{
business.MilesToLocation = GeoHelper.GetDistanceBetweenCoordinates(coordinates, business.Coordinates);
if (business.MilesToLocation <= radiusInMiles)
{
nearbyBusinesses.Add(business);
}
}
//sort.
nearbyBusinesses.Sort(delegate(Business b1, Business b2)
{
return b1.MilesToLocation.CompareTo(b2.MilesToLocation);
});
return nearbyBusinesses;
}
Это, конечно, ужасно неэффективен и не масштабируется раз есть десятки или сотни тысяч предприятий в базе данных. Есть ли способ, которым я могу сделать это лучше, чтобы мне не приходилось сначала возвращать каждый бизнес в базе данных и выполнять этот расчет расстояния по отношению к каждому из них? Одна мысль, что у меня была, может быть, есть способ сказать, если радиус - это определенное количество миль, тогда lat/long должен находиться в этом диапазоне, а затем запускать calc только на этом.
Спасибо за любые предложения, Джастин
Одно предложение: обратные мили в квадрате. Предположительно, вы тестируете 'sqrt (xdiff^2 + ydiff^2)
Rup