【问题标题】:Distance Math in JavaScript and Implementing it in loop?JavaScript中的距离数学并在循环中实现它?
【发布时间】:2010-02-20 10:56:52
【问题描述】:

我在计算地图上几个点之间的距离时遇到了困难:

我有一组坐标,其中第一个坐标 ["30.327547", "59.919676"] 是旅行的开始,其他是进站:

var J = [
    ["30.327547", "59.919676"],
    ["29.84964", "58.737619"],
    ["28.250252", "57.785994"],
    ["30.098912", "55.175885"],
    ["30.37357", "54.503783"],
    ["27.572056", "53.898325"],
    ["26.000193", "53.11856"]

];

接下来,要根据这个坐标在地图上制作地理点,我应该使用特殊的 Yandex Maps API 函数 YMaps.Geopoint:

var a=new YMaps.GeoPoint(30.327547,59.919676);
var b=new YMaps.GeoPoint(29.84964,58.737619);
var c=new YMaps.GeoPoint(28.250252,57.785994);
var d=new YMaps.GeoPoint(30.098912,55.175885);
var e=new YMaps.GeoPoint(30.37357,54.503783);
var f=new YMaps.GeoPoint(27.572056,53.898325);
var g=new YMaps.GeoPoint(26.000193,53.11856);

最后,为了计算点之间的距离,我使用了另一个 API 函数“point1.distance(point2)”:

var d1=a.distance(b);        //distance1
var d2=a.distance(b)+b.distance(c);    //distance2
var d3=a.distance(b)+b.distance(c)+c.distance(d);  //distance3
var d4=a.distance(b)+b.distance(c)+c.distance(d)+d.distance(e);   //distance4
var d5=a.distance(b)+b.distance(c)+c.distance(d)+d.distance(e)+e.distance(f);   //distance5
var d6=a.distance(b)+b.distance(c)+c.distance(d)+d.distance(e)+e.distance(f)+f.distance(g);   //distance6

这很好用(我还将每个结果转换为格式 (result km) ),结果是:

    console.log(YMaps.humanDistance(d1));console.log(YMaps.humanDistance(d2));console.log(YMaps.humanDistance(d3));
    console.log(YMaps.humanDistance(d4));console.log(YMaps.humanDistance(d5));console.log(YMaps.humanDistance(d6));

//{"Point1":"134 km.","Point2":"275 km.","Point3":"586 km.","Point4":"663 km.","Point5":"857 km.","Point6":"992 km."}

我真正想在循环中进行此操作:

for(var i=0;i<J.length;i++){

    // Iteratting through the array of points of J and creating Geoobjects on the map, dynamically putting them into public variables "temp_*"
    window["temp_" + i]=new YMaps.GeoPoint(J[i][0],J[i][1]);

    //next point
    var next=i+1;
    //master point (the begin of trip)
    var master=window["temp_0"];


    //calculating the distance between the master point and actual [i] point in the loop
    var formula=master.distance(window["temp_"+i]);

    // calculating the distance between the actual [i] point and the next in the loop
    var formula2=window["temp_" + i].distance(window["temp_"+next]);


    //summing and converting into human format and dinamically putting them into variables "result_*"
    window["result_"+i]=YMaps.humanDistance(formula+formula2);

    //logging the results
    console.log(YMaps.humanDistance(window["result_"+i]));
    }

此循环有效,但返回错误结果。有人可以建议循环中有什么问题吗? 我想可能我需要在这个循环中使用另一个循环,它将根据需要(需要)多次返回其他点的总和。 谢谢。

【问题讨论】:

    标签: javascript loops maps distance


    【解决方案1】:

    J 变量是您声明的字符串的二维数组,据我所知,YMaps.GeoPoint 函数需要一个数字。所以尝试解析:

    window['temp_' + i] = new YMaps.GeoPoint(
        parseFloat(J[i][0]), 
        parseFloat(J[i][1])
    );
    

    更新:

    您的代码有什么问题:

    var formula=master.distance(window["temp_"+i]);
    var formula2=window["temp_" + i].distance(window["temp_"+next]);
    window["result_"+i]=YMaps.humanDistance(formula+formula2);
    

    在每次迭代中,您重新声明 formula2 变量,并在计算当前点之间的人类距离时。你需要累加总和,所以在循环外声明变量并在里面添加:

    var sum = 0;
    for(var i = 0; i < J.length - 1; i++) {
        var p1 = new YMaps.GeoPoint(J[i][0], J[i][1]);
        var p2 = new YMaps.GeoPoint(J[i + 1][0], J[i + 1][1]);
        sum += p1.distance(p2);
        console.log(YMaps.humanDistance(sum);
    }
    

    请注意,循环在 J.length - 1 处结束:例如。对于 7 个点,您有 6 个距离。

    【讨论】:

    • 不使用parseFloat也能很好解析,但我的难点是实现这个依赖:var d1=a.distance(b); //距离1 var d2=a.distance(b)+b.distance(c); //distance2 var d3=a.distance(b)+b.distance(c)+c.distance(d); ...每次计算下一个点会增加
    • 谢谢。在循环外不使用动态变量 window["temp_"+i] 怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2012-10-16
    • 2014-04-15
    相关资源
    最近更新 更多