设置最小和最大缩放级别(GWT-OpenLayers)

时间:2013-11-20 08:44:33

标签: gwt openlayers gwt-openlayers

我想在地图中设置最小和最大缩放级别。

我的第一个想法是收听'zoomstart'事件,但是org.gwtopenmaps.openlayers.client.Map类没有实现任何具有此类事件类型的侦听器。然后我试着听'zoomend'事件。我的想法是在缩放事件之后检查缩放级别,并且如果它高于/低于阈值而不是我缩放到该阈值。示例代码:

    @Override
    public void onMapZoom(MapZoomEvent eventObject) {
        if (eventObject.getSource().getZoom() > 18) {
            eventObject.getSource().zoomTo(18);
        }
    }

但我发现,在这种情况下,zoomTo事件不会触发。有没有人能解决这个问题?

3 个答案:

答案 0 :(得分:2)

好主意Imreking。

我已将此添加到GWT-Openlayers库中。 因此,如果您现在可以从github下载最新版本:

map.setMinMaxZoomLevel(6,8);

您不再需要在自己的代码中使用某种JavaScript方法。

我实际上还添加了一个展示但很难将其上传到我们的网站。

上传新的展示现在已成功。 请参阅http://demo.gwt-openlayers.org/gwt_ol_showcase/GwtOpenLayersShowcase.html?example=Min%20max%20zoom%20example以查看新添加的Map.setMinMaxZoomLevel(minZoom,maxZoom)的示例。

答案 1 :(得分:1)

我不认为这在OpenLayers(正常和GWT)中是可能的。 据我所知,有两种解决方案可供选择。

选项1 这对用户来说很难看。当他看到地图变焦时,就在这之后回到之前的缩放级别。 需要定时器才能让OL有机会为变焦设置动画。

    map.addMapZoomListener(new MapZoomListener()
    {
        @Override
        public void onMapZoom(final MapZoomEvent eventObject)
        {
            Timer t = new Timer()
            {

                @Override
                public void run()
                {
                    if (eventObject.getSource().getZoom() > 15)
                    {
                      map.zoomTo(15);
                    }
                    else if (eventObject.getSource().getZoom() < 10)
                    {
                        map.zoomTo(10);
                    }
                }
            };
            t.schedule(500);
        }
    });

选项2 不要使用缩放默认缩放控件,而是创建自己的缩放按钮(使用普通GWT),并将它们放在地图上。如果您愿意,可以使用与普通按钮相同的方式设置这些按钮的样式。 “在普通GWT中创建并使其看起来像OL”的技巧是我经常使用的一个技巧(例如,创建更高级的层切换器)。

注意:我是GWT-OpenLayers的开发者之一,如果你想我可以在我们展示如何做'选项2'的展示中添加一个例子。

答案 2 :(得分:0)

Knarf,谢谢你的回复。我尝试了“选项1”并且它有效,但我发现另一个解决方案可能更容易为用户所接受。

我的解决方案是:

    map.isValidZoomLevel = function(zoomLevel) {
       return ((zoomLevel != null) &&
          (zoomLevel >= minZoomLevel) && 
          (zoomLevel <= maxZoomLevel) &&
          (zoomLevel < this.getNumZoomLevels()));
    }

我覆盖了isValidZoomLevel方法。应用程序启动时设置了minZoomLevel和maxZoomLevel变量。我不喜欢从GWT代码调用javascript,但在这里我没有任何其他机会。