OpenLayersを使用してGeoServerのストア内のすべてのレイヤーの名前を取得する方法


9

OpenLayersを使用して、GeoServerストアのすべてのレイヤーの名前を取得するという厳しい要件があります。ここで投稿を確認しましたが、質問の答えにはなりません。また、GeoServerのREST APIを使用しました。これは、C#、Java、PHPなどの別の言語を使用している場合に理想的です。しかし、私はこれを完全にJavaScriptで実行したいと考えています。

更新:WFS GetCapabilitiesドキュメントで 確認できる内容から、フィルターを使用してWFS GetCapabilitiesリクエストを送信することで、すべてのレイヤーの名前を取得できます。しかし、GetCapabilitiesリクエストにフィルターを組み込むことが可能かどうかはわかりません。また、そのようなフィルターがどのように表示されるかについてもまったくわかりません。

これを達成する方法についてのアドバイスは、高く評価されます。任意の代替アプローチも評価されます。

更新:

私はここで解決策を見つけたと思います。「WFS GetCapabilitiesリクエストをフィルタリングして、特定の名前空間に対応するレイヤーのみを返すことができます。これを行うには、リクエストに次のコードを追加します:namespace = <namespace>"。これが誰かを助けることを願っています。


拡張された質問。言及したメソッドは、既に公開されているレイヤーのXMLとその他の公開されている情報のみを返します。未公開/保留中のレイヤーのXML情報を返す方法はありますか?私はwms / wfs / wcs / RESTとpythonパッケージgsconfigを試してみましたが、どれもこれを実行しませんでした。
swap0 2014

回答:


18

私はあなたがあなたのために働く解決策をすでに見つけたことに気づきましたが、私はあなたや他の人が役に立つと思うかもしれないいくつかの追加のオプションを追加するかもしれないと思いました。

GeoServerには、仮想OWSサービスと呼ばれる機能があります。WMS、WFS、およびWCSサービスは、総称してOWSサービスと呼ばれます。これらのサービスの1つにリクエストを行うと、グローバルリクエストが行われるため、登録されているすべてのレイヤーが機能ドキュメントに返されます(データセキュリティ設定がない場合)。対照的に、仮想サービスはグローバルサービスのフィルターされたビューです。フィルタリングはワークスペースで行われ、わずかに異なるURLを介してアクセスされます。

例を見てみましょう。mywsというワークスペースがあり、レイヤーを一覧表示するのがこのワークスペースであるとします。その場合、次のURLにリクエストを送信できます。

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

返されるケーパビリティドキュメントには、mywsワークスペースに対して登録されたレイヤーのみがリストされます。

これは1つのアプローチですが、JavaScriptを使用してレイヤーリストにアクセスすることについて最初に尋ねました。幸い、GeoServer REST APIを使用してこれを行う方法があります。次のようなものを使用して、特定のワークスペースとデータストアの機能タイプのリストを取得できます。

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

これにより、ワークスペース内のすべてのfeaturetypesをリストするJSONオブジェクトが返されます。.xmlまたは.htmlを.jsonに置き換えて、これらの形式で応答を取得することもできます。では、OpenLayersでこれを行う方法は?幸い、OpenLayersは、オブジェクトの形式でXMLHttpRequestオブジェクトのカプセル化を提供しOpenLayers.Requestます。上記のREST URLを使用した簡単な例は次のとおりです。

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

OpenLayers リモートデータをリクエストする方法については、こちらのドキュメントをご覧ください

あなたが検討するいくつかの他のアプローチを与えることを願っています。


この投稿では、@ CHendersonの提案をすべてテストしました。彼らは完全に動作します。どうもありがとう。これは非常に役に立ちました。
okello 2012

問題ありません。お手伝いできることを嬉しく思います。
CHenderson 2012

その仮想OWSサービスリンクは現在停止しています。ここ
wchatx 2016年

魅力的な作品
AhammadaliPK 2018

リーフレットの回答も追加して頂けますか?
Tekson

2

この答えは誰かを助けるかもしれません。JavaScriptとLeafletを使用して、レイヤーのリストを自動的に作成したかったのです。CHendersonの回答を使用して、次のコードを作成しました。



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

このようにここに画像の説明を入力してくださいして、ジオサーバーレイヤーに「group:GEOGRAPHY」というキーワードを追加できます。各レイヤーとそのグループを手動でコーディングする必要はありません。名前は(多分L.WMS.sourceを使用して)層を作成するために使用されており、タイトルは、 HTML形式のラベルです。


1

この答えをチェックしてみてください。また、デモも行います。そこに言及されているように、レイヤーはさまざまなサービスを介して機能することを忘れないでください。

お役に立てば幸いです...


私はそれをチェックアウトしました。WFS GetCapabilitiesリクエストを使ってこれを達成できると私は思っています。しかし、レイヤー名だけを取得したいのですが、それ以外は何もしません。つまり、リクエストにフィルターを組み込む必要があります。しかしWFS GetCapabilties、レイヤーの名前のみを返すリクエストにフィルターを追加する方法についてはまだわかりません。上記の私の更新を参照してください。ポインタはありますか?
okello 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.