2011-05-04 40 views
2

- 正如我在評論中指出的,我應該注意到,我將使用基於LAMP的架構,即MySQL數據庫。抱歉忘了提及這一點。什麼是從地理座標計算本地用戶的最有效方式?

我必須爲iPhone應用程序創建一個PHP後端。該應用程序發送用戶座標並請求關閉10個本地用戶。

我只是想知道什麼是最有效的方式來確定這一點,我不想要掃描整個用戶表,計算他們的地理座標和目標之間的距離從最低到最遠。

任何人都可以建議一個更優雅的解決方案,而不是掃描所有的用戶?謝謝你的時間。

+0

你沒有寫過你正在使用哪個數據庫。有些支持開箱即用,有些支持擴展。 – hakre 2011-05-04 23:44:15

+0

二進制空間分區可以幫助您限制搜索字段。 – 2011-05-04 23:44:37

+0

我將使用MySQL,感謝您的領導:) – bennythemink 2011-05-04 23:47:09

回答

1

你可以用近似的緯度和經度(例如,通過全度,或十分之一度,或任何規模是適當的,你已經得到了分發)桶裏用戶,然後從查詢用戶的水桶向外工作。

不確定額外的複雜性是值得的,但是,除非暴力方法真的是一個表現豬。

+0

參見http://stackoverflow.com/questions/516574/how-can-i-do-efficient-range-searching-counting-with-latitude-longitude - 數據 – 2011-05-04 23:57:30

+0

感謝大衛,也許我太謹慎了,蠻力可能足夠用戶數量我期待 – bennythemink 2011-06-13 00:16:08

0

有多種方法可以做到這一點。這是一個在SQL查詢中執行的方法。

$sql = "Select id, abs($currlat - latitude) + abs($currlon - longitude) as distance from geo_loc_table order by distance asc"; 

問題在於它不是太高效。我會建議使用某種形式的索引軟件來爲您完成這項工作。獅身人面像可能很適合。

+1

要計算實際的差異,實際上會比較複雜。無論如何,我會推薦嘗試Sphinx。 – ChrisChristensen 2011-05-04 23:52:06

+0

謝謝克里斯,我會在未來幾周看看這兩個 – bennythemink 2011-06-13 00:16:57

0

由於地球的曲線,你必須做一些計算

SELECT id, 6371 * ACos(Cos(RADIANS(users.Lat)) * Cos(RADIANS(CurrentLat)) * Cos(RADIANS(CurrentLng) - RADIANS(users.Lng)) + Sin(RADIANS(users.Lat)) * Sin(RADIANS(CurrentLat))) AS distance 
FROM users 
ORDER BY distance 
LIMIT 10; 

distance是公里,如果你想數,由3959

+0

感謝您的建議Bil_fr! – bennythemink 2011-06-13 00:14:28

1

最有效的方法取代6371是使用空間索引或一個空間填充曲線。空間索引將2d複雜度降低到1d複雜度,從而有助於細分曲面。你想尋找尼克的空間索引四叉樹希爾伯特曲線博客。

+0

聽起來很複雜,但我會研究它,謝謝你的答覆墓誌銘 – bennythemink 2011-06-13 00:15:00

+0

你可以在phpclasses.org(hilbert-curve)下載我的希爾伯特曲線班。 – Bytemain 2011-06-18 17:05:51

+0

謝謝墓誌銘:D – bennythemink 2011-06-20 00:18:37

相關問題