Еквівалент шару.redraw (правда) у OpenLayers 3?


13

У моєму додатку OL3 є шар geojson, який я хочу перемальовувати кожні 5 секунд (щоб показати рух на карті).

Як це зробити? Не вдалося знайти еквівалент Layer.redraw ().


Ви подивилися на ol.animation? Взагалі, векторний малюнок більш гладкий і по-різному обробляється в ol3, але з вашого питання не зовсім зрозуміло, що ви хочете зробити.
Джон Пауелл

@ JohnBarça - Дані мого GeoJson надходять із постгресів, які оновлюються кожні 5 секунд новими GPS-даними. Я хочу перемалювати шар, щоб кожен раз показувати поточну позицію одиниць на карті (вона постійно змінюється ...)
Alophind

Отже, ви запитуєте дані кожні 5 секунд, використовуючи рекурсивний виклик setTimeout (або щось подібне), і ви просто хочете знати, як змусити оновити векторні функції?
Джон Пауелл

@ JohnBarça - Якщо є кращий спосіб, який я бажаю навчитися, але це те, що я роблю, я хочу показати розташування GPS в режимі реального часу на карті. GPS надсилають своє місцезнаходження до PostGIS, а звідти я читаю дані за допомогою GeoJSON (або я можу використовувати GeoServer), але я хочу, щоб шар оновлювався кожен раз.
Алофінд

Звичайно, я отримую те, що ви намагаєтеся зробити. Будь-який шанс для зразка коду, тому що, за моїм досвідом, якщо ви помістите цикл анімації у встановлений час, з викликом ajax на віддалений сервер і завантажте json, який повертається за допомогою Format.GeoJSON або подібного, функції оновлюються.
Джон Пауелл

Відповіді:


9

Ось як можна оновлювати векторне джерело кожні 5 секунд з веб-сервісу, що повертає функції документа GeoJSON:

var vectorSource = new ol.source.Vector();
var geojsonFormat = new ol.format.GeoJSON();

window.setTimeout(function() {
  $.ajax('http://example.com/data.json', function(data) {
    var features = geojsonFormat.readFeatures(data
        {featureProjection:"EPSG:3857"});
    geojsonSource.clear();
    geojsonSource.addFeatures(features);
  });
}, 5000);

jQuery тут використовується для запиту даних через Ajax ( $.ajax), але ви, очевидно, можете використовувати бібліотеку на свій вибір.

Цей фрагмент коду також передбачає, що проекції карти є "EPSG: 3857" (веб-меркатор) і що координати в документах GeoJSON - це довготи та широти.


3
Цей код бентежить мене, слід vectorSourceі geojsonSourceоб'єднувати?
Келлі Томас

Я думаю, ви маєте на увазі window.setInterval not setTimeout; інакше це робиться лише один раз.
Джонатан

9

Я знаю, що це питання давнє, але я нарешті знайшов рішення для оновлення шару на openlayers 3.

Ви повинні оновити параметри джерела шару так:

var source = yourLayer.getSource();
var params = source.getParams();
params.t = new Date().getMilliseconds();
source.updateParams(params);

3
Здається, не всі джерела підтримують updateParamsметод; OL3.18.2 тільки показує , що для ImageArcGISRest, ImageMapGuide, ImageWMS, TileArcGISRestі TileWMS, а не для, наприклад, ol.source.Vector.
Ар'ян

Дата # getTime може бути кращою, ніж Дата # getMilliseconds, щоб недійсний кеш і примусити шар перемальовуватися, оскільки це забезпечить унікальне число кожного разу.
walkermatt

5

Ви можете оновити шар WFS за допомогою myLayer.getSource().clear().


1
Це було зроблено для мене з OpenLayers 3 v. 0.14.2 та джерелом вектора WFS GeoJSON.
Дірк

3
нічого поганого в однорядній відповіді, якщо вони на гроші. повинна бути нагорода за репутацію, щоб зняти цю інформаційну скриньку.
Dennis Bauszus

1
Відповідь правильна, але це може виявити деяке мерехтіння: після виклику clear()будь-які існуючі функції будуть вилучені з карти відразу та додані ще раз після отримання відповіді HTTP. Це справедливо як для визначення значення для, так VectorOptions#urlі для VectorOptions#loader. Для даних у режимі реального часу кінцевий користувач може виглядати краще вручну, роблячи деякі макети WebSockets або XHR, а потім дзвінки з getSource().clear()подальшим викликом getSource().addFeatures(...).
Ар'ян

3

З OL2 я використовував стратегію оновлення шару, яка не була додана до OL3. Нижче представлена ​​функція самовиклику, яка використовуватиме запит ajax для отримання GeoJSON, а потім прочитає його та додасть до джерела.

var yourSource = new ol.source.GeoJSON();

//add this source to a layer, the layer to a map with a view etc
...

//now fetch the data
var fetchData = function () {
    jQuery.ajax(url,
    {
        dataType: 'json',
        success: function (data, textStatus, jqXHR) {
            yourSource.clear(); //remove existing features
            yourSource.addFeatures(yourSource.readFeatures(data));
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log(errorThrown);
        }
    });

    //call this again in 5 seconds time
    updateTimer = setTimeout(function () {
        fetchData();
    }, 5000);
};
fetchData(); //must actually call the function!

Сподіваюсь, це допомагає.


2

Це ідеально підходить для шарів:

layer.changed();

відповідно до http://openlayers.org/en/latest/apidoc/ol.layer.Vector.html#changed


1
Вам потрібно пояснити трохи більше про те, як layer.changed();ідеально працює (ша) для шарів. Опис документації Increases the revision counter and dispatches a 'change' event.не дуже корисний. Як використання методу змінений () відповідає на питання щодо перемальовування карти кожні 5 секунд?
nmtoken

Я використовував Ajax для збереження переглянутого джерела geojson, і проблема, яка була у мене, полягала в тому, що якщо я закрив шар і повторно відкрив його, карта використала кешовану (неревізовану) версію джерела. Як тільки я очистив кеш, шар використовував переглянуте джерело, як я очікував. На жаль, запропоноване layer.changed();не вплинуло на мене, але source.changed();зробило трюк.
Пітер Купер

1

Не потрібно явно оновлюватись. Кожен раз, коли ви оновлюєте вміст шару, карта оновлюється, вимагаючи нового відображення кадру.

Для примусового відображення вручну ви маєте map.render()та map.renderSync()методи.


Цей вміст не оновлює, він лише оновлює полотно карти.
Mapper
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.