Производительность поиска по широте / долготе - PullRequest
0 голосов
/ 05 июля 2010

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

Это, конечно, ужасно неэффективно и плохо масштабируется, если в базе данных есть десятки или сотни тысяч предприятий. Есть ли способ, которым я могу сделать это лучше, чтобы мне не нужно было сначала возвращать каждую отдельную компанию в базу данных и выполнять этот расчет расстояния для каждой отдельной компании? Одна мысль, которая у меня возникла, была, может быть, есть способ сказать, что если радиус равен определенному количеству миль, то широта / долгота должны быть в этом диапазоне, а затем выполнить калькуляцию только для них.

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

Ответы [ 2 ]

2 голосов
/ 05 июля 2010

Некоторое приближение Google вернуло меня на этот сайт: MySQL Great Circle Distance (формула Haversine)

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

0 голосов
/ 05 июля 2010

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

Очевидно, вы можете использовать C # для создания SP .Спасает вас все это на сервере, а не в БД.Хотя я могу ошибаться;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...