Come ottenere i nomi di tutti i livelli in un negozio in GeoServer usando OpenLayers


9

Ho un severo requisito per recuperare i nomi di tutti i layer in un negozio GeoServer usando OpenLayers. Ho esaminato il post qui , ma non risponde alla mia domanda. Ho anche esaminato l'API REST di GeoServer, che sarebbe l'ideale se sto usando un'altra lingua, diciamo C #, Java o PHP. Ma voglio farlo interamente in JavaScript.

AGGIORNAMENTO: da quello che posso vedere nel WFS GetCapabilitiesdocumento, posso recuperare i nomi di tutti i livelli inviando una richiesta GetCapabilities WFS utilizzando i filtri. Ma non sono sicuro se sia possibile incorporare filtri in una GetCapabilitiesrichiesta. Né ho idea di come sarà un tale filtro.

Qualsiasi consiglio su come posso ottenere questo obiettivo sarà molto apprezzato. Sarà apprezzato anche qualsiasi approccio alternativo.

AGGIORNARE:

Credo di aver trovato una soluzione qui ; "Le richieste WFS GetCapabilities possono essere filtrate per restituire solo i livelli corrispondenti a un determinato spazio dei nomi. A tale scopo, aggiungi il seguente codice alla tua richiesta: namespace = <namespace>". Spero che questo aiuti qualcun altro.


Una domanda estesa. Il metodo che menzioni restituisce solo xml di layer già pubblicati e altre informazioni pubblicate. Esiste un modo per restituire informazioni XML di layer non pubblicati / in sospeso? Ho provato wms / wfs / wcs / REST e persino il pacchetto python gsconfig e nessuno di loro lo farebbe.
Scambio0

Risposte:


18

Ho notato che hai già trovato una soluzione che funziona per te, ma ho pensato che avrei potuto aggiungere alcune opzioni aggiuntive che tu o altri potreste trovare utili.

In GeoServer esiste una funzionalità nota come Servizi OWS virtuali . I servizi WMS, WFS e WCS sono noti collettivamente come servizi OWS. Quando si effettua una richiesta a uno di questi servizi, si effettua una richiesta globale, quindi tutti i livelli registrati vengono restituiti nel documento sulle funzionalità (a meno che non si disponga di impostazioni di sicurezza dei dati). Al contrario, un servizio virtuale è una vista filtrata del servizio globale. Il filtro viene eseguito su aree di lavoro e vi si accede tramite un URL leggermente diverso.

Facciamo un esempio. Supponiamo di avere uno spazio di lavoro chiamato myws ed è questo spazio di lavoro per il quale vorresti elencare i livelli. In tal caso è possibile effettuare una richiesta all'URL:

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

Il documento sulle funzionalità restituite elencherà solo i livelli registrati nell'area di lavoro di myws .

Questo è un approccio, tuttavia in origine ti era stato chiesto di accedere all'elenco dei livelli tramite JavaScript. Fortunatamente c'è un modo per farlo usando l'API REST di GeoServer. È possibile ottenere un elenco di featuretypes per un determinato spazio di lavoro e archivio dati usando qualcosa come:

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

Questo ti restituirà un oggetto JSON che elenca tutti i featuretypes all'interno dell'area di lavoro, puoi anche sostituire .json con .xml o .html per ottenere la risposta in quei formati. Quindi, come fare questo in OpenLayers? Fortunatamente OpenLayers fornisce un incapsulamento dell'oggetto XMLHttpRequest sotto forma di OpenLayers.Requestoggetto. Un semplice esempio usando l'URL REST sopra sarebbe:

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

C'è un buon documento sulla richiesta di dati remoti con OpenLayers qui .

Spero che ti dia qualche altro approccio da considerare.


Ho testato ogni singolo suggerimento in questo post, @CHenderson. Funzionano perfettamente. Molte grazie. Questo è stato estremamente utile.
Okello,

Nessun problema, è un piacere poter aiutare!
CHenderson,

Quel collegamento virtuale di servizi OWS è morto ora. Può essere trovato qui
wchatx

funziona come un incanto
AhammadaliPK

La prego di aggiungere anche la risposta per il volantino?
Tekson il

2

Questa risposta potrebbe aiutare qualcuno. Volevo creare automaticamente un elenco dei miei livelli usando Javascript e Leaflet. Usando la risposta di CHenderson, ho creato il seguente codice:



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

In questo modo, posso aggiungere una parola chiave "gruppo: GEOGRAFIA" inserisci qui la descrizione dell'immaginesul livello Geoserver e non devo codificare manualmente ogni livello e il suo gruppo. Il nome viene utilizzato per creare il layer (magari utilizzando la risorsa L.WMS) e il titolo è l'etichetta html.


1

Prova a dare un'occhiata a questa risposta . dà anche una demo. Non dimenticare che i livelli servono tramite vari servizi come indicato qui.

spero che ti aiuti ...


L'ho verificato. È in linea con il mio pensiero che posso raggiungere questo obiettivo utilizzando la WFS GetCapabilitiesrichiesta. Ma voglio solo recuperare i nomi dei livelli, nient'altro. Ciò significa che devo includere i filtri nella mia richiesta. Ma non ho ancora idea di come aggiungere filtri a una WFS GetCapabiltiesrichiesta che restituirebbe solo i nomi dei layer. Fare riferimento al mio aggiornamento sopra. Qualche puntatore?
Okello,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.