从硬件GPS获取坐标

10

我发现了很多有关GPS坐标的问题,但没有一个证实使用移动硬件GPS而不是像geoLocation等Web GPS的问题。

我的当前方法:

我正在使用navigator.geolocation.getCurrentPosition()纬度/经度来自Web,以下是代码:

function getGPS(funcCallBack)
{
   if (navigator.geolocation)
   {
     var timeoutVal = getCookie("GPSTimeout");
     navigator.geolocation.getCurrentPosition(sucess
                                             ,error
                                             ,{enableHighAccuracy: true
                                              ,timeout: timeoutVal
                                              ,maximumAge: 0}
                                             );
   }
   else{
   alert('GPS is turned off, or was not possible to find it. Now, doing the login without localization.');
   window.gpsLat = 0;
   window.gpsLng = 0;
   window.gpsAcc = 0;
   funcCallBack();
   }
   function sucess(position) //sucess
   {
      window.gpsLat = position.coords.latitude;
      window.gpsLng = position.coords.longitude;
      window.gpsAcc = position.coords.accuracy;
      funcCallBack();
    }
    function error()         //error
    {
      window.gpsLat   = 0;
      window.gpsLng   = 0;
      window.gpsAcc   = 0;
      funcCallBack();
    }
}

我的问题:

有时候我登陆时无法获得GPS坐标(会显示为0),有时候获得的坐标的精确度超过了2000,不够准确。

顺便说一下,我正在使用数据网络服务来测试GPS,但如果使用Wi-Fi连接,则可以以不到100的精度运行。

细节:

也许您在抱怨以下内容:

  1. timeoutVal:这是一个cookie,内部包含数字5000
  2. funcCallBack:这是一个继续登陆操作的函数。
  3. window.gpsLat:这是一个全局变量,包含从geoLocation获取的Latitude值。
  4. window.gpsLng:这是一个全局变量,包含从geoLocation获取的Longitude值。
  5. window.gpsAcc:这是一个全局变量,包含从geoLocation获取的Accuracy值。

我想要什么?

我想要一个JavaScript或PHP解决方案,可以从移动硬件设备中获取坐标,即本地GPS,而不是使用geolocation,当本地GPS关闭时,要求用户打开它。


有时候,当GPS“热身”到你特定位置上方的卫星阵列时,前几次读数可能会有点不稳定。你还可以检查watchPosition()返回的频率来检测GPS / WiFi:WiFi更新不太频繁,但GPS有一点嘈杂。 - dandavis
1
正如eddiec在他的回答中最后几行所建议的那样,如果你正在构建一个移动应用程序,你应该 绝对 使用像PhoneGap这样的框架,它在大多数情况下提供完整或半完整的本地GPS实现访问。使用内置浏览器解决方案是一个薄弱的想法。顺便说一句:不要被混淆了--PhoneGap API的Geolocation对象具有与浏览器(HTML5)中的Geolocation相同的函数名称,但背后支持更加充分的本地GPS实现。 - trejder
2个回答

12

你应该使用 JavaScript 来获取位置信息,而不是 PHP。PHP 只能进行 IP 地址查找,这是确定位置最不准确的方法。

navigator.geolocation.getCurrentPosition() 的工作方式是使用当前可用的最准确数据。对于移动设备,如果启用,则首先使用 GPS,然后是 Wi-Fi。

如果本地 GPS 已启用,则 JavaScript 将访问该数据而不是 Wi-Fi 数据,但是如果 GPS 数据不可用,则无法阻止检查 Wi-Fi 数据。

最佳解决方案是检查准确度字段,如果不在您满意的范围内,请要求用户启用 GPS。

或者,如果您正在构建混合应用程序,大多数框架(如 PhoneGap 等)都具有直接查询设备 GPS 的 API。使用 PhoneGap 检查是否已启用 GPS


确定 navigator.geolocation.getCurrentPosition() 当前使用的是最准确的数据吗?而且,您知道本机 GPS 的平均准确度是多少吗? - Paulo Roberto Rosa
而且,我在浏览器方面遇到了一些问题,比如当我使用火狐浏览器时,我可以从数据互联网服务中获取GPS坐标,而当我使用Opera或其他任何浏览器时,我只能得到0坐标,你知道这是什么原因吗? - Paulo Roberto Rosa
它确实提供了最精确的数据(如果有本地GPS的话),但我不能告诉你平均值,我相信它取决于设备和条件。其实,只要在准确度范围内,您不关心数据来自哪里。 - eddiec
此外,现在使用最新版本的Chrome可以在Android设备上运行JS,这将能够为您提供一些测试数据以开始工作。 - eddiec
关于geoLocation的有用信息以及PhoneGap的提示非常赞,也许我可以建议老板开始使用它,但目前他只想要一个任何人都可以通过在浏览器中输入URL轻松访问的网页,不需要下载或安装任何内容到手机。 - Paulo Roberto Rosa

4

地理定位API并没有直接提供检查GPS开关的方法,但您可以捕获地理定位的错误,并基于错误类型得出结论。

例如,如果出现POSITION_UNAVAILABLE(2)错误,则表示网络连接断开或无法联系卫星定位。但这并不是确定的方式,您需要处理一些条件!

我建议使用watchPosition(我同意它的含义是持续监视位置),您可以将其保持打开状态,如果GPS发生错误,您可以提示用户打开GPS设备/ WiFi /互联网。如果成功回调,则可以清除监视。

 var watch =null;
 function success(position)
{
   var lat = position.coords.latitude;
   var lon= position.coords.longitude;
   if (watch != null ) 
 /*Need to take care .. as maybe there is no gps and user 
  want it off so keep attempt 3 times or some kind a way out otherwise it will 
  infinite loop */
    {
        navigator.geolocation.clearWatch(watch);
        watch = null;
    }

}
function getLatLon()
{
    var geolocOK = ("geolocation" in navigator);
    if ( geolocOK ) 
    {
        var option = {enableHighAccuracy:true, maximumAge: 0,timeout:10000 };
        watch =  navigator.geolocation.watchPosition(success, fails,  option);
    }
    else {
        //disable the current location?  
    }
}
function fails()
{
    alert("please turn on the GPS !");
}
getLatLon(); 

+1,这是一个很好的答案,但我不想观看位置,我只想获取它一次并将其发送到我的服务器上并保存在数据库中,以便知道用户登录时所在的位置。另外,由于我正在使用数据互联网服务(这是一个贫困缓慢的服务),因此需要尽可能少地使用互联网来完成此操作。 - Paulo Roberto Rosa
我只能想到一个解决方案:在第一次访问时执行上述js,并将lat/lon保存在服务器或cookie端,然后关闭它/不包含在下一次访问中的地理位置js。 - Neha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接