Antecedentes
Añadir unos 700 sitios a un mapa de OpenLayers. Firefox 11 y Google Chrome muestran los sitios sin problemas. IE8, que es el estándar de la organización y no se actualizará en un futuro próximo, se atasca cuando se muestran los 700 sitios.
Cada sitio tiene un icono representativo, de un conjunto de 15 iconos. Al hacer clic en cada sitio, aparece una ventana emergente informativa. La ventana emergente se carga por cada clic. El HTML de la ventana emergente se carga en la memoria una vez (y sólo una vez) desde una única plantilla. Al hacer clic en el sitio se muestra la ventana emergente, que carga dinámicamente los datos JSON y rellena la plantilla sobre la marcha (para reducir el consumo de memoria).
Esta aplicación utiliza OpenLayers v2.12 (723 kb).
Código
Los sitios se añaden a la capa "sitios" de la siguiente manera:
/**
* Adds a site to the list of sites.
*/
function addSite( sites, uuid, label, lon, lat, icon ) {
sites.push(
new OpenLayers.Feature.Vector(
getPoint( lon, lat ),
{
uuid: uuid,
siteType: icon,
title: label
}
)
);
}
/**
* Fetches the list of all sites from the query service and adds them
* to the site layer.
*
* @param siteLayer - The site is added to this layer.
*/
function addSites( siteLayer ) {
$.ajax({
url: MAP_SERVER_SERVICE + 'sites',
type: 'GET',
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function( data ) {
var sites = [];
$.each( data, function( key, val ) {
addSite(
sites,
val.uuid,
val.label,
val.longitude,
val.latitude,
val.site_classification );
});
siteLayer.addFeatures( sites );
}
});
}
Se devuelven unos 100k de datos JSON desde el servicio del servidor de mapas (es decir, la llamada Ajax).
Pregunta
¿Cómo se pueden cargar ~700 funciones en IE8 a través de OpenLayers sin atascarlo?
Los sitios no pueden representarse en azulejos de mapa porque el icono es dinámico (es decir, diferentes resultados de búsqueda producirán diferentes azulejos en la misma ubicación).
Ideas
Algunas ideas que he considerado son:
- Actualizar - Probablemente no sea factible pedir a todos los que vayan a utilizar la aplicación que se actualicen a IE9.
- Navegador - Puede que no sea factible pedir a la gente que se descargue Chrome (o Firefox) sólo para ver una aplicación web.
- Mapa vacío - Esto haría que el mapa respondiera bastante bien al principio, pero todavía se atascaría cuando mostrara un gran número de sitios. Esta es la más trivial de las soluciones.
- Optimizar - No hay garantía de que, incluso después de optimizar OpenLayers, el sitio sea más receptivo.
- Zona restringida - Define una región de "visibilidad" (como una sección rectangular) y sólo muestra los sitios que están dentro de esa región. Esto reduce significativamente la utilidad de la herramienta.
- Límites del sitio - Limitar el número de sitios devueltos para una búsqueda determinada. Esto produciría resultados engañosos.
- Ocultar características superpuestas - Ocultar sitios que están parcialmente ocultos por otros sitios. Esto es probablemente produce resultados óptimos. Este es un tipo de estrategia de clústeres .
¿Qué otras posibilidades hay para acelerar IE8?
Por si sirve de algo, el postDraw
y createNode
(30,25 segundos) de OpenLayers ocupan la mayor parte del tiempo de la aplicación, según el depurador de IE8.
Actualización nº 1
Para ilustrar la cantidad de datos:
Hay sitios que quedan fuera de la provincia, pero son literalmente escasos.
Vista ampliada:
Actualización #2
Pensé que podría "ocultar" algunas de las características, pero esto no ayuda:
function hideFeatures( layer ) {
var features = layer.features;
for( var i = 0; i < features.length; i++ ) {
features[i].style = { visibility: 'hidden' };
}
layer.redraw();
}
Parece que en realidad tendrán que ser removidos de la capa para ser performantes.
Enlaces relacionados
- https://stackoverflow.com/questions/6528243/how-to-hide-vector-features-in-openlayers
- https://stackoverflow.com/questions/6578846/get-distance-in-pixels-between-2-lonlat-objects-in-openlayers
- http://openflights.org/blog/2009/10/21/customized-openlayers-cluster-strategies/
Gracias.