2013-09-25 50 views
11

我有一系列代表街道(黑色線條)和積分的點,代表着地圖上的一個地方(紅色點)。我想查找指定街道附近的所有點,按距離排序。我還需要能夠指定最大距離(藍色和綠色區域)。下面是一個簡單的例子:在mongodb找到LineString附近的相關信息排序按距離排序

enter image description here

我想使用$near操作者的,但它僅接受Point作爲輸入,而不是LineString

mongodb如何處理這種類型的查詢?

+0

我不認爲這是可能的點列表。但是,你可以「放大」街道和使用'$ polygon'或使用'$ near'和做其他的客戶端或使用一系列'$ near'的重疊領域。 – mnemosyn

+0

你「放大」街道和使用$多邊形? – icaro56

+0

嗨,你有沒有找到解決辦法? –

回答

7

正如您所提到的,Mongo目前不支持除Point以外的其他任何內容。你有沒有遇到過路線拳擊手的概念? 1它幾年前在Google地圖上非常流行。鑑於你繪製的線,找到在dist(x)之內的止損點。這是通過在線的每個點周圍創建一系列邊界框並搜索桶內的點來完成的。

我剛剛意識到Mongo只能使用點,我認爲這是合理的,所以我偶然發現了你的問題。

我已經有幾個選擇,如何做到這一點(他們擴大@mnemosyn在評論中說)。使用我正在處理的數據集,所有這些都在客戶端,所以我可以使用routeboxer,但是爲了性能原因,我想在服務器端實現它。這裏是我的建議:

  1. 斷裂LineString分解成其各個座標集,並使用每個那些$near查詢結果相結合,並提取了獨特的一套。有些算法通過減少點數來簡化複雜的線條,但是一個簡單的點很容易編寫。

  2. 和上面一樣,但是作爲存儲過程/函數。我還沒有玩過Mongo的存儲功能,我不知道他們的驅動程序有多好,但是這可能比上面的第一個選項更快,因爲你不需要往返,並且取決於機器您的Mongo實例已被託管,計算速度可能會更快(微秒)。

  3. 執行routeboxer方法服務器端(已在PHP中完成),然後使用上述2中的任意一個找到停止位,即$within所產生的邊界框。由於routeboxer方法返回矩形,因此可以將所有這些矩形合併爲一個覆蓋您的路線的多邊形,並且只需執行$within即可。 (什麼@mnemosyn建議)。

  4. 編輯︰我想到了這一點,但忘記了它,但它可能有可能實現上述使用聚合框架的一些。

這是我將要工作不久(希望),我會開源我在此基礎上我最終會導致(S)的東西。

編輯:我必須指出,雖然1和2有一個缺陷,如果你有一條線,說2公里,並且你想要的點在1以內的點。你的路線8km,你顯然會錯過你的路線之間的所有點。解決的辦法是簡化它,當注入點到你的線(我知道,拍在添加新的回來時減少點的目標)。

3的缺陷則是,它不會永遠是準確的,因爲你的多邊形內的一些點可能比你的極限的距離更大,但差別不會是你的極限的顯著比例。

[1]google maps utils routeboxer

0

至於你說蒙戈的$附近僅適用於點不是行作爲然而,如果從找點翻轉你的前提線附近找點附近的線,則中心點您可以使用您的點爲中心,以線爲目標

這是

foreach line find points near it 

之間的區別
foreach point find line near it 

,如果你有大量的點來檢查,你可以結合這與nevi_me的回答減少需要檢查,以更小的子集