Принудительное обновление ScaleLine Control в openlayers 2

1

Я использую Openlayers 2, и я создаю приложение карты. Я использую apache cordova, так что это просто javascript/html/css.

Он работает отлично для большинства случаев, но когда я увеличиваю и удаляю несколько раз (пальцами на сенсорном экране), иногда скальпинг перестает обновляться. Перемещение карты вокруг и увеличение/уменьшение масштаба обычно приводит к повторному запуску.

Мой вопрос: есть ли способ заставить ScaleLine контролировать перерисовку (кроме перемещения по экрану и случайного увеличения/уменьшения масштаба). Например, есть ли функция, которую я могу запустить, скажем, нажатием кнопки, чтобы принудительно выполнить перерисовку?

я пробовал

map.Control.Scaleline.update();
map.Control.Scaleline.draw();

Но это не работает

Спасибо!

PS: Я попытался открыть приложение с хром на рабочем столе, и поскольку у меня нет возможности сенсорного экрана, я не могу воспроизвести ошибку

Теги:
cordova
openlayers

2 ответа

1
Лучший ответ

Посмотрев на OpenLayers.debug.js, я мог видеть, что масштабирование обновляется в событии "moveend", которое запускается только при завершении касания (что не означает, что пользователь не позволяет завершить перетаскивание касания, например, с помощью масштабирования)

"move" всегда срабатывает, поэтому я решил его, вызвав "moveend" на событие "move".

    map.events.on ({
        "move": function () {
                map.events.triggerEvent("moveend");
            }
        }
    });

Он удаляет детали добавления определенных событий только на "moveend", но это решает проблему. Прокомментируйте, если у вас есть лучшее решение!

  • 0
    Это не сработало для меня. Это делает сковородку слишком далеко. Кроме того, ScaleLine и Graticule все еще не обновляются. Я тестировал Control.Navigation и Control.TouchNavigation для сенсорного ввода, и ни один из них не работал.
0

@atwinther был почти прав. Решение состоит в том, чтобы следить за "touchhend", а затем отправлять событие moveend. Тем не менее, только последние браузеры поддерживают это, поэтому для некоторых людей может быть неподходящим. По крайней мере, согласно Mozilla, это должно работать для последних Firefox и Chrome: https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent

Это то, что я сделал, что сработало, с неэквивалентным кодом:

var SYP = {
  init: function() {
    this.map = new OpenLayers.Map("map");

    // workaround for ol2 bug where touch events do not redraw the          
    // graticule or scaleline                                               
    this.map.events.on ({
        "touchend": function () {
            SYP.map.events.triggerEvent("moveend");
        }
    });

  },

Ещё вопросы

Сообщество Overcoder
Наверх
Меню