2 votos

Seleccionar múltiples polígonos o puntos de WFS o WMS GetFeatureInfo

¿Existe alguna manera de seleccionar varios polígonos y/o puntos de un servicio WFS o WMS y luego obtener la información de la característica para cada elemento seleccionado?

Hay numerosos ejemplos en el sitio web de OpenLayers pero ninguno muestra cómo hacer una selección múltiple Y obtener los atributos de los elementos seleccionados.

Por ejemplo, puedo obtener la información de la característica para un elemento seleccionado único utilizando la opción GetFeatureInfo para un servicio WMS, pero esto no me permite seleccionar varios elementos. ¡Absolutamente necesito tener la capacidad de seleccionar varios elementos!

También puedo seleccionar varios elementos dibujando un cuadro, un polígono a mano alzada o seleccionando múltiples características individualmente utilizando varios métodos diferentes, pero ninguno de esos métodos tiene la capacidad de obtener la información de la característica.

Mi objetivo es poder seleccionar múltiples características y luego extraer mi identificador único (número de punto o número de polígono) de cada información de la característica para consultar datos de una base de datos de SQL Server. No necesito hacer nada sofisticado con los datos espaciales, todo lo que quiero hacer es seleccionar varios elementos y tomar el id único de cada uno de ellos para poder consultar mi base de datos en busca de información relacionada con los elementos seleccionados.

Estoy utilizando OpenLayers para construir la interfaz de mi mapa y GeoServer para servir mis servicios WMS/WFS. Puedo conectarme a mis shapefiles de puntos y polígonos utilizando WMS o WFS, pero no encuentro una manera de seleccionar varios elementos y luego obtener la información de atributos de los elementos.


Aquí está el código que terminé utilizando:

// ESTA FUNCIÓN ACTUALIZA EL CUADRO DE TEXTO CON LA LISTA DE ATRIBUTOS SELECCIONADOS CUANDO EL USUARIO SELECCIONA UN NUEVO POLÍGONO O MÚLTIPLES POLÍGONOS
var actualizar = function(característica) {
     nombres.push(característica.attributes['nombreDelAtributoDeTusCapasAqui']); 
    mostrarEstado(nombres.join(", "));
};

// ESTA FUNCIÓN ACTUALIZA EL CUADRO DE TEXTO CON LA LISTA DE ATRIBUTOS SELECCIONADOS CUANDO EL USUARIO DESELECCIONA UN POLÍGONO
var limpiar = function(característica) {
  nombre = característica.attributes['nombreDelAtributoDeTusCapasAqui']; 
    for(var y in nombres){
       if (nombre === nombres[y]){
         nombres.splice(y,1);
        }
    }
    mostrarEstado(nombres.join(", "));
};

// INSTANCIAR UN NUEVO CONTROL QUE PERMITE AL USUARIO SELECCIONAR DE LOS RECURSOS DISPONIBLES DE WFS
// var control = new OpenLayers.Control.SelectFeature(
               nombreDeTuCapaAqui, 
              {
                clickout: true, 
       toggle: true,
                multiple: true, 
       hover: false, // si hover se establece en true elimina la funcionalidad de selección.                    
        toggleKey: "ctrlKey", // la tecla Ctrl elimina de la selección
               multipleKey: "shiftKey", // la tecla Shift agrega a la selección
               onSelect: actualizar, // AL SELECCIONAR LLAMA A LA FUNCIÓN ACTUALIZAR
                onUnselect: limpiar, // AL DESELECCIONAR LLAMA A LA FUNCIÓN LIMPIAR
     // 
              // }
          // );

// AGREGAR EL CONTROL A LA COLECCIÓN DE CONTROLES DEL MAPA
// map.addControl(control); 
// ACTIVAR EL NUEVO CONTROL
//control.activate();

1voto

Adam Ernst Puntos 6939

La forma más fácil sería usar un WFS - prueba algo como http://ian01.geog.psu.edu/geoserver/www/wfs/wfs-sld2.html y luego, en lugar de actualizar el div, haz una consulta.

También puedes crear una consulta WFS que tome tu caja o polígono y realice una consulta para devolver todas las entidades que están contenidas o que intersectan con el objeto. Una forma de hacerte una idea de lo que es posible es jugar con las demostraciones de GeoServer (utiliza http://ian01.geog.psu.edu/geoserver/web/?wicket:bookmarkablePage=:org.geoserver.web.demo.DemoRequestsPage si no tienes una instalación local a mano) - desplázate hacia abajo en la lista de solicitudes hasta llegar a las que comienzan con WFS_GetFeatureXXXX.

1voto

Jeroen Dirks Puntos 2515

Aquí está el código que terminé usando. ¡Gracias de nuevo a iant por brindar su generosa asistencia!

//INSTANCIAR UN NUEVO CONTROL QUE PERMITE AL USUARIO SELECCIONAR DE LAS CARACTERÍSTICAS DISPONIBLES DE WFS
var control = new OpenLayers.Control.SelectFeature(
                lyrstands, //EL NOMBRE DE LA CAPA DE LA QUE SE ESTÁ SELECCIONANDO
               {
               clickout: true, //CUANDO HACEN CLIC FUERA DE LA CAPA DEL POLÍGONO, TODOS LOS ELEMENTOS SELECCIONADOS SON DESELECCIONADOS
       toggle: true, //LOS ELEMENTOS SELECCIONADOS PUEDEN SER DESELECCIONADOS Y VICEVERSA
               multiple: true, //EL USUARIO PUEDE SELECCIONAR MÚLTIPLES CARACTERÍSTICAS
       hover: false, //SI HOVER SE ESTABLECE EN TRUE, QUITA LA FUNCIONALIDAD DE SELECCIÓN                   
      highlightOnly: false, 
       toggleKey: "ctrlKey", //LA TECLA CTRL QUITA DE LA SELECCIÓN
               multipleKey: "shiftKey", //LA TECLA SHIFT AGREGA A LA SELECCIÓN
               onSelect: update, //CUANDO SE SELECCIONA LLAMA A LA FUNCIÓN DE ACTUALIZACIÓN
               onUnselect: clear, //CUANDO SE DESELECCIONA LLAMA A LA FUNCIÓN DE LIMPIEZA

               }
          );

//AGREGAR EL CONTROL A LA COLECCIÓN DE CONTROLES DEL MAPA
map.addControl(control); 
//ACTIVAR EL NUEVO CONTROL
control.activate(); 

//ESTA FUNCIÓN ACTUALIZA EL CUADRO DE TEXTO CON LA LISTA DE ESTRUCTURAS SELECCIONADAS CUANDO EL USUARIO SELECCIONA UNA NUEVA ESTRUCTURA
var update = function(feature) {
     names.push(feature.attributes['yourAttributeName']); //LA CARACTERÍSTICA SELECCIONADA EN ESTA FUNCIÓN ESTÁ CODIFICADA DURO A UN ATRIBUTO ESPECÍFICO DE LA CAPA
    showStatus(names.join(", "));
};

//ESTA FUNCIÓN ACTUALIZA EL CUADRO DE TEXTO CON LA LISTA DE ATRIBUTOS DE LA CARACTERÍSTICA SELECCIONADA CUANDO EL USUARIO DESELECCIONA UNA CARACTERÍSTICA
var clear = function(feature) {
  name=feature.attributes['yourAttributeName']; //LA CARACTERÍSTICA DESELECCIONADA EN ESTAS FUNCIONES ESTÁ CODIFICADA DURO A UN ATRIBUTO ESPECÍFICO DE LA CAPA
    for(var y in names){
       if (name === names[y]){
         names.splice(y,1);
        }
    }
    showStatus(names.join(", "));
};

var names = [];
//CREAR LA FUNCIÓN DE SHOWSTATUS QUE ES LLAMADA POR LAS FUNCIONES DE ACTUALIZACIÓN Y LIMPIEZA
//EL NOMBRE DEL CUADRO DE TEXTO QUE MUESTRA LOS ELEMENTOS SELECCIONADOS ES 'responseText'. 
//ESTA FUNCIÓN SOLICITA EL VALOR 'texto' (QUE ES UNA CADENA) DE LAS FUNCIONES DE ACTUALIZACIÓN Y LIMPIEZA Y LUEGO POBLA EL CUADRO DE TEXTO CON LOS VALORES
function showStatus(text) {
    document.getElementById("responseText").innerHTML = text;            
}

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