4 votos

¿Usando caché de WFS / Botón de retroceso?

Estoy usando el protocolo WFS en la capa Vectorial / GeoServer / PostGIS

Actualmente, el mapa se actualiza y realiza nuevas solicitudes cada vez que hago algo como buscar o dibujar, y cuando regreso a una parte del mapa que ya tenía características descargadas, se actualiza y realiza una nueva solicitud de nuevo. necesito reutilizar datos anteriores para solicitudes anteriores.

He leído que OpenLayers no tiene esta funcionalidad. pero eso fue hace mucho tiempo.

¿Existe alguna forma de almacenar en caché los retornos de WFS marcando el booleano en la parte superior del código o algo así?

Eso me ayudará a implementar mi botón de RETROCESO para que pueda almacenar solicitudes anteriores en una pila y extraer solicitudes cuando el usuario haga clic en el botón de retroceso.

3voto

Swinders Puntos 1042

Las solicitudes POST de HTTP normalmente no se almacenan en caché - ver esta pregunta de StackOverflow: https://stackoverflow.com/questions/626057/is-it-possible-to-cache-post-methods-in-http

Sin embargo, si cambias tu capa WFS para usar solicitudes GET en lugar de solicitudes POST, entonces estas solicitudes pueden ser almacenadas en caché.

Tuve que aplicar un parche a mi instalación de OpenLayers para que esto funcionara correctamente - http://trac.osgeo.org/openlayers/ticket/2718

Luego puedes establecer el método WFS como GET al crear la capa (en el parámetro de opciones).

2voto

Celso Puntos 66

Las especificaciones de HTML5 tienen una característica que hace exactamente lo que necesitas, para más detalles consulta la documentación en la Red de Desarrolladores de Mozilla:

https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history

Desafortunadamente, esto significa que tendrás que codificar la integración entre OpenLayers y las diferentes implementaciones de historial de navegación de los navegadores. Hay plugins para jquery pero como no tengo experiencia directa con ninguno de ellos, no puedo hacer recomendaciones.

Básicamente lo que necesitas hacer es:

  1. cuando se emite una consulta WFS, incluir los resultados en el historial del navegador
  2. configurar un escuchador para que seas notificado de los eventos de retroceso/avance
  3. manejar los eventos de retroceso/avance eliminando características de consultas WFS anteriores

Hay dos nuevos desarrollos en el mundo de JavaScript (Amber.js y Sproutcore) que tienen un marco completo para manejar el historial del navegador o como ellos lo llaman rutas y te sugiero encarecidamente que los consultes antes de crear el tuyo propio.

Por cierto: si descargas muchas características con las consultas WFS, el navegador podría quedarse sin memoria y ser más lento que si solo tuviera que obtener las características de WFS cada vez. Aplica primero las 3 reglas de optimización.

2voto

Ne An Derthal Puntos 39789

¿Qué tipo de estrategia estás utilizando? Si estás utilizando la estrategia boundingBox, en cada pan/zoom OL hará una nueva solicitud para obtener las entidades que están dentro del mapa. Dependiendo de cuántas entidades tengas, para reducir el número de solicitudes ajax puedes intentar usar OpenLayers.Strategy.Fixed en su lugar.

En cuanto al almacenamiento en caché, OpenLayers tiene controles de caché, pero creo que son solo para el protocolo WMS (nunca he intentado usarlos en una capa vectorial).

O, podrías implementar tu propio sistema de caché, que debería ser bastante simple, sobrescribiendo el método OpenLayers.Protocol.read()

var layer = new OpenLayers.Layer.Vector(
    "layer",
    {
        strategies:[new OpenLayers.Strategy.Fixed()],
        projection: this.wgs84Projection,
        //filter: propertyFilter,
        protocol: new OpenLayers.Protocol.WFS.v1_1_0(
        {
            version: '1.1.0',
            url: Optima.Settings.getServiceUrl("wfs"),
            read: function(options)
            {
                /*
                 * Override of read() to avoid loading events using WFS. 
                 * Or, implement a cache: 
                 * {options} have all the necessary information to build
                 * a WFS request, and a callback to call after the data are loaded
                 * is also provided
                 */
                return null;
            }
            featureType: 'events',
            featureNS :  Optima.Settings.client.namespace,
            featurePrefix: Optima.Settings.client.typename,
            geometryName: 'shape',
            extractAttribute:   true,
            srsName: 'EPSG:4326'                
        }),
        displayInLayerSwitcher: false
    });

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X