我负责维护和开发一款应用程序,该应用程序严重依赖于使用智能手机设备中的 GPS 跟踪用户的驾驶路线。
问题
问题是 GPS 坐标不准确(达到奇怪的程度)。我说的不是几百米,而是几千米。我的客户在新西兰,GPS 坐标是澳大利亚西部海洋中部的位置。
以下是我的客户手机记录的不良数据的示例:
如您所见,纬度值似乎是正确的,或者说足够理智。但经度值都固定为 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 中设置的最大允许位数。
FLOAT (16,14)
表示最多可以有16位数字,其中14位属于小数点后的数字。
新西兰部分地区的经度值可能 >= 100。 例如,新西兰旺阿雷北部地区是:-35.725043, 174.319490
因为 174.319490 是一个违反 16/14 规则的数字(即使该数字本身不包含小数点后 14 位数字),所以它似乎上限为 100 并用零填充。
如果我将表格更改为
FLOAT (17,14)
类型,允许小数点前有第三位数字,则数据将正确存储。
在 MySQL 5.6.21 上测试
那么,如果我可以告诉你什么数学问题或方程,它等于 100.000000000000 的解,这对你有帮助吗?