簡體   English   中英

緯度/經緯度搜索的性能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM