2

次のような形式のオブジェクトがあります。

var telemetry_data = {

  T36: [
    //Date, lat, long
    [20120516, 25.40294163, -80.46972051],
    [20120518, 25.40306787, -80.46967025],
    [20120521, 25.40234592, -80.46980265]
  ],

  T43: [
    [20120523, -25.4076545, -80.46945134],
    [20120525, -25.40761155, -80.46756243]
  ]
};

これは、さまざまな日付のさまざまな動物(T ##)の場所を示しています。特定の日付での動物の位置を示すマーカーと、そこにたどり着くまでの経路を示すポリラインをGoogleマップに配置したいと思います。ポリライン部分に問題があります。下記を参照してください。配列に追加される場所ではなく、最後の場所によってのみオーバーライドされるように見えるまでpath[tegu_name[j]].push(tegu_location);、すべてが機能しているように見えます。path[tegu_name[j]]一部の動物(T23、T34、T35、T36)の場合、正しい日付の場所があるにもかかわらず、アレイは完全に空のままです。何か案は?ばかげた間違いをしたような気がしますが、わかりません。

ライブ:http ://crocdoc.ifas.ufl.edu/projects/tegumap/ (日付を5月18日に変更して、コードのこの部分を多くの場所で実行すると、コンソールの印刷オブジェクトを1つの場所だけで確認できます[行から776]。現在の場所は紫色の点です)

フルJS:http ://crocdoc.ifas.ufl.edu/projects/tegumap/js/tegumap.js

//Telemetered tegus
var tegu_location;
var path = new Object();
var line = new Object();

//For each tegu
for (var j = 0; j < tegu_name.length; j++) {
    var tegu_key = telemetry_data[tegu_name[j]];
    //For each date
    for (var k = 0; k < tegu_key.length; k++) {
        path[tegu_name[j]] = new Array();
        if (tegu_key[k][0] <= date) {
            console.log("use point at date "+tegu_key[k][0]);
            tegu_location = new google.maps.LatLng(tegu_key[k][1], tegu_key[k][2]);
            path[tegu_name[j]].push(tegu_location);
        } else {
            marker = new google.maps.Marker({
              icon: point_tracked,
              shape: point_shape,
              map: map,
              position: tegu_location

            });
            marker_container.push(marker);

        } 
        console.log(path[tegu_name[j]]);
    }

    line[tegu_name[j]] = new google.maps.Polyline({
        path: path[tegu_name[j]],
        strokeColor: '#32cd32',
        strokeOpacity: 0.6,
        strokeWeight: 3
    });
    line[tegu_name[j]].setMap(map);


}
4

2 に答える 2

4

path[tegu_name[j]] = ...行(755)はループの外側にある必要があるようです。kそうでない場合、配列は。の反復ごとに新しく作成されますk

于 2012-05-30T03:30:21.153 に答える
1

いいえ、この.push()メソッドでは何も上書きされません。path[tegu_name[j]] = new Array();毎回配列を上書きするのはそれです。

それでも、他にもいくつかの修正/簡略化を行う必要があります。

  • marker_containerは配列です。ここではfor-in-loopを使用しないでください(changeDate関数の開始)
  • telemetry_dataプロパティを持つオブジェクトです。ここでは、プロパティ名()の配列を作成してそれを繰り返すのではなく、 for-in-loopを使用する必要がありますtegu_name

var tegu_location;
var path = new Object();
var line = new Object();

//For each tegu
for (var tegu in telemetry_data) {
    path[tegu] = new Array();
    //For each date
    for (var k = 0; k < telemetry_data[tegu].length; k++) {
        var keys = telemetry_data[tegu][k];
        if (keys[0] <= date) {
            console.log("use "+ tegu +" point ("+keys[1]+", "+keys[2]+") at date "+keys[0]);
            path[tegu].push(tegu_location = new google.maps.LatLng(keys[1], keys[2]));
        } else {
            if (tegu_location) {
                marker = new google.maps.Marker({
                  icon: point_tracked,
                  shape: point_shape,
                  map: map,
                  position: tegu_location
                });
                marker_container.push(marker);
            }
        } 
    }
    console.log(path[tegu]);

    line[tegu] = new google.maps.Polyline({
        path: path[tegu],
        strokeColor: '#32cd32',
        strokeOpacity: 0.6,
        strokeWeight: 3
    });
    line[tegu].setMap(map);
}
于 2012-05-30T03:51:41.313 に答える