两个gps坐标之间的距离 - javascript

Posted

技术标签:

【中文标题】两个gps坐标之间的距离 - javascript【英文标题】:Distance between two gps coordinates - javascript 【发布时间】:2015-05-29 18:43:20 【问题描述】:

自上个月以来我一直在寻找了解这背后的概念,直到现在我得到了这些资源

    How do I calculate distance between two latitude-longitude points? geolib.js Function to calculate distance between two coordinates shows wrong Calculate distance, bearing and more between Latitude/Longitude points

但我仍然无法确定指定坐标之间的正确距离

例如,我有两个坐标

开始纬度:26.26594 开始长:78.2095508 目的地纬度:21.24386 目的地长:81.611

我得到的结果是 655.358 公里,但实际上(我用自行车的里程表测量过)距离只有约 3 公里,那么为什么我会得到这个答案。

我什至检查了我在 geolib.js 上的实现(我在列表项中指定的第二项),它也显示了相同的结果 (655.358)。

我想不通

JS

// initialising the distance calculation

function geoLocationInit() 
        $('.fd-loc-err').html(''); // empty the error shown, if there is any already
        $('.fd-dist-rest-user').html('<img src="/images/loader.gif" />'); // loader
        var options = timeout:120000;
        if (navigator.geolocation) 
            navigator.geolocation.watchPosition(getLocation, gotError, options);
        
        else 
            locationError = 'Your Browser does not support geolocation';
            showLocationError(locationError);
        
    



//finding the coordinates of user

function getLocation(current) 
        var userLat = current.coords.latitude, userLong = current.coords.longitude;
        var distance = getDistance(userLat, userLong, restLatitude, restLongitude);
        $('.fd-dist-rest-user').html('~' + (distance/1000).toFixed(2) + ' km away'); // fd-dist-rest-user is the <div> tag where i have show the distance calculated
    


    function toRad(value) 
        return value * Math.PI / 180;
    


    // calculating distance using Vincenty Formula
    function getDistance(lat1, lon1, lat2, lon2) 
        var a = 6378137, b = 6356752.314245,  f = 1/298.257223563;
        var L = toRad(lon2-lon1);
        var U1 = Math.atan((1-f) * Math.tan(toRad(lat1)));
        var U2 = Math.atan((1-f) * Math.tan(toRad(lat2)));
        var sinU1 = Math.sin(U1), cosU1 = Math.cos(U1);
        var sinU2 = Math.sin(U2), cosU2 = Math.cos(U2);

        var lambda = L, lambdaP, iterLimit = 100;
        do 
        
            var sinLambda = Math.sin(lambda), cosLambda = Math.cos(lambda);
            var sinSigma = Math.sqrt((cosU2*sinLambda) * (cosU2*sinLambda) + (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));
            if (sinSigma==0) return 0;

            var cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLambda;
            var sigma = Math.atan2(sinSigma, cosSigma);
            var sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;
            var cosSqAlpha = 1 - sinAlpha*sinAlpha;
            var cos2SigmaM = cosSigma - 2*sinU1*sinU2/cosSqAlpha;
            if (isNaN(cos2SigmaM)) cos2SigmaM = 0;
            var C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));
            lambdaP = lambda;
            lambda = L + (1-C) * f * sinAlpha * (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));
         while (Math.abs(lambda-lambdaP) > 1e-12 && --iterLimit>0);

        if (iterLimit==0) return NaN

        var uSq = cosSqAlpha * (a*a - b*b) / (b*b);
        var A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
        var B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));
        var deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));
        var s = b*A*(sigma-deltaSigma);
        return s;
    


// Error handling for the geolocation

    function gotError(error) 
        switch(error.code) 
            case 1: 
                locationError = 'You need to give the permission to use your location to calculate the distances between this restaurant and you <button class="btn btn-danger fd-detect-lctn-try-agn">Please try again</button>';
                break;
            case 2:
                locationError = 'TIME OUT - You need to give permission to use your location to show the distance of this restaurant from your current position <button class="btn btn-danger fd-detect-lctn-try-agn">Please try again</button>';
                break;
            case 3:
                locationError = 'It took to long getting your position, <button class="btn btn-danger fd-detect-lctn">Please try again</button>';
                break;
            default:
                locationError = 'An unknown error has occurred, <button class="btn btn-danger fd-detect-lctn">Please try again</button>';
        
        showLocationError(locationError);
    

    function showLocationError(msg) 
        $('.fd-loc-err').html(msg);
        $('.fd-dist-rest-user').html('');
    

我从我的数据库中获取纬度和经度,然后在单击按钮时调用 geoLocationInit 函数(下面是以下代码)

restLongitude = response['longitude'];
restLatitude = response['latitude'];
geoLocationInit(); /* getting location initialisation */

【问题讨论】:

你确定你的gps坐标是对的吗?将这些坐标放入像谷歌地图这样的地图程序中会显示这两个 gps 坐标相距很远,所以你的计算看起来是正确的 是的,我正在使用 HTML5 geolcation API 查找这些坐标,在我的代码中的函数 getLocation 中指定 你在使用什么gelocation api,桌面浏览器或开启gps的移动设备?如果没有 GPS 设备,地理位置将尝试使用 wifi/互联网连接来猜测 GPS 位置,除非路由器使用 gps 设备并进行广播,否则这不是很准确。 @patrick,我也猜这是问题所在,有没有办法从桌面找到精确坐标 我认为唯一的方法是连接 GPS 设备 【参考方案1】:

在Patrick Evans 的 cmets 的帮助下进行了更多研究后,我发现,由于台式机上缺少 gps 设备,我遇到了问题,因此,坐标不准确导致错误距离计算。

根据 Firefox - 位置感知浏览

准确性因地点而异。在某些地方,我们的服务提供商可能能够提供几米以内的位置。然而,在其他领域,它可能远不止于此。我们的服务提供商返回的所有位置仅为估计值,我们不保证所提供位置的准确性。请不要将此信息用于紧急情况。始终使用常识

来源Location-Aware Browsing - How Accurate are the locations

因此,如果想要找到几乎准确的 gps 坐标,则应使用 GPS 设备或 移动设备 中的HTML5 geolocation API,该设备通常安装了 GPS 硬件,因此可以获得准确的坐标

【讨论】:

【参考方案2】:

我尝试修改方法的选项:'geoLocationInit' 以尝试访问可能的最佳位置,但如果是智能手机,则应启用 wifi 和 gps。

应该是这样的:

var options = timeout:120000, enableHighAccuracy: true;

【讨论】:

考虑到这个问题,如果 ip 的位置远离桌面的实际位置,使 enableHighAccuracy 将无助于找到接近准确度的位置

以上是关于两个gps坐标之间的距离 - javascript的主要内容,如果未能解决你的问题,请参考以下文章

用GPS测得两个点两的坐标,怎样算两个点之间的距离和角度

谷歌地图(javascript API):从地址获取 GPS 坐标

如何计算两个GPS坐标点的距离?

计算大量 GPS 坐标之间的成对路由距离

JavaScript 地理定位:检查距 2 gps 坐标的距离

GPS已知首尾坐标 如何求距离