为什么 GPS 报告疯狂的经度数字?

问题描述 投票:0回答:2

我负责维护和开发一款应用程序,该应用程序严重依赖于使用智能手机设备中的 GPS 跟踪用户的驾驶路线。

问题

问题是 GPS 坐标不准确(达到奇怪的程度)。我说的不是几百米,而是几千米。我的客户在新西兰,GPS 坐标是澳大利亚西部海洋中部的位置。

以下是我的客户手机记录的不良数据的示例:

Sample of bad data

如您所见,纬度值似乎是正确的,或者说足够理智。但经度值都固定为 100,这根本不合理。

技术

该应用程序是使用 cordova-android 5.22 和 cordova-ios 4.2.1 构建的,但是我们在使用 Appcelerator 的钛框架的旧版本应用程序中看到了同样的问题(同样仅适用于新西兰客户),所以我不相信这个问题是科尔多瓦或钛特有的。我们也无法重现该问题(开发团队位于加拿大)。

不幸的是,目前我不知道客户端使用的是Android还是iOS,也不知道他们使用的操作系统是什么版本。一旦获得该信息,我将立即更新问题。

除了读取纬度/经度值并将其写入日志文件之外,应用程序不会对纬度/经度值执行任何操作,该日志文件会上传到我们的服务器,并且使用 FLOAT 长度 16,14 读取数据并将其存储到 MySQL 数据库

代码 科尔多瓦应用程序:

geoWatchId = navigator.geolocation.watchPosition(logGeoItem, loggingFailure, {enableHighAccuracy: true});

...

function logGeoItem(geoPoint){
if(loggingState.isLogging){
    console.log(JSON.stringify(geoPoint));
    var newLogItem = {latitude: geoPoint.coords.latitude, longitude: geoPoint.coords.longitude, heading: geoPoint.coords.heading, altitude: geoPoint.coords.altitude, created_datetime: Date.now()};
    loggingState.currentGeoLoggingData.push(newLogItem);
}

}

是的,watchPosition 代码包含在

deviceready
事件中。

NodeJS GPS 数据存储在 MySQL 数据库中

for(var j=0; j<data.location.length; j++) {
    var sqlLocation = "INSERT INTO location (session_id, heading, altitude, latitude, longitude, created_datetime) VALUES";
    sqlLocation += "('" + data.location[j].session_id + "','" + data.location[j].heading + "','" + data.location[j].altitude + "','" + data.location[j].latitude + "','" + data.location[j].longitude + "','" + data.location[j].created_datetime + "');";
    connection.query(sqlLocation, function(err, result){
      log.info(err);
      log.info(result);
      if(err) {
        connection.rollback(function(){
          callback({ result: 'error', errorMsg: constants.errors.ERROR_UPLOAD_LOCATION_DATA });
        });
      }
    });
  }

研究

我在网上爬行,发现几篇不同的文章和堆栈溢出帖子描述了不准确的 GPS 位置,但这些描述的 GPS 位置仍然可能是健全的。

当前的问题是经度值完全疯狂,经度值似乎始终为 100。

我还没有发现任何东西可以表明为什么经度如此不正常,以及为什么它始终是 100。如果我的问题实际上只是读数不准确,我会期望得到各种经度值,而不是恒定的 100。

任何人都可以向我提供有关如何进行调试的建议吗?为什么只有经度固定为100?

mysql floating-point gps location geo
2个回答
2
投票

问题是经度值实际上超出了 MySQL 中设置的最大允许位数。

FLOAT (16,14)

表示最多可以有16位数字,其中14位属于小数点后的数字。

新西兰部分地区的经度值可能 >= 100。 例如,新西兰旺阿雷北部地区是:-35.725043, 174.319490

因为 174.319490 是一个违反 16/14 规则的数字(即使该数字本身不包含小数点后 14 位数字),所以它似乎上限为 100 并用零填充。

如果我将表格更改为

FLOAT (17,14)
类型,允许小数点前有第三位数字,则数据将正确存储。

在 MySQL 5.6.21 上测试


0
投票

那么,如果我可以告诉你什么数学问题或方程,它等于 100.000000000000 的解,这对你有帮助吗?

© www.soinside.com 2019 - 2024. All rights reserved.