Установка минимального и максимального zoomLevels (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 ответа

Решение

Отличная идея 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).

Я не думаю, что это возможно в 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".

Кнарф, спасибо за ваш ответ. Я попробовал "Вариант 1", и он сработал, но я нашел другое решение, которое может быть более приемлемым для пользователей.

Мое решение:

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

Я переопределил метод isValidZoomLevel. Переменные minZoomLevel и maxZoomLevel были установлены при запуске приложения. Мне не нравится вызывать JavaScript из кода GWT, но здесь у меня не было никакой другой возможности.

Другие вопросы по тегам