OpenLayers标记的moveTo方法只在特定缩放级别下精确。

3
我一直在研究一种不用拖动就可以移动标记的方法,基本上,用户点击标记,信息窗口会弹出。窗口中有一个链接到javascript函数的链接,该函数在地图上设置了一个点击事件。当用户在地图上某处单击时,标记应该移动到单击点。
我的地图有18个缩放级别。在缩放级别15,这个过程完美地工作。如果我在单击一次之后再缩放,标记仍然会移动到我单击的位置。但是,如果我重新刷新并从缩放级别16开始,试图单击某个位置,标记将被移动到一个更高且更向左的位置。在更高的缩放级别上重复此过程,标记在地图上的移动距离越来越远。
在较低的缩放级别下进行以上操作也能正常运行。
以下是代码片段:
lmLayer = new OpenLayers.Layer.Markers("Landmark Creation");
map.addLayer(lmLayer);
var marker = landmark['landmark_1234'];// this just pulls the marker out of storage
map.events.register("click", lmLayer, function(evt){
    var pixel = new OpenLayers.Pixel(evt.clientX,evt.clientY);
    marker.moveTo(pixel);
    OpenLayers.Event.stop(evt);
});

我使用控制台记录下了客户端(clientX)和纵坐标(clientY)的点击位置,确保它们正确地在浏览器左侧和顶部边缘上注册。但是,在缩放级别超过15时,似乎OpenLayers(OL)正在错误计算 moveTo。

你有什么想法吗?


你在地图和标记层中使用了哪些坐标系?它们是如何声明的? - Niklas Wulff
1个回答

1

在等待修复错误的时候,可以使用一些小技巧来解决问题。

lmLayer = new OpenLayers.Layer.Markers("Landmark Creation");
map.addLayer(lmLayer);
var marker = landmark['landmark_1234'];

map.events.register("click", lmLayer, function(evt){
    var pixel = new OpenLayers.Pixel(evt.clientX,evt.clientY);
    marker.lonlat = pixel;
    marker.moveTo(pixel);
    // workaround
    marker.draw();
    lmLayer.redraw();
    OpenLayers.Event.stop(evt);
});

祝好, J.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接