OL5.3 ZoomSlider и шаги между уровнями масштабирования - как? - PullRequest
0 голосов
/ 02 декабря 2018

Я использовал полезную ошибку в старом OL5, теперь она была исправлена, и я снова искал решение для нескольких недель ...

Мое желание с ZoomSlider - оставаться на шаге между целочисленными уровнями масштабирования,Когда я нажимаю на ползунок, он перемещается, например, с 16 на 17. Мой полигон в представлении может быть немного больше, чем мне нужно.Затем я немного передвигаю кнопку-слайдер, и вид становится идеальным - но когда я оставляю кнопку мыши, кнопка-слайдер переходит на ближайший уровень ...

Ошибка в прошлом, там я мог оставить кнопку-слайдер влевоили вправо, и идеальный вид стоял на шаге между уровнями (но вид не обновлялся в этом состоянии, но в большинстве случаев этот вид был для меня нормальным; я его распечатал).

Теперь, к сожалению, этоошибка исправлена ​​... - поэтому я ищу возможность снова пройти шаги между уровнями.

Я пробовал с комбинациями (безусловно, неправильными) значений constainResolution false / true, false / true pinchZoom, zoomDelta или deltaмежду 0,5 и 2 ... ничего не помогает, и после поиска в API, Google, .. и много пробуя, я сейчас очень запутался.

Я не понимаю значения слова "щепотка" (обычноЯ говорю по-немецки, в словаре есть так много значений для этого слова ...) - потому что я не вижу никаких изменений, ни я не устанавливаю pinchZoom на true или на false ...

Есть ли какое-либо решение для "удержания вида между уровнем масштабирования"?

1 Ответ

0 голосов
/ 03 декабря 2018

Я не могу найти более раннюю версию OpenLayers, в которой ZoomSlider работает так, как вы описали.

Одним из обходных путей было бы установить очень малый коэффициент масштабирования вида, чтобы создать гораздо больше уровней масштабирования и задать дельта-параметры при масштабировании.Кнопки управления и взаимодействия соответственно велики, поэтому они продолжают работать при нормальных уровнях масштабирования.

например, чтобы разделить каждый нормальный уровень масштабирования на 100 уровней масштабирования:

var zoomFactorDelta = 100;
var map = new ol.Map({
    target: 'map',
    layers: [
        new ol.layer.Tile({
            source: new ol.source.OSM()
        })
    ],
    controls: ol.control.defaults({
        zoomOptions: { delta: zoomFactorDelta }
    }).extend([
        new ol.control.ZoomSlider()
    ]),
    interactions: ol.interaction.defaults({
        zoomDelta: zoomFactorDelta
    }),
    keyboardEventTarget: document,
    view: new ol.View({
        center: ol.proj.fromLonLat( [8, 50] ),
        zoomFactor: Math.pow(2,1/zoomFactorDelta),
        zoom: 10 * zoomFactorDelta,
        maxZoom: 20 * zoomFactorDelta
    })
});

Однако, пока настройка zoomDelta работаетКак и ожидалось для масштабирования с помощью клавиатуры и двойного щелчка, оно не оказывает никакого влияния на масштабирование колесика мыши (несмотря на описание в документации «Дельта уровня масштабирования при использовании клавиатуры или масштабирования колесика мыши»), делая масштабирование колесика мыши в 100 раз медленнее, чем раньше.Альтернатива, которая поддерживает масштабирование с помощью колесика мыши с нормальной скоростью, состоит в том, чтобы переопределить функцию restinResolution представления, чтобы умножить дельта-параметр по умолчанию:

var zoomFactorDelta = 100;
var map = new ol.Map({
    target: 'map',
    layers: [
        new ol.layer.Tile({
            source: new ol.source.OSM()
        })
    ],
    controls: ol.control.defaults().extend([
        new ol.control.ZoomSlider()
    ]),
    keyboardEventTarget: document,
    view: new ol.View({
        center: ol.proj.fromLonLat( [8, 50] ),
        zoomFactor: Math.pow(2,1/zoomFactorDelta),
        zoom: 10 * zoomFactorDelta,
        maxZoom: 20 * zoomFactorDelta
    })
});
var view = map.getView();
var defaultConstrainResolution = view.constrainResolution.bind(view);
view.constrainResolution = function(resolution, delta, direction) {
    return defaultConstrainResolution(resolution, delta*zoomFactorDelta, direction)
};

Этот обходной путь, использующий только переопределение функции constrainResolution, также работает, но может иметьпобочные эффекты в других местах:

var map = new ol.Map({
    target: 'map',
    layers: [
        new ol.layer.Tile({
            source: new ol.source.OSM()
        })
    ],
    controls: ol.control.defaults().extend([
        new ol.control.ZoomSlider()
    ]),
    keyboardEventTarget: document,
    view: new ol.View({
        center: ol.proj.fromLonLat( [8, 50] ),
        zoom: 10
    })
});
var view = map.getView();
var defaultConstrainResolution = view.constrainResolution.bind(view);
view.constrainResolution = function(resolution, delta, direction) {
    return Math.abs(delta) > 0 ? defaultConstrainResolution(resolution, delta, direction)
                               : resolution;
};
...