2013-07-01 79 views
0

用戶註冊我的網站並輸入他們的郵政編碼。我想查詢其他用戶,並按距離排序。我如何根據距離單個緯度/經度的距離對一組緯度/經度進行排序?

我有一個數據庫充滿每個郵政編碼的經緯度點的郵政編碼。

zip_code (char) 
lat (float) 
lon (float) 

我有這將計算兩組緯度/經度之間的距離,但對所有其他郵政編碼運行這在我的分貝是昂貴的方法。我需要在每個郵政編碼組合上運行。我想我可以做一次並將它存儲在某個地方,但我會在哪裏存儲它?似乎很奇怪,每個郵政編碼都有一張表,其中包含與其他郵政編碼的距離。有沒有一種乾淨的方式來做到這一點?

+0

你需要一個圖形(存儲在緩存中):http://networkx.github.io/。只需使用距離初始化邊的權重,並使用帶有zip_code ID的節點來初始化邊。這樣你有O(1)(節點查找)+ O(| E |)(線性在節點的度) – lucasg

+0

我認爲你的問題的標題是誤導,因爲這不是你想知道該怎麼做。 – martineau

+0

您的用戶是否在美國?然後根據lon對經緯度進行排序。那麼你不需要測試lon距離2度或更遠的點。 – TreyA

回答

0

做了一次,並將它存儲在某處聽起來不錯。這裏有一些想法,可能會提供良好的性能與一些考慮到存儲空間而不犧牲準確性:

有像43191郵政編碼,所以全部是1,865,462,481。但距離當然是對稱的,自我獨立的距離毫無用處,立即將其降至932,709,645個條目。我們也可以通過認識到一堆郵政編碼彼此相同或者其中一個包含另一個(例如10178似乎在10016內部,並且它們在地理上都很小)來縮減空間。許多郵政編碼根本沒有用戶,所以我們可能會避免填充這些郵件直到需要它們(即延遲加載緩存)。最後,你可能會扔掉遠距離的結果,其中大的距離被定義爲大於對用戶有用的距離。

對於多個算法來看,看到這個前面的問題:Calculate distance between zip codes and users

特別提示:不要忘了非美國用戶。可憐的非美國用戶。

0

這裏有一個公平的開銷的解決方案,但它會還清的數據集的大小,用戶羣,和/或交易的數量增長:

如果你不已經有一個,使用一個支持空間類型和空間索引的數據庫。我建議PostGIS擴展Postgres的,但大部分的這些步驟也適用於其他啓用空間的數據庫:

  1. 存儲您的郵政編碼的位置爲點幾何類型,而不是兩列的lat和長。
  2. 根據點幾何列創建空間索引。每次添加新的郵政編碼時,其位置都會自動添加到空間索引中。
  3. 假設您不想顯示遠離千里之外的「最近」鄰居,請使用內部函數(PostGIS中的ST_DWithin)來過濾掉那些太遠的郵政編碼。這將顯着減少近鄰的搜索空間。
  4. 最後使用距離函數(PostGIS中的ST_Distance)來計算感興趣的郵政編碼與其近鄰的距離,並使用數據庫返回按距離排序的結果。

通過使用具有空間索引的數據庫和使用該索引的過濾功能,可以顯着加快搜索速度。當需要進行更多空間分析或顯示地圖時,您已經有了一個框架來支持這種新功能。

相關問題