我在Symfony2中使用Doctrine。使用經緯度存儲和按距離排序Symfony2 Doctrine
我有一個名爲Landmarks
,其中每個實體具有與MapMarker
實體1:many
關係的實體的數據庫中,並且它是具有latitude
和longitude
字段,例如該實體MapMarker
「中央公園」可能是一個Landmark
與許多「入口」將被存儲爲。
然後我有另一個名爲Property
的實體,它有1:1
與MapMarker
的關係。
對於任何給定的Property
什麼是最好的方式來查找所有附近的Landmarks
在數據庫中,按地標的最近MapMarker
?
在這個應用程序的舊版本,沒有教義或Symfony2中,我在做這樣說:
檢索所有數據庫中的
Landmarks
對於每個
Landmark
,經過各其在PHP函數中,並計算Property's MapMarker's lat,lng
和Landmarks MapMarker's lat,lng
之間的距離。如果任何計算出的距離的是小於或等於某個預定常數我選擇(比方說3公里)然後我發鏈接的
Property
到Landmark
在many:many
relatioship。後來,爲
Property's
附近Landmarks
查詢數據庫時,它會去只通過鏈接Landmarks
「,然後計算,再次呈現最近MapMarker
和距離像這樣:
附近的地標爲您的屬性:
- 中央公園,正門 - 2.4公里
- 等
這樣做的好處是,它通過創建Property
和Landmark
的永久鏈路,我會自動有一個「短 - 「附近的Landmarks
」,爲其計算昂貴的距離公式。
但是,正如您可能注意到的,當添加新的Landmark
或Landmark
的發生更改時,會出現問題。而且,每次搜索到Property
時,計算距離的速度仍然很慢(或者如果發現所有Properties
的值爲Landmark
)則仍然很慢。
真的希望想出一個更好的辦法,現在我是遷移到Symfony2的和教條。
任何想法?
怎麼樣計算的最大/最小緯度和經度(例如,在4個方向的直線爲3公里最高和最低緯度和經度值),那麼你可以進行查詢的地圖標記,並找到lat和在這些值之間。 –
是的,這是我包含在我想出的解決方案中的一個步驟!通過縮小領域在性能上有很大的差異!謝謝@DerickF –