J'ai une carte OpenLayers 3.2.0 qui présente des sources vectorielles ( ol.source.Vector
) et des couches vectorielles associées ( ol.layer.Vector
)
Lorsque les fonctionnalités ( ol.Feature
) sont ajoutées aux sources vectorielles, une data
propriété leur est affectée, définie sur l'objet javascript que la fonctionnalité représente. TypeScript suit ...
vectorSource.addFeature(new ol.Feature({
geometry: /* ... */,
data: vectorData,
}));
Les couches vectorielles ont alors une fonction de style qui lit la data
propriété et récupère son style:
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 */
}
}
});
Parfois, des événements sans rapport avec la carte font changer les styles. Par exemple, lorsqu'un objet devient invalide, son style change. De toute évidence, data.style
étant entièrement sous mon contrôle, le changer est trivial.
Le problème est que la carte ne sait pas que le style a changé. Si je modifie le style d'un objet, puis fais un zoom sur la carte, le forçant à être redessiné, je remarque que mes fonctions de style s'exécutent et renvoient le nouveau style et la fonction est redessinée. Comment forcer par programmation la carte à se rafraîchir?
Après quelques recherches et expérimentations, j'ai essayé:
- Faire appel
render()
àol.Map
lui - même. - Appel
dispatchChangeEvent()
à laol.source.Vector
- Appel
redraw()
à laol.layer.Vector
Celles-ci ont été suggérées mais aucune n'a fonctionné, ce qui n'est pas surprenant car seule la première méthode est même répertoriée dans la documentation de l'API OpenLayers 3.2.0 et elle n'est pas marquée comme stable.