OpenLayers 3: Як оновити карту після зміни стилю функції?


9

У мене є карта OpenLayers 3.2.0, яка містить деякі векторні джерела ( ol.source.Vector) та пов'язані з ними векторні шари ( ol.layer.Vector)

Коли компоненти ( ol.Feature) додаються до векторних джерел, їм надається dataвластивість, яка встановлюється об'єкту javascript, який представляє функція. TypeScript наступний ...

vectorSource.addFeature(new ol.Feature({
    geometry: /* ... */,
    data: vectorData,
}));

Потім векторні шари мають стильову функцію, яка зчитує dataвластивість та повертає її стиль:

vectorLayer = new ol.layer.Vector({
    source: vectorSource,
    renderBuffer: /* ... */,
    style: function (feature: ol.Feature, resolution: any) {
        var data = </* TypeScript Type */>feature.get('data');
        if ((data) && (data.style)) {
            return [data.style];
        }
        else {
            /* return default style */
        }
    }
});

Іноді події, не пов’язані з картою, призводять до зміни стилів. Наприклад, коли об’єкт стає недійсним, його стиль змінюється. Ясна річ, оскільки data.styleце повністю в моєму контролі, змінити це є дрібницею.

Проблема в тому, що карта не знає, що стиль змінився. Якщо я змінити стиль об'єкта, а потім збільшити масштаб карти, змусивши її перемальовувати, я помічаю, що мої функції стилів запускаються і повертають новий стиль, а функція перемальована. Як програмно змусити оновити карту?

Після деяких пошуків та експериментів я спробував:

  1. Закликаючи render()до ol.Mapсебе.
  2. Дзвінок dispatchChangeEvent()наol.source.Vector
  3. Дзвінок redraw()наol.layer.Vector

Вони були запропоновані, але жоден з них не працював, що не дивно, оскільки лише перший метод вказаний у документації API OpenLayers 3.2.0 і він не позначений як стабільний.


ви спробували vectorlayer.refresh ({force: true}); ?
ілька

У мене є, але, не дивно, це не працює, тому що це метод OpenLayers 2.
Xharlie

Відповіді:


12

Випадково я натрапив на відповідь - це викликати changed()самі функції після зміни styleвластивості пов'язаних з ними даних. Дивіться: http://openlayers.org/en/v3.2.0/apidoc/ol.Feature.html?unstable=true#changed

Це вимагає від мене відстеження ol.Featureоб'єктів, пов’язаних із кожним vectorDataоб'єктом (раніше мені потрібно було лише коли-небудь знайти vectorDataфункцію, яку можна було б зробити get()), але це не велика вартість.

(Я знайшов це, дивлячись на setGeometryі setStyleінші методи на , ol.Featureщоб побачити , що вони роблять.)


Незважаючи на те, що цей підхід працює, вимагаючи changedбудь-якої розумної кількості функцій, насправді передбачено досить серйозне покарання за продуктивність (цей спосіб не раз вибивав Chrome). Рекомендую зателефонувати changed()до джерела шару після зміни всіх ваших функцій.
Кайл

0

Я витратив тиждень, намагаючись зрозуміти, як змусити функцію (Polygon) зникнути з карти після її видалення ( vectorSource.removeFeature(selectedFeature). І рішення не спрацювало. Як не дивно, поточний OL3 v3.15.1 не має основної функції примусового оновлення / візуалізації, що Рішення, яке працювало для мене, було змінити selectedFeatureстиль:

        var newStyle = new ol.style.Style({
            image: new ol.style.Circle({
                radius: 5,
                fill: new ol.style.Fill({color: 'red'}),
                stroke: new ol.style.Stroke({color: 'yellow', width: 1})
            })
        });
        selectedFeature.setStyle(newStyle)

Будь-який стиль буде працювати, оскільки функція вже видалена з шару, але не оновлена.

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