Установка минимального и максимального 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, но здесь у меня не было никакой другой возможности.