2010-02-20 15 views
2

Je vais avoir des difficultés à calculer la distance entre plusieurs points sur la carte:Distance maths en JavaScript et implémentation en boucle?

J'ai un tableau de coordinats où le premier coord [ « 30,327547 », « 59,919676 »] est le début du voyage et d'autres sont arrêts aux stands:

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

];

Ensuite, pour faire les géopoints sur la carte de cette coords je shoul utilise la fonction API spéciale Yandex carte 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); 

Enfin, pour calculer les distances entre les points i utiliser une autre fonction API « Set1. 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 

Cela fonctionne assez bien (je convertir également chaque résultat pour formater (résultat   km)) et le résultat est:

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

Ce que je veux vraiment faire ce fonctionnement dans une boucle:

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

Cette boucle fonctionne, mais renvoie des résultats erronés. Quelqu'un pourrait-il conseiller ce qui ne va pas dans la boucle? Je suppose que probablement j'ai besoin d'utiliser une autre boucle dans cette boucle qui retournera le summ d'autres points autant de fois que nécessaire (nécessite). Merci.

Répondre

3

La variable J est un tableau bidimensionnel de chaînes tel que vous l'avez déclaré et, d'après ce que je peux voir, la fonction YMaps.GeoPoint attend un nombre. Donc, essayez l'analyse syntaxique:

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

MISE À JOUR:

Voici ce qui est mal avec votre code:

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

A chaque itération vous redéclarer la variable et quand formula2 vous calculez la distance humaine entre les points actuels. Vous devez accumuler la somme, donc déclarer la variable en dehors de la boucle et ajouter à l'intérieur:

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

Notez que la boucle se termine à J.length - 1: ex. pour 7 points vous avez 6 distances.

+0

Il analyse bien sans utiliser parseFloat, mais mon difficile est d'implémenter cette dépendance: 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); ... où avec chaque calcul les points suivants ajoute – moogeek

+0

merci. et comment pourrais-je le faire sans utiliser la fenêtre de variables dynamiques ["temp _" + i] en dehors de la boucle? – moogeek

+0

méchant! ça a marché!!! tu es génieux! – moogeek