[英]Performance of lat/long proximity search
我有一個頁面,其中顯示距用戶一定距離內的業務。 我將用戶和企業的緯度和經度存儲在數據庫中。 當前,我正在使用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;
}
當然,這是非常低效的,並且一旦數據庫中有成千上萬的企業,就無法很好地擴展。 有沒有一種方法可以使我做得更好,這樣我就不必先返回數據庫中的每個業務,而不必對每個業務運行此距離計算? 我曾經想過,也許有一種說法,如果半徑是一定的英里數,則緯度/經度應在此范圍內,然后僅對那些范圍進行計算。
謝謝你的建議,賈斯汀
一些谷歌搜索使我回到了該站點: MySQL大圓距離(Haversine公式)
您應該在存儲過程中使用sql語句。 我自己將其用於商店定位器。
我的MSSQL / C#經驗有限,但是您不能編寫存儲過程來做到這一點嗎?
顯然,您可以使用C#來構建SP 。 無需您在服務器而不是數據庫上做所有事情。 我可能是錯的;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.