如何强制PhoneGap GPS地理定位的最低准确度?

时间:2017-09-20 16:39:38

标签: cordova geolocation phonegap

我正在构建一个需要用户精确定位GPS的应用程序。现在我正在使用:

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

然而,在运行应用时,我有时会或position.coords.accuracy获得值29000的{​​{1}}。这是不可接受的。如何强制降低(更准确)GPS位置?

它发生在iOS和Android上。

注意我使用

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

1 个答案:

答案 0 :(得分:2)

可以达到最佳准确度:

  • 设置了较低的maximumAge
  • timeout取决于你的应用程序的使用方式(它是主要用于汽车的“navi-app”还是“jogger-app”主要用于徒步?)。基本规则:设置的timeout越高,您授予hardware-gps-chip请求准确坐标的时间就越长。
  • 当然enableHighAccuracy也必须设置为true

让我在(稍微)更多细节中解释上述几点。

当您将maximumAge设置为0(零)时,您永远不会获得“实时”-gps坐标(未缓存),因为即使是最准确的坐标也已达到一定年龄。这实际上取决于您的应用需求,这会将我带到timeout

我将超时设置为5秒,因为我使用的大多数现代设备都可以获得0.5-3秒之间的坐标。它取决于你的应用程序的移动速度(汽车,徒步)。移动应用程序的速度越快,设置的timeout越少,否则应用程序可能会得到太不准确的坐标。另一方面,timeout不能设置为0,因为每次都会立即取消请求,而您永远不会获得“实时”-gps坐标。

您也可以在github上制作自己的插件或分叉项目,以便更好地控制:

  • 水平/垂直精度
  • 确保始终使用gps-hardware-chip(始终初始化Android的LocationManager.GPS_PROVIDER)。因为即使你将enableHighAccuracy设置为true也无法保证gps-hardware-chip真正被使用,所以你只能告诉这个插件使用(如果可能的话)gps-卫星并强烈依赖环境条件,这使我进入下一段。
  • ....

请注意:由于恶劣的环境条件(街道峡谷,强烈的云量等),并不总是可以请求最准确的坐标。是否要求您的应用程序必须随时随地获取坐标?然后你必须放松你的准确性要求。

最后但并非最不重要的是,在成功请求之后,您始终可以检查坐标的准确性属性,该属性不得超过某个阈值(取决于应用程序要求),如果确实如此,则会另外发出请求例如:

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);
});

希望这个“故事”能帮助你,祝你好运!