Comment obtenir les noms de toutes les couches d'un magasin dans GeoServer à l'aide d'OpenLayers

9

J'ai l'obligation stricte de récupérer les noms de toutes les couches dans un magasin GeoServer à l'aide d'OpenLayers. J'ai parcouru le message ici , mais cela ne répond pas à ma question. J'ai également parcouru l'API REST de GeoServer, ce qui serait idéal si j'utilise un autre langage, par exemple C #, Java ou PHP. Mais je veux le faire entièrement en JavaScript.

MISE À JOUR: D'après ce que je peux voir dans le WFS GetCapabilitiesdocument, je peux récupérer les noms de toutes les couches en envoyant une demande WFS GetCapabilities à l'aide de filtres. Mais je ne sais pas s'il est possible d'incorporer des filtres dans une GetCapabilitiesdemande. Je n'ai aucune idée à quoi ressemblera un tel filtre.

Tout conseil sur la façon dont je peux y parvenir sera très apprécié. Toute approche alternative sera également appréciée.

MISE À JOUR:

Je crois avoir trouvé une solution ici ; "Les demandes WFS GetCapabilities peuvent être filtrées pour renvoyer uniquement les couches correspondant à un espace de noms particulier. Pour ce faire, ajoutez le code suivant à votre demande: namespace = <namespace>". J'espère que cela aide quelqu'un d'autre.

ok
la source
Une longue question. La méthode que vous mentionnez ne renvoie que du xml de couches déjà publiées et d'autres informations publiées. Existe-t-il un moyen de renvoyer les informations xml des couches non publiées / en attente? J'ai essayé wms / wfs / wcs / REST et même le paquet python gsconfig et aucun d'eux ne ferait cela.
swap0

Réponses:

18

Je remarque que vous avez déjà trouvé une solution qui fonctionne pour vous, mais j'ai pensé que je pourrais ajouter des options supplémentaires que vous ou d'autres pourraient trouver utiles.

Dans GeoServer, il existe une capacité connue sous le nom de services OWS virtuels . Les services WMS, WFS et WCS sont collectivement appelés services OWS. Lorsque vous effectuez une demande auprès de l'un de ces services, vous effectuez une demande globale, de sorte que toutes les couches enregistrées sont renvoyées dans le document de fonctionnalités (sauf si vous disposez de paramètres de sécurité des données). En revanche, un service virtuel est une vue filtrée du service global. Le filtrage est effectué sur les espaces de travail et est accessible via une URL légèrement différente.

Prenons un exemple. Supposons que vous ayez un espace de travail appelé myws et que c'est cet espace de travail pour lequel vous souhaitez répertorier les couches. Dans ce cas, vous pouvez faire une demande à l'url:

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

Le document sur les capacités renvoyé ne répertorie que les couches enregistrées dans l' espace de travail myws .

C'est une approche, mais vous aviez initialement demandé d'accéder à la liste des couches via JavaScript. Heureusement, il existe un moyen de le faire en utilisant l'API REST GeoServer. Vous pouvez obtenir une liste de types de fonctionnalités pour un espace de travail et une banque de données donnés en utilisant quelque chose comme:

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

Cela vous renverra un objet JSON répertoriant tous les types de fonctionnalités dans l'espace de travail, vous pouvez également remplacer .json par .xml ou .html pour obtenir la réponse dans ces formats. Alors, comment faire cela dans OpenLayers? Heureusement, OpenLayers fournit une encapsulation de l'objet XMLHttpRequest sous forme d' OpenLayers.Requestobjet. Un exemple simple utilisant l'URL REST ci-dessus serait:

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

Il existe un bon document sur la demande de données distantes avec OpenLayers ici .

J'espère que cela vous donne d'autres approches à considérer.

CHenderson
la source
J'ai testé chaque suggestion dans cet article, @CHenderson. Ils fonctionnent parfaitement. Merci beaucoup. C'était extrêmement utile.
okello
Pas de problème, c'est un plaisir de pouvoir aider!
CHenderson
Ce lien de services OWS virtuel est maintenant mort. Peut être trouvé ici
wchatx
fonctionne comme un charme
AhammadaliPK
Souhaitez-vous également ajouter la réponse pour la brochure?
Tekson
2

Cette réponse pourrait aider quelqu'un. Je voulais construire une liste de mes couches automatiquement en utilisant Javascript et Leaflet. En utilisant la réponse CHenderson, j'ai fait le code suivant:



    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 cette façon, je peux ajouter un mot-clé "groupe: GEOGRAPHIE" entrez la description de l'image icisur la couche Geoserver et je n'ai pas besoin de coder manuellement chaque couche et son groupe. Le nom est utilisé pour créer la couche (peut-être en utilisant L.WMS.source) et le titre est l'étiquette html.

StackUnder
la source
1

Essayez de vérifier cette réponse . il donne également une démo. N'oubliez pas que les couches servent via divers services comme il y est mentionné.

J'espère que ça t'aide...

Aragon
la source
Je l'ai vérifié. C'est en accord avec ma pensée que je peux y arriver en utilisant la WFS GetCapabilitiesdemande. Mais je veux seulement récupérer les noms des couches, rien d'autre. Cela signifie que je dois intégrer des filtres dans ma demande. Mais je n'ai toujours aucune idée de la façon dont je peux ajouter des filtres à une WFS GetCapabiltiesdemande qui ne retournerait que les noms des couches. Reportez-vous à ma mise à jour ci-dessus. Des pointeurs?
okello