我对javascript有一个非常奇怪的问题。我用OpenMayers和OSM的mapdata制作了一张地图。
每当我绘制一个特征(点或线)时,我会在草图完成时激活一个函数,称为redrawFeatures
,主要是分割线条,并为每条线条赋予一个起点和一个终点。到目前为止一切正常,但我也希望将绘制的点(和线)从mapprojection(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行)问题是,当我稍后将此点转换为显示投影并将此点保存在第三个数组(第17行)时,坐标也会更改在先前保存的名为points
的第一个数组的值中。我提醒保存的坐标的值三次,这是我得到和不明白的:
Alert 1(第14行)这是正确的,我得到了点的坐标
警报2(第16行)那仍然是正确的(与第一个相同)
Alert 3(第19行)现在它错了!我像以前一样警告同一个变量,但在point
转换后points[i]
的值也没有任何理由改变了。
我没有意识到有什么错误吗?
答案 0 :(得分:2)
似乎转换函数就地运行,并修改现有的point
数据。如果要保留先前的值
clone = point.clone();
答案 1 :(得分: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]