Расстояние Математика в JavaScript и Реализация его в цикле? - PullRequest
2 голосов
/ 20 февраля 2010

У меня трудности с вычислением расстояния между несколькими точками на карте:

У меня есть массив координат, где первые координаты ["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"]

];

Далее, чтобы сделать географические точки на карте из этих координат, я использую специальную функцию 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

Это работает довольно хорошо (я также конвертирую каждый результат в формат (результат км)), и результат:

    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]));
    }

Этот цикл работает, но возвращает неверные результаты. Кто-нибудь может посоветовать, что не так в цикле? Я думаю, что, вероятно, мне нужно использовать другой цикл в этом цикле, который будет возвращать сумму других точек столько раз, сколько необходимо (требуется). Благодарю.

1 Ответ

3 голосов
/ 20 февраля 2010

Переменная J - это двумерный массив строк в том виде, как вы его объявили, и, как я вижу, функция YMaps.GeoPoint ожидает число. Так что попробуйте разбор:

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

UPDATE:

Вот что не так с вашим кодом:

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 дистанций.

...