我和我的搭档正在为我们的学校论文开发一个练习网络应用程序。我们正在尝试获得一个跑步者的位置,并在他的训练中跟踪他的地理定位api的观察位置()函数。在屏幕上,跑步者可以检查他当前的距离.
这是被我们卡住的点,我们只能计算起点到终点之间的距离,但是当航向是一个圆时,覆盖的总距离为零。
因此,我们有了将多个坐标存储在数组中并计算这些距离之和的解决方案,但我们不是javascript中最熟练的人。如果你想要更多的信息的话,我希望这有一点意义。
更新:这就是我到目前为止所得到的。
<script>
function startTracking() {
var startPos;
var coords = [];
// Reused code - copyright Moveable Type Scripts - retrieved May 4,2010.
// http://www.movable-type.co.uk/scripts/latlong.html
// Under Creative Commons License http://creativecommons.org/licenses/by/3.0/
function calculateDistance(lat1, lon1, lat2, lon2) {
var R = 6371000; // m
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) *
Math.sin(dLon/2) * Math.sin(dLon/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
return d.toFixed(2); }
Number.prototype.toRad = function() {
return this * Math.PI / 180; }
if (navigator.geolocation) {
watchID = navigator.geolocation.watchPosition(function(position) {
currentLat = position.coords.latitude;
currentLon = position.coords.longitude;
coords.push([currentLat, currentLon]);
console.log(coords);
}, function(error) {
alert("Error occurred. Error code: " + error.code);
// error.code can be:
// 0: unknown error
// 1: permission denied
// 2: position unavailable (error response from locaton provider)
// 3: timed out
});
// end error }; // end if }; // end startTracking
function stopTracking() {
if (navigator.geolocation) {
navigator.geolocation.clearWatch(watchID); }
};
</script>
所以,现在我的问题是,如何在数组上循环计算所有给定坐标之间的距离,以得到(或多或少)精确的距离?
发布于 2014-05-03 19:22:47
这应该能完成你想要做的事情。可以随意在代码中使用它,或者将其拆开并从中学习。本质上,它将坐标附加到数组中,并同时计算距离。如果你只想要距离的话,你可以保存最后一个坐标而不是所有的坐标。这应该会让你开始朝着正确的方向去做任何你想做的事情。
var tracker = (function() {
var watchID;
var watchCallback;
var coords = [];
var distance = 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)));
}
function displayError(error) {
alert("Error occurred. Error code: " + error.code);
// error.code can be:
// 0: unknown error
// 1: permission denied
// 2: position unavailable (error response from locaton provider)
// 3: timed out
}
function appendPosition(position) {
// Calculate distance from last position if available
var lastPos = coords[coords.length-1];
if(lastPos) {
distance += calculateDistance(lastPos, position.coords);
}
// Add new coordinates to array
coords.push(position.coords);
// Call custom callback
if(watchCallback) {
watchCallback(position, distance, watchID);
}
}
function startWatcher(callback, options) {
if ("geolocation" in navigator) {
// Watch position updates
watchCallback = callback;
// Watch for updates
watchID = navigator.geolocation.watchPosition(appendPosition, displayError, options);
var registerWatchPosition = function(position) {
appendPosition(position);
};
} else {
alert('Geolocation is not supported!');
}
}
function forceUpdate(options) {
navigator.geolocation.getCurrentPosition(appendPosition, displayError, options);
}
function stopWatcher() {
navigator.geolocation.clearWatch(watchID);
}
return {
start: startWatcher,
stop: stopWatcher,
update: forceUpdate
};
})();
示例用法
tracker.start(function(position, distance) {
console.log(position, distance);
});
tracker.stop();
简要文档
tracker.start
接受一个回调作为第一个参数,可选的地理位置选项作为第二个参数。
tracker.update
将强制检查位置,接受可选的地理位置选项作为第一个参数。
tracker.stop
将停止地理定位的watchPosition。
JSFiddle Demo
发布于 2020-07-15 03:53:18
我还想知道在哪里添加enableHighAccuray选项。我尝试了以下几点:
function startWatcher(callback, options) {
if ("geolocation" in navigator) {
// Watch position updates
watchCallback = callback;
// Watch for updates
watchID = navigator.geolocation.watchPosition(appendPosition, displayError, {
enableHighAccuracy:true
});
var registerWatchPosition = function(position) {
appendPosition(position);
};
} else {
alert('Geolocation is not supported!');
}
}
但没有像预期的那样起作用..。
谢谢!
https://stackoverflow.com/questions/23447829
复制相似问题