2

我在我的页面中创建了两个 openlayer 地图,现在我希望它们同步工作。

例如,一张地图的中心或缩放比例发生了变化,然后另一张地图也相应地改变了它。

反之亦然。

我应该在地图上注册哪个活动?

4

1 回答 1

1

这确实是可能的,因为我刚刚做到了。您需要从正在平移或缩放的地图中捕获“moveend”和“move”事件(在缩放结束时触发 moveend,但为了安全起见,您也可以捕获“zoomend”)。如果您使用父地图作为上下文来捕获这些,那么您可以获得新的地图中心。请记住,如果正在使用导航控件并且使用鼠标完成缩放,则地图中心可能会在缩放地图时发生变化。然后使用 moveTo 方法 (childmap.moveTo().

我选择了 moveTo 方法,因为(尽管没有很好的记录)这是在任何地图上的任何平移或缩放事件中最终都会调用的方法。顺便说一句,调用 moveTo 还会在子地图上触发 'move'、'moveend' 事件。

如果您使用 json 制作地图集合并使用 jQuery,实际代码将如下所示(我假设您知道如何在 OpenLayers 中捕获地图事件);

var newCentre = zoomedMap.getCenter();

$.each(maps, function (ind, map) {
            if (map !== zoomedMap) map.moveTo(newCentre, newZoom);
        });

其中 maps 是我的地图集合,zoomedMap 是用户实际触发平移或缩放事件的地图(我称它为 zoomeMap 但它也可以很容易地称为 pannedMap),并且(显然)map 是需要移动的集合。

在我确定上面的代码之前,我玩了一会儿。这里的优点是 $.each 不等待 moveTo 函数返回,所以你会得到一个看起来更漂亮的同步。当然,如果您只同步两张地图,这不会成为真正的问题。

很抱歉在提出问题后这么长时间才发布此消息,但也许它会帮助任何新的搜索者。

于 2014-03-30T16:13:16.870 回答