Cómo obtener nombres de todas las capas en una tienda en GeoServer usando OpenLayers

9

Tengo un requisito estricto para recuperar los nombres de todas las capas en una tienda GeoServer usando OpenLayers. He leído la publicación aquí , pero no responde mi pregunta. También pasé por la API REST de GeoServer, que sería ideal si estoy usando otro lenguaje, por ejemplo, C #, Java o PHP. Pero quiero hacer esto completamente en JavaScript.

ACTUALIZACIÓN: Por lo que puedo ver en el WFS GetCapabilitiesdocumento, puedo recuperar los nombres de todas las capas enviando una solicitud de GetCapabilities de WFS usando filtros. Pero no estoy seguro de si es posible incorporar filtros en una GetCapabilitiessolicitud. Tampoco tengo idea de cómo se verá ese filtro.

Cualquier consejo sobre cómo puedo lograr esto será muy apreciado. Cualquier enfoque alternativo también será apreciado.

ACTUALIZAR:

Creo que he encontrado una solución aquí ; "Las solicitudes de GetCapabilities de WFS se pueden filtrar para devolver solo las capas correspondientes a un espacio de nombres en particular. Para hacer esto, agregue el siguiente código a su solicitud: namespace = <namespace>". Espero que esto ayude a alguien más.

okello
fuente
Una pregunta extendida. El método que menciona solo devuelve xml de capas ya publicadas y otra información publicada. ¿Hay alguna forma de devolver información xml de capas no publicadas / pendientes? He probado wms / wfs / wcs / REST e incluso el paquete python gsconfig y ninguno de ellos haría esto.
swap0

Respuestas:

18

Noté que ya ha encontrado una solución que funciona para usted, pero pensé que podría agregar algunas opciones adicionales que usted u otros puedan encontrar útiles.

En GeoServer hay una capacidad conocida como Virtual OWS Services . Los servicios WMS, WFS y WCS se conocen colectivamente como servicios OWS. Cuando realiza una solicitud a uno de estos servicios, realiza una solicitud global, por lo que todas las capas registradas se devuelven en el documento de capacidades (a menos que tenga configuraciones de seguridad de datos). Por el contrario, un servicio virtual es una vista filtrada del servicio global. El filtrado se realiza en espacios de trabajo y se accede a través de una URL ligeramente diferente.

Tomemos un ejemplo. Suponga que tiene un espacio de trabajo llamado myws y es este espacio de trabajo para el que desea enumerar las capas. En ese caso, puede hacer una solicitud a la URL:

http://www.yourgeoserver.com/geoserver/myws/ows?SERVICE=WFS&REQUEST=GetCapabilities

El documento de capacidades devuelto solo enumerará las capas registradas en el espacio de trabajo myws .

Ese es un enfoque, sin embargo, originalmente había preguntado sobre el acceso a la lista de capas a través de JavaScript. Afortunadamente, hay una manera de hacerlo utilizando la API REST de GeoServer. Puede obtener una lista de tipos de características para un espacio de trabajo y un almacén de datos determinados usando algo como:

http://www.yourgeoserver.com/geoserver/rest/workspaces/myws/featuretypes.json

Esto le devolverá un objeto JSON que enumera todos los tipos de características dentro del espacio de trabajo, también puede sustituir .json por .xml o .html para obtener la respuesta en esos formatos. Entonces, ¿cómo hacer esto en OpenLayers? Afortunadamente, OpenLayers proporciona una encapsulación del objeto XMLHttpRequest en forma de OpenLayers.Requestobjeto. Un ejemplo simple usando la URL REST anterior sería:

var request = OpenLayers.Request.GET({
  url: "http://www.yourgeoserver.com/geoserver/rest/workspaces/myws/featuretypes.json",
  callback: function(request) {
    // Code here to handle the response, the request object contains the data
  }
});

Hay un buen documento de solicitud de datos remotos con OpenLayers aquí .

Espero que le brinde otros enfoques para considerar.

CHenderson
fuente
He probado todas y cada una de las sugerencias en esta publicación, @CHenderson. Funcionan perfectamente Muchas gracias. Esto fue extremadamente útil.
okello
¡No hay problema, es un placer poder ayudar!
CHenderson
Ese enlace virtual de servicios OWS está muerto ahora. Se puede encontrar aquí
wchatx
funciona como un encanto
AhammadaliPK
¿Podría agregar la respuesta para el folleto también?
Tekson
2

Esta respuesta podría ayudar a alguien. Quería crear una lista de mis capas automáticamente usando Javascript y Leaflet. Usando la respuesta CHenderson, hice el siguiente código:



    url = "https://YOUSERVER/geoserver/STORE/ows?service=wfs&version=2.0.0&request=GetCapabilities"
    layerList = [];
    $.ajax({
        type: "GET",
        url: url,
        dataType: "xml",
        success: function(xml) {
            $(xml).find('FeatureType').each(function(){
                name = $(this).find("Name").text();
                title = $(this).find("Title").text();
                group = "NO_GROUP";
                $(this).find('ows\\:Keywords').each(function(){
                    keyword = $(this).find('ows\\:Keyword').text();
                    if(keyword.indexOf("group:")!=-1)
                    {
                        group=keyword.split(":")[1];
                        return false;
                    }
                });
                layerList.push({"name":name,"title":title,"group":group});          
            });
        }
    });

De esta manera, puedo agregar una palabra clave "grupo: GEOGRAFÍA" ingrese la descripción de la imagen aquíen la capa Geoserver y no tengo que codificar manualmente cada capa y su grupo. El nombre se usa para crear la capa (quizás usando L.WMS.source) y el título es la etiqueta html.

StackUnder
fuente
1

Intenta ver esta respuesta . También da una demostración. No olvide que las capas sirven a través de varios servicios como se menciona allí.

Espero que te ayude...

Aragón
fuente
Lo he comprobado. Está en línea con mi pensamiento de que puedo lograr esto usando WFS GetCapabilitiesrequest. Pero solo quiero recuperar nombres de capas, nada más. Esto significa que tengo que incorporar filtros en mi solicitud. Pero todavía no tengo idea de cómo puedo agregar filtros a una WFS GetCapabiltiessolicitud que solo devolvería los nombres de las capas. Consulte mi actualización anterior. Cualquier puntero?
okello