So erhalten Sie mithilfe von OpenLayers Namen aller Ebenen in einem Geschäft in GeoServer

9

Ich muss unbedingt die Namen aller Layer in einem GeoServer-Store mit OpenLayers abrufen. Ich habe den Beitrag hier durchgesehen , aber er beantwortet meine Frage nicht. Ich habe auch die REST-API von GeoServer durchgesehen, die ideal wäre, wenn ich eine andere Sprache verwenden würde, z. B. C #, Java oder PHP. Aber ich möchte dies ganz in JavaScript tun.

UPDATE:WFS GetCapabilities Nach dem , was ich im Dokument sehen kann, kann ich Namen aller Ebenen abrufen, indem ich eine WFS-GetCapabilities-Anforderung mithilfe von Filtern sende. Ich bin mir jedoch nicht sicher, ob es möglich ist, Filter in eine GetCapabilitiesAnfrage aufzunehmen. Ich habe auch keine Ahnung, wie ein solcher Filter aussehen wird.

Jeder Rat, wie ich dies erreichen kann, wird sehr geschätzt. Jeder alternative Ansatz wird ebenfalls geschätzt.

AKTUALISIEREN:

Ich glaube, ich habe hier eine Lösung gefunden . "WFS GetCapabilities-Anforderungen können gefiltert werden, um nur Ebenen zurückzugeben, die einem bestimmten Namespace entsprechen. Fügen Sie dazu Ihrer Anforderung den folgenden Code hinzu: namespace = <namespace>". Ich hoffe das hilft jemand anderem.

okello
quelle
Eine erweiterte Frage. Die von Ihnen erwähnte Methode gibt nur XML von bereits veröffentlichten Ebenen und anderen veröffentlichten Informationen zurück. Gibt es eine Möglichkeit, XML-Informationen von unveröffentlichten / ausstehenden Ebenen zurückzugeben? Ich habe versucht, wms / wfs / wcs / REST und sogar Python-Paket gsconfig und keiner von ihnen würde dies tun.
Swap0

Antworten:

18

Ich stelle fest, dass Sie bereits eine Lösung gefunden haben, die für Sie funktioniert, aber ich dachte, ich könnte einige zusätzliche Optionen hinzufügen, die Sie oder andere möglicherweise nützlich finden.

In GeoServer gibt es eine Funktion, die als Virtual OWS Services bezeichnet wird . Die WMS-, WFS- und WCS-Dienste werden zusammen als OWS-Dienste bezeichnet. Wenn Sie eine Anfrage an einen dieser Dienste stellen, stellen Sie eine globale Anfrage, sodass alle registrierten Ebenen im Funktionsdokument zurückgegeben werden (es sei denn, Sie haben Datensicherheitseinstellungen). Im Gegensatz dazu ist ein virtueller Dienst eine gefilterte Ansicht des globalen Dienstes. Die Filterung erfolgt in Arbeitsbereichen und wird über eine etwas andere URL aufgerufen.

Nehmen wir ein Beispiel. Angenommen, Sie haben einen Arbeitsbereich namens myws und für diesen Arbeitsbereich möchten Sie Ebenen auflisten . In diesem Fall können Sie eine Anfrage an die URL stellen:

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

Das zurückgegebene Funktionsdokument listet nur die Ebenen auf, die im myws- Arbeitsbereich registriert sind .

Dies ist ein Ansatz, den Sie jedoch ursprünglich nach dem Zugriff auf die Ebenenliste über JavaScript gefragt hatten. Glücklicherweise gibt es eine Möglichkeit, dies mithilfe der GeoServer REST-API zu tun. Sie können eine Liste von bekommen Feature für einen bestimmten Arbeitsbereich und Datenspeicher mit so etwas wie:

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

Dadurch erhalten Sie ein JSON-Objekt, in dem alle Merkmalstypen im Arbeitsbereich aufgelistet sind. Sie können auch .json durch .xml oder .html ersetzen, um die Antwort in diesen Formaten zu erhalten. Wie geht das in OpenLayers? Glücklicherweise bietet OpenLayers eine Kapselung des XMLHttpRequest-Objekts in Form eines OpenLayers.RequestObjekts. Ein einfaches Beispiel für die Verwendung der obigen REST-URL wäre:

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

Es ist ein gutes Dokument Remote - Daten mit Openlayers auf anfordernden hier .

Ich hoffe, das gibt Ihnen einige andere Ansätze zu berücksichtigen.

Chenderson
quelle
Ich habe jeden Vorschlag in diesem Beitrag getestet, @CHenderson. Sie funktionieren perfekt. Vielen Dank. Das war sehr hilfreich.
Okello
Kein Problem, es ist mir eine Freude, helfen zu können!
Chenderson
Dieser virtuelle OWS-Service-Link ist jetzt tot. Kann hier gefunden werden
wchatx
funktioniert wie ein Zauber
AhammadaliPK
Würden Sie bitte auch die Antwort für die Broschüre hinzufügen?
Tekson
2

Diese Antwort könnte jemandem helfen. Ich wollte automatisch eine Liste meiner Ebenen mit Javascript und Leaflet erstellen. Mit der Antwort von CHenderson habe ich den folgenden Code erstellt:



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

Auf diese Weise kann ich Geben Sie hier die Bildbeschreibung einder Geoserver-Ebene ein Schlüsselwort "Gruppe: GEOGRAPHIE" hinzufügen , und ich muss nicht jede Ebene und ihre Gruppe manuell codieren. Der Name wird zum Erstellen der Ebene verwendet (möglicherweise mithilfe von L.WMS.source), und der Titel ist die HTML-Bezeichnung.

StackUnder
quelle
1

Versuchen Sie, diese Antwort zu überprüfen . Es gibt auch eine Demo. Vergessen Sie nicht, dass Ebenen über verschiedene Dienste bereitgestellt werden, wie dort erwähnt.

ich hoffe es hilft dir ...

Aragon
quelle
Ich habe es überprüft. Es entspricht meinem Gedanken, dass ich dies mithilfe einer WFS GetCapabilitiesAnfrage erreichen kann. Aber ich möchte nur Namen von Ebenen abrufen, sonst nichts. Dies bedeutet, dass ich Filter in meine Anfrage aufnehmen muss. Ich habe jedoch noch keine Ahnung, wie ich Filter an eine WFS GetCapabiltiesAnforderung anhängen kann , die nur die Namen der Ebenen zurückgibt. Siehe mein Update oben. Irgendwelche Hinweise?
Okello