6 votos

OpenLayers carga la capa vectorial WFS: ¿cómo comprobar si el servidor devuelve todas las características?

Mi aplicación tarda varios segundos en devolver todas las características de una capa WFS desde el servidor, me pregunto si hay una forma de comprobar si se devuelven todas las características en la codificación, para poder añadir una máscara de carga...

En otras palabras, ¿cómo se comprueba si una solicitud de WFS tiene éxito o no?

Ejemplo de código:

var newEventLayer = new OpenLayers.Layer.Vector
(
    'test'
    , { "strategies":
            [new OpenLayers.Strategy.BBOX()
            , new OpenLayers.Strategy.Refresh({ "force": true })
            ]
        , "protocol": new OpenLayers.Protocol.WFS(
        {   "version": '1.0.0'
            , "srsName": 'EPSG:4326'
            , "url": '/geoserver/ows?service=WFS'
            , "featureType": 'XXX'
            , "featureNS": 'XXXX'
            , "geometryName": 'GEOM'
        })
    }
);

map.addLayer(newEventLayer);

12voto

Vasu Puntos 11

Asumiendo que estás usando OpenLayers.Protocol.WFS Entonces tienes algo como esto y puedes proporcionar un callback cuando llamas a la operación de lectura en el protocolo:

La devolución de la llamada tiene un OpenLayers.Protocol.Response objeto. Este objeto tiene un error que le avisará de cualquier error.

    var protocol = new OpenLayers.Protocol.WFS({
        version: "1.1.0",
        url: xxx
        featurePrefix: xxx
        featureType: xxx
        featureNS: xxx
        geometryName: xxx
//        defaultFilter: searchFilter,
        srsName: xxx
    });

    var response = protocol.read({
        maxFeatures: 100,
        callback: _CallBack
    });

   function _CallBack (resp) {
        console.log(resp);
        console.log(resp.error);
    });

enter image description here

Actualización

El problema de suministrar el protocolo en el constructor de la capa es que no tienes la oportunidad de llamar a .read() y la oportunidad de proporcionar su propia devolución de llamada para controlar la respuesta porque la capa lo hace por usted.

Así que si quieres controlar los resultados vas a tener que crear la capa y el protocolo por separado para poder llamar al .read() cada vez que hagas clic en el botón "buscar", por ejemplo. Luego, cuando obtengas los resultados, añadirás esas características a la capa newEventLayer.addFeatures(resp.features);

var newEventLayer = new OpenLayers.Layer.Vector('test');
map.addLayer(newEventLayer);
var protocol = new OpenLayers.Protocol.WFS({
    version: "1.1.0",
    url: xxx,
    featurePrefix: xxx,
    featureType: xxx,
    featureNS: xxx,
    geometryName: xxx,
    defaultFilter: new OpenLayers.Filter.Logical({
        type: OpenLayers.Filter.Logical.AND,
        filters: getMyFilter()
    }),
    srsName: xxx
});

var response = protocol.read({
    maxFeatures: 100,
    callback: _CallBack
});

function _CallBack (resp) {
    newEventLayer.addFeatures(resp.features);
});

Actualización 2

Pruebe esto si _callBack no se llama:

var _CallBack = function (resp) {
    newEventLayer.addFeatures(resp.features);
});
var response = protocol.read({
    maxFeatures: 100,
    callback: _CallBack
});

Estrategia de filtrado

Tienes razón, he eliminado la estrategia del constructor de la capa. Usted va a tener que especificar su filtrar por separado o en el constructor del protocolo como lo tengo arriba. Pero vas a tener que construir un filtro de búsqueda de todos modos si quieres buscar tu servicio WFS por atributos, fecha/hora, etc. ¿O sólo quieres depender de la estrategia BBox (dame TODO en la BBOX)? Si es así, entonces sólo tienes que configurar un filtro para eso y llamar al protocol.read() en el evento de cambio de extensión del mapa. Después de todo, eso es todo lo que hace la estrategia. Pero esa es una pregunta separada con la que yo, u otros pueden ayudarte.

0voto

David Casillas Puntos 121

Si sólo quieres hacer una máscara de carga (sin comprobar si hay errores) puedes usar el evento 'loadend':

layer.events.register('loadend', olLayer, function () {

  turn off your loading mask
});

-1voto

texai Puntos 178

Puedes comprobarlo con algún programa:

en extjs:

 Ext.Ajax.request({
         url : 'wmsServerAdress',
                  method: 'POST',
                  params :{....},
                  success: function ( result, request ) {
                      var jsonData = Ext.util.JSON.decode(result.responseText);
                      //do something
               },
                  failure: function ( result, request ) {
                   var jsonData = Ext.util.JSON.decode(result.responseText);
                   //do something
               }
       });

en jquery:

 $.ajax({  
        type: 'POST',  
        url: 'wmsServerAdress',  
        dataType: 'text',  
        success: function(result){//doSomething},   
        error: function(data) {//doSomething);} 
    }); 

y con estos códigos puedes obtener el resultado de si tu petición de wms se ha cargado o no.

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