Векторный слой OLv5 с динамическим источником не рендеринг - PullRequest
0 голосов
/ 13 сентября 2018

Я новичок в OL на прошлой неделе, поэтому я прошу прощения, если я пропустил что-то очевидное.Это в основном собраны из примеров, но я уверен, что понимаю, что происходит в данный момент.Вы можете увидеть мой код в действии здесь: https://fleur.github.io/dist/index.html, или более условно, здесь: https://github.com/fleur/olexample.

Если я создам карту с векторным слоем, источником которого является статический файл (через 'urlсвойство), функции отображаются, как ожидалось.Если я создаю карту с тем же кодом, где единственным отличием является то, что источником является функция загрузчика, выполняющая вызов xhr, функции не отображаются.

Я поместил слушателей как на источник, так и на источник.слой в обоих случаях и вызовите эти события:

static:

precompose
postcompose
addfeature
addfeature
addfeature
change
precompose
render
postcompose

dynamic:

precompose
postcompose
addfeature
addfeature
addfeature
change
precompose
postcompose

Обратите внимание, что в динамической последовательности нет события 'render'событий.Я даже делаю синхронный вызов HTTP.Я в полной растерянности.Функция динамического загрузчика исходного кода делает замысловатые вещи с замыканиями, так что, может быть, это как-то связано с этим?Код был взят из примера на openlayers.org, и изменен только с помощью console.log и другого URL.

Итак, мой вопрос: как я могу получить динамически извлекаемые функции, которые получаютдобавлено в источник, для рендеринга?

1 Ответ

0 голосов
/ 16 сентября 2018

При использовании данных с использованием URL-адресов в форматах GeoJSON, GPX, KML или OSMXML библиотека OpenLayers автоматически выполняет перепроецирование из EPSG: 4326 в EPSG: 3857, тогда как при выполнении ручного вызова Ajax вы выполняете это преобразование самостоятельно. Рендеринг не происходит, поскольку ваши объекты находятся за пределами возможности их рисования.

Чтобы исправить вашу проблему, после,

const f = dynamic_source.getFormat().readFeatures(xhr.responseText);

Добавить

// Return at the moment geometry with longitude-latitude / WGS 84 / EPSG:4326
// like [-122.3563599, 37.5793804]
// Only here for learning purpose, you can remove it after understanding my point
console.log(f[0].getGeometry().getCoordinates());

// Reproject coordinates manually by mutating the current geometry in place
f.forEach(feature => feature.getGeometry().transform('EPSG:4326', 'EPSG:3857'));

PS: проверено

...