我正在尝试将OpenLayers设置为在缩放开始之前不显示矢量图层,并在缩放结束后重新显示它。我有这样的缩放结束部分:
map = new OpenLayers.Map('map_element', { eventListeners: { "zoomend": mapEvent}});
function mapEvent(event) {
if(event.type == "zoomend") {
hide_vector_layer();
}
}
但是我没有看到任何类型的事件监听器来开始放大文档。有一个“movestart”,涵盖了移动,平移和缩放。不幸的是,我不能使用“movestart”,因为我不希望图层在平移期间消失。你会认为会有一个“zoomstart”,因为有一个“zoomend”。
我尝试这样做的原因是因为我不喜欢在使用Google地图作为基础层时矢量图层以不同的速率缩放。看起来不对,看起来所有功能都不准确,即使它们在缩放完成后落在正确的位置。
有什么建议吗?
答案 0 :(得分:8)
这是一个很容易将'BeforeZoom'事件添加到OpenLayers。只需将下面的代码添加到您创建地图对象的位置即可。
map.zoomToProxy = map.zoomTo;
map.zoomTo = function (zoom,xy){
//Your Before Zoom Actions
//If you want zoom to go through call
map.zoomToProxy(zoom,xy);
//else do nothing and map wont zoom
};
这是如何运作的:
对于任何类型的缩放活动,OpenLayers API最终会调用名为zoomTo的函数。因此,在覆盖它之前,我们将该函数复制到一个名为“zoomToProxy”的新函数中。我们覆盖它并添加条件缩放逻辑。如果我们想要进行缩放,我们只需调用新的代理函数:)
答案 1 :(得分:2)
为此,您应该覆盖OpenLayers.Map的moveTo和moveByPx方法,以消除除缩放之外的任何操作的movestart事件触发。
答案 2 :(得分:2)
我遇到了与OP相同的问题,我试图用drnextgis的解决方案来解决它。但不幸的是,它并没有完全发挥作用:: OpenLayers.Map.moveTo中的zoomChanged
属性不仅在缩放级别发生变化时,而且在地图调整大小时评估为true
。
我的地图是用户浏览器窗口的100%,因此如果他们调整窗口大小,则会触发事件。这对我来说是不受欢迎的,因为我只想在缩放级别实际发生变化时触发事件。我的解决方案是创建一个名为“zoomstart”的新事件,我将其插入OpenLayers.Map.moveTo的顶部。这是代码:
var getZoom = this.getZoom();
if ( !!getZoom && !!zoom && this.isValidZoomLevel(zoom) && getZoom != zoom )
this.events.triggerEvent("zoomstart", zoom);
此代码会将新的缩放级别传递给注册到zoomstart
的事件侦听器,在我的情况下,我会根据新的缩放级别确定地图的restrictedExtent并执行其他操作。
与你和平相处。
答案 3 :(得分:1)
“movestart”处理“zoomstart”。要检测是否是zoomstart,请尝试:
map.events.register("movestart",map, function(e) {
if(e.zoomChanged)
{
//zoom start code here
}
});
答案 4 :(得分:0)
“Shaunak”的解决方案对我来说非常有效。 我想限制在11以下的缩放,所以编辑他的代码为
if (zoom > 11) {
map.zoomToProxy(zoom, xy);
}