OpenLayers 3: Bir Unsurun stilini değiştirdikten sonra haritayı nasıl yenileyebilirim?


9

Bazı vektör kaynakları ( ol.source.Vector) ve ilişkili vektör katmanları ( ol.layer.Vector) özellikleri bir OpenLayers 3.2.0 harita var

ol.FeatureVektör kaynaklarına Unsurlar ( ) eklendiğinde, bunlara dataunsurun temsil ettiği javascript nesnesine ayarlanmış bir özellik verilir . TypeScript aşağıdakileri takip eder ...

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

Vektör katmanları daha sonra dataözelliği okuyan ve stilini alan bir stil işlevine sahiptir :

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 */
        }
    }
});

Bazen, harita ile ilgisi olmayan olaylar stillerin değişmesine neden olur. Örneğin, bir nesne geçersiz hale geldiğinde, stili değişir. Açıkçası, data.styletamamen benim kontrolümde olduğu için, değiştirmek önemsizdir.

Sorun, haritanın stilin değiştiğini bilmemesi. Bir nesnenin stilini değiştirip haritayı yakınlaştırıp yeniden çizmeye zorlarsam, stil işlevlerimin çalıştığını ve yeni stili döndürdüğünü ve özelliğin yeniden çizildiğini fark ederim. Haritayı programlı olarak yenilenmeye nasıl zorlarım?

Bazı arama ve denemelerden sonra denedim:

  1. Arama render()üzerinde ol.Mapkendisi.
  2. Şunu arıyor dispatchChangeEvent():ol.source.Vector
  3. Şunu arıyor redraw():ol.layer.Vector

Bunlar önerildi, ancak hiçbiri işe yaramadı, çünkü OpenLayers 3.2.0 API belgelerinde sadece ilk yöntem bile listelendiğinden ve kararlı olarak işaretlenmediğinden şaşırtıcı değil.


vectorlayer.refresh'i denediniz mi ({force: true}); ?
ylka

Ben var, ama şaşırtıcı değil, bu çalışmıyor çünkü bu bir OpenLayers 2 yöntemi.
Xharlie

Yanıtlar:


12

Şans eseri, cevabın üzerine tökezledim - ilişkili verilerin changed()özelliklerini değiştirdikten sonra özellikleri kendileri çağırmak style. Bkz. Http://openlayers.org/en/v3.2.0/apidoc/ol.Feature.html?unstable=true#changed

Bu, ol.Featureher bir vectorDatanesne ile ilişkili nesneleri takip etmemi gerektiriyor (daha önce, sadece vectorDataile yapılabilecek bir özelliği bulmam gerekiyordu get()), ancak bu çok fazla bir maliyet değil.

(I bakarak buldum setGeometryve setStyleve diğer yöntemler ol.Featureyaptıklarını görmek için.)


Bu yaklaşım işe yarıyor olsa da, changedmakul sayıda özellik çağrısı aslında oldukça ciddi bir performans cezasına neden olur (Chrome'u bu şekilde birkaç kez çökertti). changed()Tüm özellikleriniz değiştikten sonra katmanınızın kaynağını çağırmanızı öneririm .
Kyle

0

Bir özelliği sildikten sonra bir özelliğin (Çokgen) haritadan nasıl kaybolacağını anlamaya çalışmak için bir hafta geçirdim ( vectorSource.removeFeature(selectedFeature)ve hiçbir çözüm işe yaramadı. Benim için işe yarayan çözüm, değişikliğin selectedFeaturetarzını değiştirmekti :

        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)

Özellik katmandan zaten kaldırıldığı, ancak yenilenmediği için herhangi bir stil çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.