2013-11-22 51 views
1

我已經完成了每隔10秒將gps座標數據集中到服務器的phonegap應用程序。現在根據計算8小時的跟蹤,它將爲每個用戶存儲大約8 * 60 * 6 = 2880條記錄。我目前的要求僅限於使用20位用戶。 (基本上會跟蹤用戶潰敗旅行)如何在mysql中存儲gps座標,然後在沒有時滯的情況下檢索它?

有兩個部分的問題:

  • 什麼是存儲數據,並儘可能快地檢索它的最佳方式。
  • 是否可以在google maps API v3上同時顯示2880個座標?如果不是,顯示旅行路線的最佳方式是什麼?

對於我的一個演示,我有90分左右的好成績,但每8小時每用戶的2880條記錄是令人擔憂的。

感謝


編輯1
儘管這是一個老問題,我最近在弄,我的地圖,我希望我的意見將有助於未來的遊客上顯示約10K分項目:

  • 谷歌地圖,如果現在沒有硬性的限制,你可以顯示在客戶端的點數。
  • 您可以在客戶端顯示的點數完全取決於客戶端`硬件',使用jpeg或gif標記的點數越大,移動或放大時的渲染速度越慢, out
  • 要在地圖上有最大數量的指針並以最小的性能命中,預計算在平移或縮放之前和之後需要呈現的點數將會有所幫助。
+0

不是8 * 60 * 6 = 2,880,因爲它每10秒只有一秒不是每秒? – amaster

+0

您是在地圖上顯示TON引腳還是僅顯示連接引腳的線?您可以嘗試並平滑線條,移除其他所有針,如果它們不在視圖中,則從地圖中刪除一些針。我將它們乘以1E6後存儲GPS座標,大多數地圖API需要它們爲長而不是雙倍。 – JustinDanielson

+0

y你是對的:) 我會繼續編輯我的愚蠢錯誤,你對這個問題的2部分有什麼想法嗎? – Harshwardhan

回答

0

因此,這裏是一個可能的解決方案:

首先,你需要找出多點谷歌地圖API如何處理,仍然表現出了線。我認爲這只是一些測試或研究。無論如何,一旦你發現你的魔法點數顯示繪製你的路徑,然後採取該數字,並乘以2/3

舉例來說,如果一個很好的路徑需要有說90點然後計算90*2/3

原因2/3是下面的循環將返回點的最大數量是平均等於我們用這樣的變量3/2倍使用。 60會給我們平均90地塊。有一種情況下,最多返回的地塊將是(2 * (magical number of points)) - 1,例如我們平均需要90分,那麼我們可以在一些極少數情況下有(2*(90*2/3))-1 = 119 points您只需在實施後進行一些測試,以確保您的魔法分數適用於2/3魔法點數和2 *魔法點數-1的地圖。我希望這不是太混亂......我試着盡我所能解釋。

其餘部分將成爲sudo代碼。你將不得不去適應它爲你連接到MySQL任何語言與:

//get the total number of rows returned 
var total_rows = mysql->num_rows; 
//calculate max to be 2/3 times your magic number for max plots, i.e. 90 
var max_plots = 90*2/3; 
//define empty plots array to fill with coordinates 
var plots = array(); 
//check if total_rows is less than max_plots then: 
if(total_rows > max_plots){ 
    //find the quotient of the the divident total_rows and the divisor max_plots rounded down to the nearest whole int 
    var quotient = floor(total_rows/max_plots); 
    //define variable i to use in loop 
    var i = 1; 
    //loop through returned rows 
    while(row = mysql->fetch_row()){ 
    //return only rows that are the first, last, or are dividable by the quotient evenly; Note: if your language supports it, use the Modulus operator like (i % quotient) == 0 for the last or statement. 
    if(i == 1 || 1 == total_rows || (i - (i * (floor(i/quotient)))) == 0){ 
     //set plots to use on map 
     plots[] = array(
     'lat' => row['lat'], 
     'lon' => row['lon'], 
    ); 
    } 
    //increment counting variable 
    i++; 
    } 
// else if total_rows less than or equal to max_plots retrieve all plots 
} else { 
    while(row = mysql->fetch_row()){ 
    plots[] = array(
     'lat' => row['lat'], 
     'lon' => row['lon'], 
    ); 
    } 
} 

這可能不是最好的方式,因爲它仍然需要檢索所有從數據庫中的行,但它確實解決了如何只在Google地圖上均勻間隔地打印選定的最大數量。

注意:請確保您的查詢通過自動遞增鍵或其他方式對行進行排序,以使得這些圖將按順序輸入到數據庫中。

最詳細的地圖將是一個地圖(2 * magic_plot_number) - 1和你最不詳細的地圖將包含magic_plot_number或如果更低,total_plots的數量。這就是說,8小時跟蹤會繪製一條路徑,每7分鐘51秒,總計61分,超過8小時,使用魔術積分號碼90。越多的點越接近2/3 * the magic plot number

我希望這可以幫助你解決這種情況。

+0

感謝amaster507,幫助,發現谷歌API現在可以處理超過1500點一次。 你的解決方案幫了很大忙。 雖然我還沒有在gmap上測試過我的2880點。但我預計這不會花費太多時間在谷歌地圖上繪製。 我測試了大約1000點,可以在慢速連接上花費10-20秒。 Regards – Harshwardhan

+0

@HarshWardhan謝謝,我真的很樂意考慮解決這個問題。我喜歡數學,這對我來說是合乎邏輯的挑戰:)很高興我能夠幫助你。完成後,我會對您的完成的應用程序感興趣。 – amaster

+0

當然,我會在幾天(一兩次)內進行一次工作演示,除此之外,還會有一位喜歡你的數學愛好者,我該如何與你取得聯繫? 此致敬禮 – Harshwardhan

相關問題