1

私はjavascriptで非常に奇妙な問題を抱えています。OpenLayersとOSMのmapdataを使用してマップを作成しました。フィーチャー(点または線)を描画するたびに、スケッチが完了したときに、redrawFeatures主に線を分割し、すべての線に始点と終点を与えるために呼び出される関数を起動します。これまでのところすべて正常に機能していますが、地図投影法(EPSG:900913)から表示投影法(EPSG:4326)に描画された点(および線)を変換したいので、問題があります。次のコードは関数です。

var pointsOnMap = [];
var linesOnMap = [];

function redrawFeatures(e) {
    var vert = e.feature.geometry.getVertices();
    var points = [];
    var pointFeatures = [];
    var lineFeatures = [];

    for (var i = 0; i < vert.length; i++) {
        var point       = new OpenLayers.Geometry.Point(vert[i].x, vert[i].y);

        points.push(point);
        alert(points[i].x + ', ' + points[i].y);
        pointFeatures.push(new OpenLayers.Feature.Vector(point));
        alert(points[i].x + ', ' + points[i].y);
        pointsOnMap.push(point.transform(new OpenLayers.Projection("EPSG:900913"),
                                         new OpenLayers.Projection("EPSG:4326")));
        alert(points[i].x + ', ' + points[i].y);
        if (i >= 1) {
            var line = new OpenLayers.Geometry.LineString([points[i-1], points[i]]);

            lineFeatures.push(new OpenLayers.Feature.Vector(line));
            linesOnMap.push(line.transform(new OpenLayers.Projection("EPSG:900913"),
                                           new OpenLayers.Projection("EPSG:4326")));
        }
    }

    draw.destroyFeatures([e.feature]);
    draw.addFeatures(lineFeatures);
    draw.addFeatures(pointFeatures);

}

名前の付いた変数drawは、私が描くレイヤーです。

イベントから座標を決定し、新しいポイントを作成し(11行目)、それらを配列に保存します(13行目)。同じポイントをフィーチャに変換して、別の配列にも保存します(15行目)問題は、後でこのポイントをdisplayprojectionに変換し、このポイントを3番目の配列に保存すると(17行目)、座標も変更されることです。と呼ばれる最初の配列の以前に保存された値points。保存された座標トライスの値を警告しますが、これは私が得たものであり、理解できません。

アラート1(14行目)そうです、ポイントの座標を取得します

アラート2(16行目)その通りです(最初のアラートと同じ)

アラート3(19行目)今では間違っています!以前と同じ変数に警告しますがpoint、の値の変換後points[i]も理由もなく変更されました。

気づかない間違いはありますか?

4

2 に答える 2

2

変換関数はインプレースで動作し、既存のpointデータを変更しているようです。以前の値を保持したい場合は、ポイントを複製してから操作する必要があります

clone = point.clone();
于 2012-11-05T12:37:45.273 に答える
1

javascriptの場合:

var a = [1,2,3]
var b = a; //Here you are actually copying the reference of a
b.push(4); //This will also add 4 to a...a = [1,2,3,4] now
//In order to actually copy the array instead of reference u need to clone it as follows
var c = a.slice(); //creates a clone of a
c.push(5); // c = [1,2,3,4,5] and a = [1,2,3,4]
于 2012-11-05T12:36:54.570 に答える