地理位置不会更新我的步行距离

Posted

技术标签:

【中文标题】地理位置不会更新我的步行距离【英文标题】:Geolocation doesn't update my walked distance 【发布时间】:2018-07-19 12:42:18 【问题描述】:

您好,我正在通过使用 javascript 的地理定位来创建步行跟踪器 web 应用程序。一切正常,除了我必须通过使用旧 latlong 和新 latlong 来计算距离的部分。

代码:

function updateLocation(position) 
   var latitude = position.coords.latitude;
   var longitude = position.coords.longitude;
   var accuracy = position.coords.accuracy;
   var timestamp = position.timestamp;

   document.getElementById("latitude").innerhtml = latitude;
   document.getElementById("longitude").innerHTML = longitude;
   document.getElementById("accuracy").innerHTML = accuracy.toFixed(2) + " meter";
   document.getElementById("timestamp").innerHTML = new Date(timestamp).toLocaleString();


   if (accuracy >= 500) 
     updateStatus("Need more accurate values to calculate distance.");
     return;
   

   if ((lastLat != null) && (lastLong != null)) 
     var currentDistance = distance(latitude, longitude, lastLat, lastLong);
     document.getElementById("currDist").innerHTML =
       "Current distance traveled: " + currentDistance.toFixed(2) + " km";

     totalDistance += currentDistance;

     document.getElementById("totalDist").innerHTML =
       "Total distance traveled: " + currentDistance.toFixed(2) + " km";
   


   lastLat = latitude;
   lastLong = longitude;

   updateStatus("Location successfully updated.");

增加了距离功能*

Number.prototype.toRadians = function() 
return this * Math.PI / 180;

function distance(latitude1, longitude1, latitude2, longitude2) 
// R is the radius of the earth in kilometers
var R = 6371;

var deltaLatitude = (latitude2-latitude1).toRadians();
var deltaLongitude = (longitude2-longitude1).toRadians();
latitude1 = latitude1.toRadians(), latitude2 = latitude2.toRadians();

var a = Math.sin(deltaLatitude/2) *
        Math.sin(deltaLatitude/2) +
        Math.cos(latitude1) *
        Math.cos(latitude2) *
        Math.sin(deltaLongitude/2) *
        Math.sin(deltaLongitude/2);

var c = 2 * Math.atan2(Math.sqrt(a),
                       Math.sqrt(1-a));
var d = R * c;
return d;

希望有人能找出我做错了什么。 谢谢

更新:

我发现地理定位没有更新我的距离的问题.. 这是因为我声明的变量 lastlonglastlat 没有给我以前的位置,它给了我 latitudelongitude 的当前位置,我在 updateLocation 中声明并分配 lastlat 并使用这些变量持续 long。

我现在的问题是如何使用 新位置,找不到任何解决方案。

新更新:

找到了解决此问题的方法。用于计算前 距离我将坐标存储在一个数组中并获得最后一个位置 计算与当前位置的距离。

代码:

 var coords = []; var distance = 0.0;



function calculateDistance(fromPos, toPos) 
    var radius = 6371;
    var toRad = function(number) 
        return number * Math.PI / 180;
    ;

    var latDistance = toRad(toPos.latitude - fromPos.latitude);
    var lonDistance = toRad(toPos.longitude - fromPos.longitude);
    var a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2) + 
            Math.cos(toRad(fromPos.latitude)) * Math.cos(toRad(toPos.latitude)) * 
            Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);

    return radius * (2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))); 



var lastPos = coords[coords.length-1];
    if(lastPos) 

        distance += calculateDistance(lastPos, position.coords);
        document.getElementById("currDist").innerHTML =
    "Current distance traveled: " + distance.toFixed(2) + " km";
    


    coords.push(position.coords);

我不明白的一件事是为什么我的数组中的时间戳未定义?因为经纬度都可以轻松搞定。

【问题讨论】:

“距离”功能在哪里? @McMurphy,距离函数就是harsinformula 每次都返回0吗?南?不明确的? 23 岁? 确实如此!行驶距离总是重置为 0.0km 除非距离大于 0,否则不要更新 Last lat/lng 并且第一次初始化 last lat/lng 【参考方案1】:

有关完整的工作旅程记录器示例,请参阅Google Drive 或GitHub。

请注意 TravelManagerPolyfil.js 中的 filterLocation 函数,因为您可能会获得许多零距离读数并且需要限制 watchPosition。

此代码有效:-

<!DOCTYPE html>
<html>
<body>

<p>Click the button to get your coordinates.</p>

<button onclick="getLocation()">Try It</button>

<p id="demo"></p>

<script>
    var perthLat = 31.9505;
    var perthLon = 115.8605;
    var freoLat = 32.0569;
    var freoLon = 115.7439;
    const EARTH_RADIUS = 6378137; 
    var toRad = 
        function (num) 
            return num * Math.PI / 180;
        ;  
    var calculateDistance =
        function(lat1, lon1, lat2, lon2)
            var dLat = toRad(lat2 - lat1);
            var dLon = toRad(lon2 - lon1);
            var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(this.toRad(lat1)) * 
                    Math.cos(toRad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2);
            var distance = EARTH_RADIUS * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
            return distance;
        

var x = document.getElementById("demo");

function getLocation() 
    if (navigator.geolocation) 
        navigator.geolocation.getCurrentPosition(showPosition);
     else  
        x.innerHTML = "Geolocation is not supported by this browser.";
    


function showPosition(position) 
    x.innerHTML = "Distance = " + 
        calculateDistance(perthLat, perthLon,
                          freoLat, freoLon) / 1000;

</script>

</body>
</html>

【讨论】:

嗨 McMurphy,代码仍然对我不起作用.. 我使用你的代码如下: var currentDistance = this.calculateDistance(latitude, longitude, lastLat, lastLong);我错过了一些使用 tier3toolbox 的库吗? 你能提供你用来测试的4个值吗?你有调试过吗? 你可以在我上面的例子中看到我的价值观。不,我只是使用记事本++ @anonymous 看,不确定您在做什么,但我将答案编辑为计算珀斯和弗里曼特尔之间距离的完整工作示例。答案是乌鸦飞过16公里 感谢您的回答,代码确实运行良好,但它仅适用于固定的 latlong 我想像正在运行的应用程序一样实时跟踪我的距离......跟踪你所做的每一步。

以上是关于地理位置不会更新我的步行距离的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中计算步行距离

如何使用 php 通过谷歌地图获取步行或驾车距离

如何在 Swift 中计算“纯”移动距离?

距离,Google Maps v2 上的 gps 不准确

如何计算百度地图上两点的距离

如何获取当前位置和下一个当前位置之间的距离