OpenLayers - возвращаемые значения getCoordinateFromPixel остаются неизменными после вызова setZoom () в представлении карты - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть сценарий использования, в котором я хочу определить, лежат ли определенные координаты в пределах области вида, видимой в области просмотра. Наш подход состоит в том, чтобы начать с получения координат некоторых пикселей с помощью метода нашей карты getCoordinateFromPixel. Это работает, но проблема в том, что мы также хотим увеличить масштаб программно. Мы заметили, что вызов getCoordinateFromPixel на карте с точно такими же аргументами возвращает точно то же самое до и после вызова setZoom для вида карты. Как ни странно (?) Мы также заметили, что когда мы увеличиваем вручную между двумя вызовами getCoordinateFromPixel на карте, результаты меняются.

Возьмем, к примеру, этот скрипт:

import 'ol/ol.css';
import Map from 'ol/Map';
import View from 'ol/View';
import VectorLayer from 'ol/layer/Vector';
import VectorSource from 'ol/source/Vector';
import GeoJSON from 'ol/format/GeoJSON';
import Feature from 'ol/Feature';

let markerView = new View({
    center: [5000, 1000],
    zoom: 2,
});

let map = new Map({
  target: 'map-container',
  layers: [
    new VectorLayer({
      source: new VectorSource({
        format: new GeoJSON(),
        url: './data/countries.json'
      }),
    })
  ],
  view: markerView
});

window.setTimeout(() => {
    console.log(JSON.stringify(map.getCoordinateFromPixel([0, 0])));
    map.getView().setZoom(5);
}, 2000);
window.setTimeout(() => {
    console.log(JSON.stringify(map.getCoordinateFromPixel([0, 0])));
}, 4000);

Когда вы выполняете это в проекте OpenLayers, замыкание, запущенное через 2000 мс, выведет на консоль то же самое, что и после 4000 мс, даже если мы значительно увеличили масштаб!

Мне было интересно, знает ли кто-нибудь об обходном пути, исправлении или просто причине этого. Я попытался просмотреть события, которые запускает карта, чтобы, возможно, повторно выполнить getCoordinateFromPixel в обработчике, но я не нашел события, которое запускает карта, когда мы (программно) изменили масштаб.

Я буду рад предоставить более подробную информацию, если это необходимо.

Большое спасибо заранее,

Джошуа

1 Ответ

1 голос
/ 17 апреля 2019

Если у вас есть экстент и размер карты, вы можете легко рассчитать координату для пикселя, не полагаясь на getCoordinateFromPixel, который по какой-то причине не обновляется немедленно (он обновляется событием предварительной компоновки). Существует небольшая разница в координате х (около 100 метров в 8-миллионном экстенте), но ее недостаточно, чтобы быть значимой.

map.getView().on(['change:resolution','change:center'], function() {
  var size = map.getSize();
  var extent = this.calculateExtent(size);
  var coordinate = [
    extent[0] + (extent[2]-extent[0]) * pixel[0]/size[0],
    extent[1] + (extent[3]-extent[1]) * (size[1]-pixel[1])/size[1]
  ];
  console.log(JSON.stringify(extent));
  console.log(JSON.stringify(coordinate));  // as expected
  console.log(JSON.stringify(map.getCoordinateFromPixel(pixel)));  // hasn't been updated
});

.

map.getView().on(['change:resolution','change:center'], function() {
  map.once('precompose', function() {
    console.log(JSON.stringify(map.getCoordinateFromPixel(pixel)));
  });
});
...