2010-07-05 3 views
0

У меня есть страница, где я показываю компании, находящиеся в пределах определенного количества миль от пользователя. Я храню широту и долготу пользователя и бизнеса в базе данных. В настоящее время я использую 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 только на этом.

Спасибо за любые предложения, Джастин

+0

Одно предложение: обратные мили в квадрате. Предположительно, вы тестируете 'sqrt (xdiff^2 + ydiff^2) Rup

ответ

2

Некоторые прибегая к помощи привел меня на этот сайт: MySQL Great Circle Distance (Haversine formula)

Вы должны использовать оператор SQL там в хранимой процедуре. Я сам использую его для локатора магазина.

0

Мой MSSQL/C# опыт ограничен, но вы не могли бы написать хранимую процедуру, чтобы сделать это?

Видимо, вы can use C# to build an SP. Сохраняет все, что вы делаете на сервере, а не в БД. Я могу ошибаться, хотя;)

+1

На этой ноте, какую БД вы используете? SQL 2008 имеет встроенный тип данных «география», который сделает это для вас, как и Oracle 10+ (или ранее), но который может быть доступен только в топ-версиях. – Rup

Смежные вопросы