2017-09-20 41 views
1

我正在構建一個需要用戶有點準確GPS位置的應用程序。現在,我使用:如何強制實現PhoneGap GPS地理定位的最低精度?

navigator.geolocation.getCurrentPosition(geolocationSuccess,geolocationError, 
    { maximumAge: 60000, timeout:8000 , enableHighAccuracy: true }); 

然而當運行應用程序,我越來越position.coords.accuracy與有時或更高的29000值。這是不可接受的。我如何強制更低(更準確)的GPS位置?

它發生在iOS和Android上。我使用

<gap:plugin name="cordova-plugin-geolocation" source="npm" /> 

回答

2

最好accurancy

注可達到:

  • maximumAge設置。
  • timeout取決於你的應用程序是如何使用的(這是一個「navi-應用程序」主要用於汽車或是「慢跑者應用程序」主要用於徒步?)。基本規則:設置較高的timeout的時間越長,您授予硬件GPS芯片以請求準確的座標。
  • 當然,enableHighAccuracy也必須設置爲true

讓我來解釋上述(一點點),更詳細點。

當您將maximumAge設置爲0(零)時,您永遠不會收到「live」-gps-座標(未緩存),因爲即使是最精確的座標也有一定的年齡。這真的取決於你的應用程序要求,這使我到timeout

我會將超時設置爲5秒,因爲我使用的大多數現代設備都可以獲得0.5-3秒之間的座標。它取決於你的應用移動的速度有多快(汽車,徒步)。應用程序移動得越快,就必須設置越少的timeout,否則應用程序可能會得到太不準確的座標。另一方面,timeout不得設置爲0,因爲每次都會立即取消請求,並且您永遠不會收到「實時」-gps-座標。


您也可以使自己的插件或在github例如有更好地控制fork一個項目:

  • 水平/垂直精度
  • ,以確保GPS的硬件芯片總是被使用(始終初始化Android的LocationManager.GPS_PROVIDER)。因爲即使您將enableHighAccuracy設置爲true,也無法保證gps-hardware-chip真的被使用,您只能告訴該插件使用(如果可能)gps衛星,並且強烈依賴於環境條件帶我到下一段。
  • ....

需要注意的是:這並不總是可能的請求,因爲惡劣的環境條件下最準確的coordiantes(街道峽谷,強混濁等)。是否要求您的應用必須隨時隨地獲取座標?那麼你必須放鬆你的準確性要求。

最後但並非最不重要的一點,在成功的請求後,您可以始終檢查座標的準確性屬性,該準確性屬性不得超過某個閾值(取決於應用程序要求),如果它確實發出另一個請求這個例子:

var threshold = "APP-ACCURANCY-REQUIREMENT-NUMBER-HERE"; 

function requestLocation(callback) { 
    navigator.geolocation.getCurrentPosition(
    function (position) { 
     console.log(position); 
     // Does this position fulfill the ACCURANCY-REQUIREMENT of your app? IF SO THEN STOP REQUESTING OTHERWISE REQUEST AGAIN 
     if (position.coords.accuracy < threshold) callback(position); 
     else requestLocation(callback); 
    }, 
    function (err) { 
     console.log(err); 
    }, 
    { 
     maximumAge: 60000,// IS A 1-MINUTE-COORDINATE TOO OLD WHILE DRIVING BY CAR? 130KM/hour -> 36 M/sec 
     timeout: 8000 ,// IS A WAITING-TIME OF 8 SECONDS TOO LONG WHILE DRIVING BY CAR? 
     enableHighAccuracy: true // YES, THIS ATTRIBUTE MUST BE SET TO TRUE 
    } 
); 
} 

requestLocation(function (position) { 
    // position that has got an accuracy less than ACCURANCY-REQUIREMENT 
    console.log('request accurate position', position); 
}); 

希望這個「故事」幫助你,祝你好運!

+0

謝謝,非常有趣。我嘗試停用Wi-Fi和GPS,所以我認爲它會使用移動數據(4G +),但即使在100秒內也會失敗。你知道這件事嗎? – Destal

+0

不客氣。聽起來就像那時手機沒有「位置源」。據我所知,GPS-Symbol(標題中的設置欄中的符號)代表整個系統本地化,因此當它停用時,沒有應用程序能夠請求它們的位置。 – Blauharley

+0

與我的測試Android手機(棒棒糖)沒有選項來停用wifi和保持移動數據本地化方面激活,所以我想它與你的手機一樣。無論哪種方式,手機只能通過使用信號度量來定位到達時間(信號傳播時間,gps)或接收信號強度(wifi或移動數據),但沒有第三種選擇。希望這可以幫助。 – Blauharley