Como obter nomes de todas as camadas em uma loja no GeoServer usando OpenLayers

9

Eu tenho um requisito estrito para recuperar nomes de todas as camadas em um armazenamento GeoServer usando OpenLayers. Passei pelo post aqui , mas ele não responde à minha pergunta. Também passei pela API REST do GeoServer, o que seria ideal se eu estivesse usando outra linguagem, como C #, Java ou PHP. Mas eu quero fazer isso inteiramente em JavaScript.

ATUALIZAÇÃO: Pelo que posso ver no WFS GetCapabilitiesdocumento, posso recuperar os nomes de todas as camadas enviando uma solicitação GetCapabilities do WFS usando filtros. Mas não tenho certeza se é possível incorporar filtros em uma GetCapabilitiessolicitação. Também não tenho idéia de como será esse filtro.

Qualquer conselho sobre como eu posso conseguir isso será muito apreciado. Qualquer abordagem alternativa também será apreciada.

ATUALIZAR:

Acredito que encontrei uma solução aqui ; "As solicitações WFS GetCapabilities podem ser filtradas para retornar apenas as camadas correspondentes a um espaço para nome específico. Para fazer isso, adicione o seguinte código à sua solicitação: namespace = <namespace>". Espero que isso ajude outra pessoa.

okello
fonte
Uma pergunta estendida. O método mencionado apenas retorna xml de camadas já publicadas e outras informações publicadas. Existe alguma maneira de retornar informações xml de camadas não publicadas / pendentes? Eu tentei o wms / wfs / wcs / REST e até o pacote python gsconfig e nenhum deles faria isso.
usar o seguinte comando

Respostas:

18

Percebo que você já encontrou uma solução que funciona para você, mas pensei em adicionar algumas opções adicionais que você ou outras pessoas possam achar úteis.

No GeoServer, existe um recurso conhecido como Virtual OWS Services . Os serviços WMS, WFS e WCS são conhecidos coletivamente como serviços OWS. Ao fazer uma solicitação para um desses serviços, você está fazendo uma solicitação global, para que todas as camadas registradas sejam retornadas no documento de recursos (a menos que você tenha configurações de segurança de dados). Por outro lado, um serviço virtual é uma visualização filtrada do serviço global. A filtragem é feita nas áreas de trabalho e é acessada através de um URL ligeiramente diferente.

Vamos dar um exemplo. Suponha que você tenha um espaço de trabalho chamado myws e é nesse espaço de trabalho que você gostaria de listar as camadas. Nesse caso, você pode fazer uma solicitação ao URL:

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

O documento de recursos retornados listará apenas as camadas registradas no espaço de trabalho myws .

Essa é uma abordagem, no entanto, você havia perguntado originalmente sobre o acesso à lista de camadas por meio de JavaScript. Felizmente, há uma maneira de fazer isso usando a API REST do GeoServer. Você pode obter uma lista de tipos de características para um determinado espaço de trabalho e armazenamento de dados usando algo como:

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

Isso retornará um objeto JSON listando todos os tipos de características no espaço de trabalho. Você também pode substituir .json por .xml ou .html para obter a resposta nesses formatos. Então, como fazer isso no OpenLayers? Felizmente, o OpenLayers fornece um encapsulamento do objeto XMLHttpRequest na forma de OpenLayers.Requestobjeto. Um exemplo simples usando o URL REST acima seria:

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
  }
});

Há um bom documento sobre como solicitar dados remotos com o OpenLayers aqui .

Espero que isso lhe dê algumas outras abordagens a serem consideradas.

CHenderson
fonte
Testei cada sugestão neste post, @CHenderson. Eles funcionam perfeitamente. Muito obrigado. Isso foi extremamente útil.
okello 24/07/12
Não tem problema, é um prazer poder ajudar!
21812 CHenderson
Esse link de serviços OWS virtuais está morto agora. Pode ser encontrada aqui
wchatx
funciona como um encanto
AhammadaliPK
Você também poderia adicionar a resposta para o folheto?
Tekson
2

Esta resposta pode ajudar alguém. Eu queria criar uma lista de minhas camadas automaticamente usando Javascript e Leaflet. Usando a resposta CHenderson, criei o seguinte 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});          
            });
        }
    });

Dessa forma, posso adicionar uma palavra-chave "group: GEOGRAPHY" insira a descrição da imagem aquina camada Geoserver e não preciso codificar manualmente cada camada e seu grupo. O nome é usado para criar a camada (talvez usando L.WMS.source) e o título é o rótulo html.

StackUnder
fonte
1

Tente verificar esta resposta . também dá uma demonstração. Não se esqueça que as camadas servem por vários serviços, como mencionado lá.

espero que ajude você ...

Aragão
fonte
Eu verifiquei. Está de acordo com meu pensamento de que eu posso conseguir isso usando WFS GetCapabilitiesrequest. Mas eu só quero recuperar nomes de camadas, nada mais. Isso significa que eu tenho que incorporar filtros em minha solicitação. Mas ainda não tenho ideia de como anexar filtros a uma WFS GetCapabiltiessolicitação que retornaria apenas os nomes das camadas. Consulte a minha atualização acima. Alguma dica?
Ok 23/07