我有一个页面,用于显示位于用户特定英里范围内的商家。我将用户和业务的经度和经度存储在数据库中。目前,我正在使用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;
}
这当然是非常低效的,并且一旦数据库中有数十或数十万个企业,就无法很好地扩展。有没有办法可以做得更好,这样我就不必首先返回数据库中的每一个业务,并针对每个业务运行这个距离计算?我有一个想法,也许有一种方法可以说,如果半径是一定的英里数,那么纬度/经度应该在这个范围内,然后只对那些进行计算。
感谢您的任何建议, 贾斯汀
答案 0 :(得分:2)
一些谷歌搜索让我回到了这个网站:MySQL Great Circle Distance (Haversine formula)
您应该在存储过程中使用sql语句。我自己用它作为商店定位器。
答案 1 :(得分:0)
我的MSSQL / C#体验有限,但您是否可以编写存储过程来执行此操作?
显然你是can use C# to build an SP。保存您在服务器而不是数据库上完成所有操作。我可能错了;)