代码之家  ›  专栏  ›  技术社区  ›  Norman Breau

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

  •  0
  • Norman Breau  · 技术社区  · 9 年前

    问题

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

    以下是手机正在记录的客户记录的错误数据的示例:

    Sample of bad data

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

    技术

    不幸的是,目前我不知道客户端是使用Android还是iOS,或者他们使用的是什么版本的操作系统。我会尽快更新这个问题。

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

    代码 Cordova应用程序:

    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?

    1 回复  |  直到 9 年前
        1
  •  2
  •   Norman Breau    9 年前

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

    FLOAT (16,14)

    意味着您最多可以有16位数字,其中14位属于小数点后的数字。

    新西兰的部分地区可能具有经度值>=100 例如,新西兰旺加莱北国为:-35.725043、174.319490

    由于174.319490是一个打破16/14规则的数字(即使数字本身不包含小数点后的14位数字),因此它似乎以100和零填充结束。

    如果我将表更改为type FLOAT (17,14) 允许小数点前有第三位数字,数据被正确存储。

    在MySQL 5.6.21上测试