Установка минимального и максимального уровней масштабирования (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 не срабатывает. У кого-нибудь есть решение этой проблемы?


person Imreking    schedule 20.11.2013    source источник


Ответы (3)


Отличная идея, Имрекинг.

Я добавил это в библиотеку 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).

person Knarf    schedule 20.11.2013

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

person Knarf    schedule 20.11.2013

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

Мое решение:

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

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

person Imreking    schedule 20.11.2013