移动设备的距离跟踪精度

时间:2014-12-10 18:19:51

标签: android ios cordova mobile gps

我正在编写一个距离跟踪器,用于通过手机跟踪汽车驱动器的里程数。我正在使用cordovacordova geolocation plugin。代码似乎在地理位置插件接收坐标的地方正确运行,我使用haversine formula来计算两个坐标之间的距离。但是,我的跟踪器是不准确的,因为我天真地使用不准确的lat / lon坐标。 position似乎有position.accuracyposition.speed。所以我希望其中一个或两个可能有用。

  

准确度:纬度和经度坐标的精度等级,以米为单位。 (数)   速度:设备的当前地速,以米/秒为单位。 (数目)

我的问题是:是否有已知的跟踪距离解决方案来处理移动电话上可能不准确的纬度/经度信息?

更具体的问题:

  • position.speed在移动电话上的准确程度如何?
  • 手机倾向于倾向于存在什么位置。准确性? (我很好奇,因为我想忽略带有position.accuracy>阈值的纬度/经线。所以我试图找出一个好的门槛会是多少)。

以下是我当前代码的片段:

function DistanceTracker() {
    this._currentPosition = null;
    this.miles = 0.0;
}

DistanceTracker.prototype.start = function () {
    var self = this;
    navigator.geolocation.watchPosition(
        /*success*/function (position) {
            self.updateDistance(position);
        },
        /*fail*/function (errorPosition) { 
            //exception handling uses https://github.com/steaks/exceptions.js
            throw new exceptions.Exception("Error in geolocation watchPosition", { data: errorPosition }); 
        },
        { enableHighAccuracy: true, timeout: 5000 });
    )
};

DistanceTracker.prototype.updateDistance = function (position) {
    if (this._currentPosition !== null) {
        this.miles = this.miles + this.getDistanceFromLatLonInMiles(
            this._currentPosition.coords.latitude,
            this._currentPosition.coords.longitude,
            newPosition.coords.latitude,
            newPosition.coords.longitude);
    }
};

//Copied from http://stackoverflow.com/questions/27928/how-do-i-calculate-distance-between-two-latitude-longitude-points
function getDistanceFromLatLonInMiles(lat1,lon1,lat2,lon2) {
    var R = 6371; // Radius of the earth in km
    var dLat = deg2rad(lat2-lat1);  // deg2rad below
    var dLon = deg2rad(lon2-lon1);
    var a =
        Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
        Math.sin(dLon/2) * Math.sin(dLon/2)
        ;
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d = R * c; // Distance in km
    return d * KILOMETERS_TO_MILES_RATIO;
}

function deg2rad(deg) {
    return deg * (Math.PI/180);
}

1 个答案:

答案 0 :(得分:0)

我建议使用英尺或米而不是公里来使用。我发现它更加准确。我知道它似乎不应该有所作为。试试吧。

替换     var R = 6371; //以千米为单位的地球半径

使用     var R = 20890584; //英尺