OpenLayers определяет уровень масштабирования пользователя с помощью стратегии BBOX

#openlayers

#openlayers

Вопрос:

В настоящее время я создаю сайт, который использует OpenLayers, и строю график с помощью стратегии BBOX. Потенциально в базе данных может быть много точек для отображения. Когда OpenLayers отправляет координаты BBOX, я бы хотел, чтобы OpenLayers отправлял текущий уровень масштабирования. Я бы использовал этот уровень масштабирования, чтобы решить, следует ли мне отправлять все результаты или 10 самых последних записей. Возможно ли для OpenLayers отправлять обратно на сервер текущий уровень масштабирования, когда OpenLayers отправляет информацию BBOX?

Комментарии:

1. У вас есть какой-либо ответ на мое предложение?

Ответ №1:

По умолчанию нет, но вы могли бы переопределить функцию triggerRead и добавить уровень масштабирования самостоятельно. Что-то вроде этого (непроверенное):

 OpenLayers.Strategy.BBOX.prototype.triggerRead = 
function() {
    if (this.response) {
        this.layer.protocol.abort(this.response);
        this.layer.events.triggerEvent("loadend");
    }
    this.layer.events.triggerEvent("loadstart");
    this.response = this.layer.protocol.read({
        filter: this.createFilter(),
        callback: this.merge,
        scope: this,
        params: {center: this.layer.getZoomForExtent()}
    });
}
  

Или, конечно, просто вычислите уровень масштабирования с помощью параметров BBOX.

Комментарии:

1. Я просто вычислил расстояние между двумя точками в bbox

Ответ №2:

Я протестировал это, и это работает:

         //override BBOX strategy in order to pass zoom
        OpenLayers.Strategy.BBOX.prototype.triggerRead = 
        function() {
            if (this.response) {
                this.layer.protocol.abort(this.response);
                this.layer.events.triggerEvent("loadend");
            }
            this.layer.events.triggerEvent("loadstart");
            this.response = this.layer.protocol.read({
                filter: this.createFilter(),
                callback: this.merge,
                scope: this,
                params: {zoom: this.layer.map.getZoom()}

            });
        }