Javascript 在坐标数组上循环并计算距离

Javascript 在坐标数组上循环并计算距离,javascript,arrays,geolocation,coordinates,Javascript,Arrays,Geolocation,Coordinates,我有一个跑步应用程序,可以跟踪和记录跑步者的位置,并将坐标保存到数组中,目前为止效果不错。 我试着在数组上循环,计算总的移动距离 var lat = position.coords.latitude; var lon = position.coords.longitude; var latlng = new google.maps.LatLng(lat, lon); num += calculateDistance(sta

我有一个跑步应用程序,可以跟踪和记录跑步者的位置,并将坐标保存到数组中,目前为止效果不错。 我试着在数组上循环,计算总的移动距离

        var lat = position.coords.latitude;
        var lon = position.coords.longitude;
        var latlng = new google.maps.LatLng(lat, lon);

            num += calculateDistance(startPos.coords.latitude, startPos.coords.longitude,
            position.coords.latitude, position.coords.longitude);
            startPos = latlng;
            distance = num;
守则:

        var startPos;
        var num;
        var distance;

        navigator.geolocation.getCurrentPosition(function (position) {
            startPos = position;
        });
        //
        watchID = navigator.geolocation.watchPosition(function (position) {

        pathArr.push(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));
        var lat = position.coords.latitude;
        var lon = position.coords.longitude;
        var latlng = new google.maps.LatLng(lat, lon);

        var num = calculateDistance(startPos.coords.latitude,startPos.coords.longitude,
        position.coords.latitude, position.coords.longitude);
        distance = num;
        },


        function (positionError) {
            $("#error").append("Error: " + positionError.message + "<br />");
        }, {
            enableHighAccuracy: true,
            timeout: 30 * 1000
        });


function calculateDistance(lat1, lon1, lat2, lon2) {
    var R = 6371; // km
    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;
}
        var lat = position.coords.latitude;
        var lon = position.coords.longitude;
        var latlng = new google.maps.LatLng(lat, lon);

            num += calculateDistance(startPos.coords.latitude, startPos.coords.longitude,
            position.coords.latitude, position.coords.longitude);
            startPos = latlng;
            distance = num;
没有运气。
请帮助

您需要迭代数组中的所有地理坐标,找到每个连续两个坐标之间的距离,并将它们添加到距离总和中以找到总距离

        var lat = position.coords.latitude;
        var lon = position.coords.longitude;
        var latlng = new google.maps.LatLng(lat, lon);

            num += calculateDistance(startPos.coords.latitude, startPos.coords.longitude,
            position.coords.latitude, position.coords.longitude);
            startPos = latlng;
            distance = num;
简化代码的相关部分如下所示:

        var lat = position.coords.latitude;
        var lon = position.coords.longitude;
        var latlng = new google.maps.LatLng(lat, lon);

            num += calculateDistance(startPos.coords.latitude, startPos.coords.longitude,
            position.coords.latitude, position.coords.longitude);
            startPos = latlng;
            distance = num;
考虑到
coords
持有地理坐标数组

        var lat = position.coords.latitude;
        var lon = position.coords.longitude;
        var latlng = new google.maps.LatLng(lat, lon);

            num += calculateDistance(startPos.coords.latitude, startPos.coords.longitude,
            position.coords.latitude, position.coords.longitude);
            startPos = latlng;
            distance = num;
for (var i = 0; i < coords.length - 1; i++) {
    distanceTotal += google.maps.geometry.spherical.computeDistanceBetween(coords[i], coords[i+1]);
}
for(变量i=0;i

下面是Google Maps API的一个例子:

一个简单易用的解决方案:每个跑步者都可以有自己的数组,让它每隔一段时间推一个坐标或改变距离,然后将当前迭代+最后一个迭代相加。与其画一条线,不如把点连起来。根据您拥有的处理能力/存储容量,如果您只使用两个点来测量距离变化,而不是总行驶距离的变化,则可以使此操作非常简单或可靠(甚至可以计算速度等)@StevenLacks是对的,你需要更多的分数。您还说您正在尝试在数组上循环,但可能我错过了,但我在代码中没有看到循环,您可以轻松地执行您想要的操作,只需使用for循环并跟踪从点到点的移动距离。是的,使用我的解决方案,你还需要保持一个跑步总距离,或者再绕一圈以获得总距离。我会解释得更好。我有两个以上的点,在watchID=navigator.geolocation.watchPosition(函数(position){num+=calculateInstance(startPos.coords.latitude,startPos.coords.longitude,position.coords.latitude,position.coords.latitude);startPos=position;distance=num;startPos和位置在用户每次移动时都会改变,因此num变量应该是第一个坐标到第二个坐标,然后是第二个坐标到第三个坐标之间的距离之和,依此类推。对不起,我更新了我的答案。我在欧几里德空间思考了一会儿,而问题是显然是关于地理距离。
        var lat = position.coords.latitude;
        var lon = position.coords.longitude;
        var latlng = new google.maps.LatLng(lat, lon);

            num += calculateDistance(startPos.coords.latitude, startPos.coords.longitude,
            position.coords.latitude, position.coords.longitude);
            startPos = latlng;
            distance = num;