views:

83

answers:

1

Hi! I'm having the difficulties with calculating distance between several points on the map:

I have an array of coordinats where the first coord ["30.327547", "59.919676"] is the begining of the trip and other are pit stops:

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"]

];

Next, to make the Geopoints on the map from this coords I shoul use special Yandex Maps API function 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);

Finally, to calculate distances between points i use another API function "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

This works pretty well (I also convert each result to format (result km) ) and the result is:

    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."}

What I actually want to make this operations inside a loop:

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

This loop works but returns wrong results. Could anybody advice what is wrong in the loop? I guess that probably i need to use another loop in this loop that woul return the summ of other points so many times as neccessary (requires). Thanks.

+3  A: 

The J variable is a two dimensional array of strings as you declared it and from what I can see the YMaps.GeoPoint function expects a number. So try parsing:

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

UPDATE:

Here's what's wrong with your code:

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

On each iteration you redeclare the formula2 variable and when you calculate the human distance between the current points. You need to accumulate the sum, so declare the variable outside the loop and add to it inside:

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

Notice that the loop ends at J.length - 1: ex. for 7 points you have 6 distances.

Darin Dimitrov
It parses well without using parseFloat, but my difficult is to implement this dependence:var d1=a.distance(b); //distance1var d2=a.distance(b)+b.distance(c); //distance2var d3=a.distance(b)+b.distance(c)+c.distance(d); ...where with each calculation next points adds
moogeek
thanks. and how could i do it without using dynamic variables window["temp_"+i] outside the loop?
moogeek
wicked! it worked!!! you are genious!
moogeek