地理位置不会更新我的步行距离
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;
希望有人能找出我做错了什么。 谢谢
更新:
我发现地理定位没有更新我的距离的问题.. 这是因为我声明的变量 lastlong 和 lastlat 没有给我以前的位置,它给了我 latitude 和 longitude 的当前位置,我在 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 我想像正在运行的应用程序一样实时跟踪我的距离......跟踪你所做的每一步。以上是关于地理位置不会更新我的步行距离的主要内容,如果未能解决你的问题,请参考以下文章