- 正如我在評論中指出的,我應該注意到,我將使用基於LAMP的架構,即MySQL數據庫。抱歉忘了提及這一點。什麼是從地理座標計算本地用戶的最有效方式?
我必須爲iPhone應用程序創建一個PHP後端。該應用程序發送用戶座標並請求關閉10個本地用戶。
我只是想知道什麼是最有效的方式來確定這一點,我不想要掃描整個用戶表,計算他們的地理座標和目標之間的距離從最低到最遠。
任何人都可以建議一個更優雅的解決方案,而不是掃描所有的用戶?謝謝你的時間。
- 正如我在評論中指出的,我應該注意到,我將使用基於LAMP的架構,即MySQL數據庫。抱歉忘了提及這一點。什麼是從地理座標計算本地用戶的最有效方式?
我必須爲iPhone應用程序創建一個PHP後端。該應用程序發送用戶座標並請求關閉10個本地用戶。
我只是想知道什麼是最有效的方式來確定這一點,我不想要掃描整個用戶表,計算他們的地理座標和目標之間的距離從最低到最遠。
任何人都可以建議一個更優雅的解決方案,而不是掃描所有的用戶?謝謝你的時間。
你可以用近似的緯度和經度(例如,通過全度,或十分之一度,或任何規模是適當的,你已經得到了分發)桶裏用戶,然後從查詢用戶的水桶向外工作。
不確定額外的複雜性是值得的,但是,除非暴力方法真的是一個表現豬。
參見http://stackoverflow.com/questions/516574/how-can-i-do-efficient-range-searching-counting-with-latitude-longitude - 數據 – 2011-05-04 23:57:30
感謝大衛,也許我太謹慎了,蠻力可能足夠用戶數量我期待 – bennythemink 2011-06-13 00:16:08
有多種方法可以做到這一點。這是一個在SQL查詢中執行的方法。
$sql = "Select id, abs($currlat - latitude) + abs($currlon - longitude) as distance from geo_loc_table order by distance asc";
問題在於它不是太高效。我會建議使用某種形式的索引軟件來爲您完成這項工作。獅身人面像可能很適合。
要計算實際的差異,實際上會比較複雜。無論如何,我會推薦嘗試Sphinx。 – ChrisChristensen 2011-05-04 23:52:06
謝謝克里斯,我會在未來幾周看看這兩個 – bennythemink 2011-06-13 00:16:57
由於地球的曲線,你必須做一些計算
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
感謝您的建議Bil_fr! – bennythemink 2011-06-13 00:14:28
最有效的方法取代6371是使用空間索引或一個空間填充曲線。空間索引將2d複雜度降低到1d複雜度,從而有助於細分曲面。你想尋找尼克的空間索引四叉樹希爾伯特曲線博客。
聽起來很複雜,但我會研究它,謝謝你的答覆墓誌銘 – bennythemink 2011-06-13 00:15:00
你可以在phpclasses.org(hilbert-curve)下載我的希爾伯特曲線班。 – Bytemain 2011-06-18 17:05:51
謝謝墓誌銘:D – bennythemink 2011-06-20 00:18:37
你沒有寫過你正在使用哪個數據庫。有些支持開箱即用,有些支持擴展。 – hakre 2011-05-04 23:44:15
二進制空間分區可以幫助您限制搜索字段。 – 2011-05-04 23:44:37
我將使用MySQL,感謝您的領導:) – bennythemink 2011-05-04 23:47:09