2013-02-20 59 views
3

我是iOS上的一個應用程序,它具有Trip Planner。 例如,我使用google方向API獲取從紐約到波士頓的路線。 我有50個不同的緯度經度在地圖上製作折線。 之後,我需要獲得這條路線上的地點,我可以在去波士頓的途中參觀。如何通過lat long來實現高效的多搜索點

谷歌路線API給我:

latitude = "30.308399"; longitude = "-89.748299"; 
latitude = "30.310930"; longitude = "-89.818604"; 
latitude = "30.350050"; longitude = "-89.916054"; 
latitude = "30.432850"; longitude = "-90.098549"; 
.... 

現在每一點我做搜索的MySQL數據庫得到最接近的地方:

選擇 ID,標題,TYPE_ID,service_id爲,北緯,經度,州,城市,郵編,地址, (3959 * ACOS(COS(弧度(31.72723))* COS(弧度(緯度))* COS(弧度(經度) - 弧度(-106.3047))+罪( 弧度(31.72723))* sin(弧度(緯度))) )作爲一個距離ASC限額由 地方距離< = 10階距離10

但是,如果從紐約到舊金山的這次旅行中,我將有800分,我會做800查詢數據庫,需要更多的總共超過2秒。我有7個不同的表,這將是14秒。

什麼是最好的,如果做的?

Example

+0

數據庫內多少點?在總 – 2013-02-20 06:39:24

+0

7表有80K地方 – 2013-02-20 06:40:06

+0

你需要做的地方在DB更organized..may是通過運行K-均值聚類和將它們分成不同clusters..then而不是搜索每個可以通過每個羣集搜索的地方..大小的集羣..應該取決於水平的縮放.. – Shivam 2013-02-20 06:52:51

回答

-1

嘗試把在最小距離子句,其中Diatance> 100等

這被稱爲錐形掃描。您從低分辨率開始,然後隨着距離越來越近而不斷增加。

+0

它沒有改變,他仍然需要計算距離。 – 2013-02-20 06:29:55

+0

仍然需要對數據庫進行5 600次查詢。 – 2013-02-20 06:31:32

+0

他不會收到數百個數據點,也許是幾十個。這會加快他的查詢速度。這是直觀的解決方案 - 對於非常大的距離,首先進行「更廣泛」的掃描,然後消除距離。 – 2013-02-20 06:34:34

1

最好的我可以建議這是Voronoi diagram。但很難實施。

備註: 由於您只有80k點,您可以將所有這些點緩存在應用程序中,並從應用程序所需的點返回。

2

這裏有一種方法,使其更快:

在表(1)把索引的經度和緯度。

(2)在該查詢中,選擇第一隻在路線上的點,足夠接近的水平和垂直距離內的那些地方很有趣。按緯度範圍和經度範圍選擇。

(3)然後這些點由距離,內部或查詢外排序。