7 votos

WMS GetFeatureInfo y CQL en múltiples capas

Estoy teniendo problemas con la consulta de capas filtradas CQL con OpenLayers y GeoServer, utilizando el control GetFeatureInfo. Se ignora el filtro CQL y se consulta toda la capa (como lo demuestran tanto los resultados como la solicitud que envía a GeoServer).

He visto ejemplos en los que el filtro CQL se pasa a GeoServer junto con la solicitud GetFeatureInfo, pero tengo varias capas visibles y cada una de ellas tiene un filtro CQL diferente; así que no estoy seguro de cómo/si puedo manejar esto añadiendo mi filtro a la URL de la solicitud.

¿Alguien tiene alguna idea de cómo puedo resolver o solucionar este problema?

6voto

Christian P. Puntos 2268

Como se ha indicado anteriormente, se añade una consulta CQL extra separada por cada capa. La primera consulta se alinea con la primera capa, la segunda con la segunda, etc. Por lo tanto, incluso si usted quiere la misma consulta en cada capa, sería algo como:

https://server.com/geoserver/site/wms?service=WMS&version=1.1.0&request=GetMap
&styles=&bbox=-180.0,-90.0,180.0,90.0&width=660&height=330&srs=EPSG:4326&format=kml
&layers=site:layer1,site:layer2,site:layer3,site:layer4
&CQL_FILTER=aoi_id=2;aoi_id=2;aoi_id=2;aoi_id=2

3voto

androiduser34 Puntos 51

Estaba tratando de hacer algo similar con el WMSGetFeatureInfo control y la respuesta de @JayCrossler más arriba me indicaron la dirección correcta. Encontré que para cada capa que quieres incluir en la consulta necesitas comprobar si hay un CQL_FILTER existente y aplicar este filtro al vendorParams parámetro. Nota el uso de INCLUDE para representar un filtro vacío.

// Add filter for each layer where lyrs is an array of the layers to query
var filter = '';
for (var i = 0; i < lyrs.length; i++) {

    if (lyrs[i].params && lyrs[i].params.CQL_FILTER) {
        filter += lyrs[i].params.CQL_FILTER;
    } else {
        filter += 'INCLUDE';
    }
    if (i < lyrs.length-1) {
        filter += ';';
    }
}

new OpenLayers.Control.WMSGetFeatureInfo({
    ...
    vendorParams: {
        CQL_FILTER: filter
    }
});

3voto

2voto

ypercube Puntos 461

Yo también estoy mirando esto. Mi problema es diferente ya que no estoy seguro de cómo dirigirme a la capa correcta. He encontrado esto: http://www.azavea.com/blogs/labs/2011/06/using-the-cql_filter-parameter-with-openlayers-wms-layers/

Pero creo que entiendo tu problema. Tendrías que hacer una función que agarre el término de búsqueda (o búsqueda estática) y envíe la llamada de forma diferente a cada capa. Estoy usando una caja de búsqueda y una casilla de verificación donde buscar. Haga clic en la casilla de verificación (MyRadios) e introduzca la consulta de búsqueda. En el formulario, tener una presentación desencadenar la función y suprimir la acción por defecto. Yo uso ExtJS pero usted obtendría el valor del botón de radio marcado junto con el campo de entrada. Si quieres la opción del botón de radio puedes usar una sentencia if para cambiar el parámetro según el valor del radio marcado.

 function CQLfilter(param){ //param here would be the search value
        // send different request to different layers
     req1 = "field1 LIKE '%" + param + "%'";
     req2 = "field2 LIKE '%" + param + "%'";
     req3 = "field3 LIKE '%" + param + "%'";  
     wms_layer1.mergeNewParams({'CQL_FILTER': req1});
     wms_layer2.mergeNewParams({'CQL_FILTER': req1});
     wms_layer3.mergeNewParams({'CQL_FILTER': req1})
    }
function resetCQLfilters() {
    delete wms_layer1.params.CQL_FILTER;
    wms_layer1.redraw();
    delete wms_layer2.params.CQL_FILTER;
    wms_layer2.redraw();
    delete wms_layer3.params.CQL_FILTER;
    wms_layer3.redraw();
    }

Esto es sólo una toma. Mi problema es que estoy utilizando una función para crear y cargar las capas, pero no sé cómo entonces obtener el nombre de la capa. ¿Sabe usted lo que mi layername sería en mi ejemplo?

var createWmsLayer = function(name, url, params, options) {
        map.addLayer(new OpenLayers.Layer.WMS(name, url, params, options));
    };

createWmsLayer("<span class='locc'>Ikke listet</span>", "http://localhost/geoserver/wms",
                {layers: 'gbif_ns:ikke_listet',format: 'image/png', transparent: 'true'}, {singleTile: true, ratio: 1, isBaseLayer:false, visibility: false}
                        );

~asle

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