2016-08-18 40 views
0

我在尋找某個城市搜索地點的最佳解決方案。此外,我需要找到可能接近的地點,因爲有時我們無法在一個小城市找到地點,但5公里以外的地方可能是一個擁有一些地點的更大的城市。但它總是不同的價值,所以我無法想象我怎麼能知道搜索的最大距離。按城市查找地點的最佳做法

我有三個表:

countries

id|code|name

cities

id|lat|lng|southwestLat|southwestLng|northeastLat|northeastLng|countryId|name

locations

id|lat|lng|cityId|name

我有三個想法:

  1. select * from locations where cityId = :myCityId,不靈活的解決方案,因爲這「5公里」
  2. 搜索通過的交叉點與橢圓或矩形的cities.latcities.lng爲中心,southwestLat - northeastLatsouthwestLng - northeastLng爲直徑或高度,但它也不是一個靈活的解決方案,因爲我們可以有一些城市將會接近,但不會在t他的範圍,否則這個範圍可能包括不必要的城市
  3. 得到一個城市多邊形(通過谷歌地圖api等),只在城市搜索,但它與變種1相同,生產力較低。

此外,我可以添加一些距離來增加多邊形/橢圓/矩形的大小。但是,哪個距離?

您對此有何看法? 你有同樣的情況嗎? 你做了什麼來解決它?

預先感謝您!

更新1:,因爲這個問題有關半徑快速搜索,但我正在尋找,而不是一些半徑由城市最好的靈活的搜索解決方案,它不涉及到Whats the fastest way to lookup big tables for points within radius MySQL (latitude longitude)

+0

可能的重複[什麼是在半徑MySQL(緯度經度)]內查找大表的最快方法](http://stackoverflow.com/questions/38548473/whats-the-fastest-way-to-lookup- big-tables-for-points-within-radius-mysql-latit) – e4c5

+0

@ e4c5它只是在半徑範圍內搜索,我的問題更復雜,它並不強迫我選擇這個解決方案 –

回答

0

我沒有找到真正滿足所有問題的答案。

0

有有幾種方法我已經做到了這一點,而且它依賴於需求...

鄰居表

這通常是最快的,你可以建立索引。如果你能得到的所有數據的位置給你相鄰位置,你可以簡單地修改查詢1):

select * 
from neighbours n 
inner join locations l on l.cityId = n.neighbourId 
where n.cityId = @cityId; 

缺點的,這是你需要定義所有鄰居的腿工作。

大圓距離

如果要允許與精確距離的位置,那麼你要看看great circle distance公式。這需要一段時間來計算,因此您可以執行以下兩種選擇之一:

1)使用緯度/經度差異來查找附近位置,然後計算絕對距離。請注意,一旦您開始向北或南偏移太遠,經度將在短距離內發生顯着變化,則這種情況會出現偏差。 2)使用映射表來計算所有位置之間的距離。如果您有需要查找距離的用戶定義位置,則此功能無效。

混合解決方案

上述兩者的混合體可通過計算城市(或多個任意的區域)之間的距離工作。將所有位置分配到這些區域中的一個,然後僅計算到距離搜索區域一定距離內的位置的距離。

+0

這是非常有趣的做到這一點最後一種方式。但是,我可以在哪裏找到關於鄰居的信息,因爲信息太多而無法手動填寫。 –