2010-02-20 52 views
2

我在与地图上的几个计算点之间的距离的困难:JavaScript中的数学运算并在循环中实现它?

我有坐标系下的阵列,其中所述第一坐标[“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"] 

];

接下来,从这个COORDS使地图上的Geopoints我建议立即进行删除使用特殊Yandex的地图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函数“点1点之间的距离。距离(点2)“:

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

这个循环的作品,但将返回错误的结果。任何人都可以建议循环中出现什么问题吗? 我想我可能需要在这个循环中使用另一个循环,它会根据需要返回其他点的汇总很多次。 谢谢。

回答

3

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个距离。

+0

它不使用parseFloat就可以解析,但我的难点在于实现这种依赖性: var d1 = a.distance(b); //距离1 var d2 = a.distance(b)+ b.distance(c); //距离2 var d3 = a.distance(b)+ b.distance(c)+ c.distance(d); ... 其中每次计算下一点加 – moogeek 2010-02-20 11:06:52

+0

谢谢。我怎么能做到这一点,而不使用循环外的动态变量窗口[“temp _”+ i]? – moogeek 2010-02-20 11:27:39

+0

邪恶!有效!!!你真是太棒了! – moogeek 2010-02-20 11:33:32