我负责维护和开发一款严重依赖于在智能手机设备中使用GPS跟踪用户驾驶路线的应用。
问题
问题是GPS坐标不准确(到了奇怪的程度)。我不是说几百米,我说话就像几千米。我的客户在新西兰,GPS坐标位于澳大利亚西部海洋中部。
以下是我的客户端录制的电话正在录制的错误数据示例:
如您所见,纬度值似乎正确或足够清晰。但是经度值都固定在100,这根本不是理智的。
技术
该应用程序是使用cordova-android 5.22和cordova-ios 4.2.1构建的,但我们看到使用Appcelerator的钛框架的旧版本应用程序存在同样的问题(同样仅限于新版本)新西兰客户),所以我不相信这个问题是针对cordova或钛的。我们也无法重现该问题(开发团队位于加拿大)。
不幸的是,此时我不知道客户端是使用Android还是iOS,或者他们使用的是哪个版本的操作系统。我会立即更新问题。
除了读取它们并写入日志文件之外,应用程序不对纬度/经度值执行任何操作,该日志文件将上载到我们的服务器并使用FLOAT长度16读取数据并将其存储到MySQL数据库中, 14
代码 科尔多瓦应用程序:
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
事件中。
存储在MySQL DB中的NodeJS GPS数据
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?
答案 0 :(得分:2)
问题是经度值实际上超过了MySQL中设置的最大允许数字。
FLOAT (16,14)
表示您最多可以有16位数,其中14位属于小数点后的数字。
新西兰部分地区的经度值可能> 100。 例如,Whangarei Northland,New Zealand是:-35.725043,174.319490
因为174.319490是一个打破16/14规则的数字(即使数字本身在小数点后面不包含14位数),它似乎在100和零填充时加盖。
如果我将表改为类型FLOAT (17,14)
,允许小数点前的第三个数字,则数据存储正确。
在MySQL 5.6.21上测试