2014-02-08 67 views
0

我在Symfony2中使用Doctrine。使用經緯度存儲和按距離排序Symfony2 Doctrine

我有一個名爲Landmarks,其中每個實體具有與MapMarker實體1:many關係的實體的數據庫中,並且它是具有latitudelongitude字段,例如該實體MapMarker 「中央公園」可能是一個Landmark與許多「入口」將被存儲爲​​。

然後我有另一個名爲Property的實體,它有1:1MapMarker的關係。

對於任何給定的Property什麼是最好的方式來查找所有附近的Landmarks在數據庫中,按地標的最近MapMarker

在這個應用程序的舊版本,沒有教義或Symfony2中,我在做這樣說:

  1. 檢索所有數據庫中的Landmarks

  2. 對於每個Landmark,經過各其​​在PHP函數中,並計算P roperty's MapMarker's lat,lngLandmarks MapMarker's lat,lng之間的距離。

  3. 如果任何計算出的距離的是小於或等於某個預定常數我選擇(比方說3公里)然後我發鏈接的PropertyLandmarkmany:many relatioship。

  4. 後來,爲Property's附近Landmarks查詢數據庫時,它會去只通過鏈接Landmarks「​​,然後計算,再次呈現最近MapMarker和距離像這樣:

附近的地標爲您的屬性:

  • 中央公園,正門 - 2.4公里

這樣做的好處是,它通過創建PropertyLandmark的永久鏈路,我會自動有一個「短 - 「附近的Landmarks」,爲其計算昂貴的距離公式。

但是,正如您可能注意到的,當添加新的LandmarkLandmark的​​發生更改時,會出現問題。而且,每次搜索到Property時,計算距離的速度仍然很慢(或者如果發現所有Properties的值爲Landmark)則仍然很慢。

真的希望想出一個更好的辦法,現在我是遷移到Symfony2的和教條。

任何想法?

+0

怎麼樣計算的最大/最小緯度和經度(例如,在4個方向的直線爲3公里最高和最低緯度和經度值),那麼你可以進行查詢的地圖標記,並找到lat和在這些值之間。 –

+0

是的,這是我包含在我想出的解決方案中的一個步驟!通過縮小領域在性能上有很大的差異!謝謝@DerickF –

回答

0

那麼Symfony2中和學說將不會從你平時的數據庫/ PHP的約束中解放出來所以它是非常適應現有的邏輯,它的問題。

雖這麼說,我的頭頂,我可能會做這樣的事情:

  • 加入查詢與A之間的緯度/經度(即數據庫:LAT marker_lat之間+ X/marker_lat - X長marker_long + X/marker_long之間 - X)來獲得由mapmarkers接近短名單
  • 編寫一個函數來計算距離,並保持最接近

而不是讓一個全新的表的標記數* X條目,使窮人可擴展性,如果你問我,但顯然這取決於你的應用程序的限制,所以我不能真的認爲你通過。

+0

這基本上就是我最終做的,但是它在細節上有點複雜。 –

相關問題