纬度/长距离搜索的性能

时间:2010-07-05 14:01:19

标签: c# nhibernate

我有一个页面,用于显示位于用户特定英里范围内的商家。我将用户和业务的经度和经度存储在数据库中。目前,我正在使用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;
        }

这当然是非常低效的,并且一旦数据库中有数十或数十万个企业,就无法很好地扩展。有没有办法可以做得更好,这样我就不必首先返回数据库中的每一个业务,并针对每个业务运行这个距离计算?我有一个想法,也许有一种方法可以说,如果半径是一定的英里数,那么纬度/经度应该在这个范围内,然后只对那些进行计算。

感谢您的任何建议, 贾斯汀

2 个答案:

答案 0 :(得分:2)

一些谷歌搜索让我回到了这个网站:MySQL Great Circle Distance (Haversine formula)

您应该在存储过程中使用sql语句。我自己用它作为商店定位器。

答案 1 :(得分:0)

我的MSSQL / C#体验有限,但您是否可以编写存储过程来执行此操作?

显然你是can use C# to build an SP。保存您在服务器而不是数据库上完成所有操作。我可能错了;)