Tengo un mapa OpenLayers 3.2.0 que presenta algunas fuentes vectoriales ( ol.source.Vector
) y capas vectoriales asociadas ( ol.layer.Vector
)
Cuando ol.Feature
se agregan características ( ) a las fuentes de vector, se les otorga una data
propiedad que se establece en el objeto de JavaScript que representa la característica. TypeScript sigue ...
vectorSource.addFeature(new ol.Feature({
geometry: /* ... */,
data: vectorData,
}));
Las capas vectoriales tienen una función de estilo que lee la data
propiedad y recupera su estilo:
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 */
}
}
});
A veces, los eventos no relacionados con el mapa hacen que los estilos cambien. Por ejemplo, cuando un objeto deja de ser válido, su estilo cambia. Claramente, dado que data.style
está completamente bajo mi control, cambiarlo es trivial.
El problema es que el mapa no sabe que el estilo ha cambiado. Si cambio el estilo de un objeto y luego hago zoom en el mapa, forzándolo a volver a dibujar, noto que mis funciones de estilo se ejecutan y devuelven el nuevo estilo y la característica se vuelve a dibujar. ¿Cómo fuerzo programáticamente el mapa para que se actualice?
Después de algunas búsquedas y experimentos, he intentado:
- Invocando
render()
a laol.Map
misma. - Llamando
dispatchChangeEvent()
alol.source.Vector
- Llamando
redraw()
alol.layer.Vector
Se sugirieron, pero ninguno funcionó, lo cual no es sorprendente, ya que solo el primer método aparece en la documentación de la API de OpenLayers 3.2.0 y no está marcado como estable.
fuente
Respuestas:
Por casualidad, me topé con la respuesta: es recurrir
changed()
a las funciones en sí mismas después de cambiar lastyle
propiedad de sus datos asociados. Ver: http://openlayers.org/en/v3.2.0/apidoc/ol.Feature.html?unstable=true#changedEsto requiere que haga un seguimiento de los
ol.Feature
objetos asociados con cadavectorData
objeto (anteriormente, solo necesitaba encontrarlosvectorData
desde una característica, que podría hacerseget()
), pero esto no es un gran costo.(He encontrado esto mirando
setGeometry
ysetStyle
otros métodos deol.Feature
ver lo que hacen.)fuente
changed
una cantidad razonable de características en realidad conlleva una penalización de rendimiento bastante grave (Chrome se bloqueó varias veces de esta manera). Recomiendo llamarchanged()
a la fuente de su capa después de que todas sus características hayan cambiado.Pasé una semana tratando de descubrir cómo hacer que una entidad (Polígono) desaparezca del mapa después de eliminarla (
vectorSource.removeFeature(selectedFeature)
. Y ninguna solución funcionó. Curiosamente, el OL3 v3.15.1 actual no tiene una función básica de actualización forzada / renderización que funciona! La solución que funcionó para mí fue cambiarselectedFeature
el estilo:Cualquier estilo funcionaría ya que la entidad ya se ha eliminado de la capa pero no se ha actualizado.
fuente