2013-02-03 86 views
2

我正在研究一種移動應用程序,它定期跟蹤用戶的位置,以允許他繪製地圖上旅程的路徑。我們希望添加一項可選功能,告訴他應用程序的其他用戶在他看到的時間範圍內做出了類似的旅程,無論是今天的通勤還是上個月的旅行。我們將其稱爲「路徑匹配」。將地理空間路徑與MongoDB進行比較

當前數據以iOS和Android的應用程序專用存儲目錄中的二進制格式記錄到文件中,該格式可以輕鬆快速地掃描到讀取位置。每個文件都包含一天的位置,一般會運行到大約80KB。

爲了能夠實現路徑匹配功能,我們顯然需要開始將這些位置日誌上傳到我們的服務器(當然有用戶權限),我們正在其上運行PHP。有人建議的MongoDB其地理空間的威力 - 但我有幾個問題,也許人們可以幫助我:

  1. 這似乎是我們可以改變我們的位置,記錄使用BSON來代替。第一個字段是設備或用戶ID,後面是特定日期的位置列表。然後可以將文件上傳到我們的服務器並推送到MongoDB商店。然而,在線文檔似乎只涉及導入由mongodump創建的BSON文件。格式是否足夠穩定,以至於任何應用程序都可以編寫可由MongoDB直接讀取的BSON文件?

  2. MongoDB是否可以在包含多個位置的文檔上或在跨多個文檔形成路徑的位置上運行地理空間查詢?或者這是否會引發你在PHP方面需要超出數據庫之外的邏輯?

+0

你解決了這個問題嗎?我有一個類似的問題,我需要通過給出一組點來找到匹配路徑。但是通過使用帶有LineString的$ geoIntersects,我一無所獲。 – popo

回答

3
  1. 格式是完全穩定,但沒有太多的工具做你的描述。一般來說,你會把它上傳到後端,它會以$_POST['locations']或者其他可能是關聯數組的數組結尾。清理它並將其保存到數據庫中,如下所示:

    $ locs = sanitize($ _ POST ['locations']); ('type'=>'LineString','coordinates'=> $ locs),'user'=> $ userId); $ doc =數組('path'=> $ collection-> insert($ doc);

    在上面的示例中,我使用了一些最新的地理信息(http://docs.mongodb.org/manual/release-notes/2.4/#new-geospatial-indexes-with-geojson-and-improved-spherical-geometry),您需要每晚進行構建才能獲得此內容,但應該在大約一個月內穩定構建。如果您在此之前需要它,可以使用較早的地理API:http://docs.mongodb.org/manual/core/geospatial-indexes/

    MongoDB不讀取BSON文件,但可以使用mongorestore手動加載它們。不過,我強烈建議讓司機爲你做低級別的東西!

  2. 你可以有一個文檔包含一行(在新的地理區域)和一系列點(在舊的地理區域)。我不確定您的意思是「跨越多個文檔的路徑」。

    編輯添加:根據您的評論,您可能想嘗試{path : {$near : {$geometry : userPath}}}找到「附近」的路徑。您也可以嘗試在用戶路徑周圍製作多邊形,並在多邊形內查詢文檔$。

+0

該「LineString」的東西看起來很棒,用於存儲路徑。通過多文檔路徑,我的意思是說,Mongo商店可能最終會包含多個文檔,每個文檔都有特定日期的用戶位置路徑。所以每個用戶每天有一個文檔。我需要弄清楚的是如何在多天內將用戶的路徑與其他用戶的路徑進行比較。最終我們想告訴用戶「在這段時間內,這些人往往靠近你」。看起來Mongo非常適合這個! –

+0

酷!編輯添加更多關於尋找附近路徑的信息。 – kristina

+0

你可以請指定什麼是這個查詢中的用戶路徑的格式{path:{$ near:{$ geometry:userPath}}}我有同樣的要求,但我沒有得到如何傳遞userPath –