GeoServerからOpenLayersマップにシンプルなWFSレイヤーを追加する方法は?


19

GeoServerに含まれているデータセットの1つをOpenLayersマップに追加しようとしています。OpenGeoのチュートリアルに従いましたが、ここで同様のスレッドを見ましたが、クラックすることはできません。誰かが私のコードとGeoServerのセットアップを見て、どこが間違っているのか教えてもらえますか?

私のコードは次のとおりです。

//WMS map
world = new OpenLayers.Layer.WMS("Global Imagery", "http://maps.opengeo.org/geowebcache/service/wms", {
    layers : "openstreetmap",
    format : "image/png"
});
map.addLayer(world);

//WFS
parks = new OpenLayers.Layer.Vector("WFS", {
    strategies : [new OpenLayers.Strategy.BBOX()],
    protocol : new OpenLayers.Protocol.WFS({
        url : "http://localhost:8081/geoserver/wfs",
        featureType : "medford:parks",
        featureNS : "http://medford.opengeo.org/medford"
    })
});

map.addLayer(parks);

map.zoomToMaxExtent();

GeoServerの詳細:ワークスペース名= medford、名前空間URI = http://medford.opengeo.org 機能タイプについては、「parks」と「medford:parks」を試しました

レイヤーは有効化され、アドバタイズされ、30の機能リターン制限があります。

単純なマップをまとめるのに苦労しています。

更新されたソリューション。今作業中。

wfs = new OpenLayers.Layer.Vector("Fields_WFS", {
        strategies : [new OpenLayers.Strategy.Fixed()],
        protocol : new OpenLayers.Protocol.WFS({
        version : "1.1.0",
        url : GEOSERVER_HOST + ":" + GEOSERVER_PORT + "/geoserver/wfs", 
        featurePrefix : "rpid",
        featureType : "FIELDS_SUBSET_BNG_OSGB36_1",
        featureNS : "<namespace>", 
        //geometryName : "GEOM", type "Geometry"
        srsName : "EPSG:27700"
}),
    renderers : renderer
})

レイヤー定義でジオメトリ名を指定する必要はありません。データセットではNative SRSがnullであったため、geometryNameを保持する場合、デフォルトを使用しますが、デフォルトを使用しない場合、マップ投影(この場合は27700-)を使用します。

回答:


24

この投稿に対する私の答えを見てください。

  1. featureNS値がGEOSERVERの「ネームスペースURIの下のワークスペースページの編集」にあることを確認します。「http://postgis.org」のような一般的なものを使用しないでください。「http:// yourdomain / application / catalogLayer」のようなもの、またはそのようなユニークなものを使用します。このURIを作成できますが、一意にするだけです。
  2. 戦略として新しいBBOX()がありますが、そのボックスはディメンションとして何を持っていますか?テスト用に[new OpenLayers.Strategy.Fixed()]に変更します。
  3. featureTypeは実際にはジオメトリのタイプではなく、GEOSERVERの「レイヤー名」です(誤解を招きます)。
  4. geometryNameは、Geometryデータ型を持つpostgisデータベース内のフィールドの名前です。GEOSERVERの[レイヤーの編集]の下にある[フィーチャタイプの詳細]の下に表示されます。そこに「Geometry」タイプのフィールドが表示されます。プロパティ列の下の値を使用します

featurePrefixとバージョンを指定します。次のようなものを試してください:

var wfs = new OpenLayers.Layer.Vector(
            "Stavros Features",
            {
                strategies: [new OpenLayers.Strategy.Fixed()]
                , projection: new OpenLayers.Projection("EPSG:4326")
                , protocol: new OpenLayers.Protocol.WFS({
                    version: "1.1.0",
                    url: "http://localhost:8081/geoserver/wfs",
                    featurePrefix: 'myWorkspace', //geoserver worspace name
                    featureType: "medford:parks", //geoserver Layer Name
                    featureNS: "http://medford.opengeo.org/medford", // Edit Workspace Namespace URI
                    geometryName: "bounds" // field in Feature Type details with type "Geometry"
                })
            });

ありがとうcapdragon。すべての手順を実行しましたが、まだ喜びはありません...私のワークスペースはrpidと呼ばれ、featurePrefixを追加しました。ワークスペースを追加して、または追加せずにfeatureTypeを試しました。「rpid.opengeo.com」、「localhost:8081 / rpid」など、さまざまなネームスペースを試しました。私はまだこのプロパティについて混乱しています。投影とジオメトリ名(GEOM)を挿入しました。私のmap.htmlページはfile:/// C:/Aptana/Workspace/GIS/map.htmlにあります。これにより、以下の同一生成元ポリシーが適用されますか?FirebugのMy Netタブには、応答なしで「OPTIONS wfs」が表示されます
-geo_james

2
featureNSの名前空間は好きなものにすることができるため、両方とも機能します。重要なことは、ジオサーバー上でまったく同じものを持っていることです。または、物事がシリアル化されず、Webサービスから応答がありません。だからあなたをクリックして、geoserverに入るworkspace(これは、ページが表示されますEdit WorkspaceNameとして置くものですfeaturePrefix。そしてNamespace URI、あなたのように置くものですfeatureNS。また、わからない場合はfile:///c:場所がプロキシを使用する必要がします。しかし、私はなるだろうファイルhttp://localhostをテストして確認するためにライブします。
CaptDragon12年

OKコードをlocalhost:8081 / apps / index.htmlに移動し、featureNSを変更しました。応答で30の機能が戻ってくるのを見ることができます... <rpid:OBJECTID> 25 </ rpid:OBJECTID> <rpid:FIELD_ID> NS / 86427/74196 </ rpid:‌ FIELD_ID> <rpid:GROSS_AREA> 2.307 </ rpid:GROSS_AREA>。進捗!ただし、マップにフィーチャが表示されません。WMSとして追加すると、それらをうまく見ることができます。他の唯一のレイヤーはベースWMSです。私のコンソールには、OpenLayers.Markerが未定義で、Ext.pregが関数ではないなどのエラーもあります。すべてのライブラリをローカルにインポートしています
...-geo_james

応答に30の機能があると言うとき。それらは、親<wfs:FeatureCollection numberOfFeatures="30"... 要素内にラップされたxml形式ですか?
CaptDragon

新しい非常に単純なテストページを作成し、そのWFSレイヤーを追加すると言います。OpenLayers.MarkerはWFSに関与していないため、これらのエラーはコードの他の部分から発生しているようです。たぶん私は間違っているかもしれませんが、簡単なテストページを作成することは、それが機能しているかどうかを判断するのに常に役立ちます。それは私がとにかくすることです。
CaptDragon

3

最初に確認するのは、「medford.opengeo.org」のサーバー/テストWebページですか?そうでない場合、Same Origin PolicyのためWFSにアクセスできません。技術的にプロキシを使用してこれを修正できます。(私の意見では、これはWFSが不十分に設計されたプロトコルである場合にすぎません)


1
Same Originはブラウザの問題であり、WFSは設計どおりに機能します。
イアンタートン

はい、いいえ:WFSはXMLであるため、Firefox(および「デスクトップ」)を除くすべてのプラットフォームでXMLパーサーが必要であり、クロスドメイン通信を行う唯一の方法であるJSONPともうまく混ざりません。一方、GeoJSONは、ほぼすべてのブラウザーでネイティブに解析され、簡単かつ一般的に、クロスドメイン互換性のためにラップされます。明らかにリンゴからオレンジではなく、それは私のWFS批評の範囲ではありません(肥大化、不十分な拡張など)。
tmcw

あなたはブラウザが良いWFSクライアントを作ると仮定しています。大量の地理データをベクターとしてWebブラウザーに取り込むことはほとんどありません。
イアンタートン

こんにちはtmcw。私のテストページは、Cドライブ上の単なるローカルファイルではありません。ポート8081でローカルGeoServerを操作する場合、ネームスペースURIを何に設定する必要がありますか?
-geo_james

2

あなたの問題は、機能名にプレフィックスがあり、これが混乱しているGeoServer(および/またはOpenLayers)であるということです。

試してください:

 featureType : "parks",

http://ian01.geog.psu.edu/geoserver/www/wfs/index.htmlには、学習可能なソースコードがコメントされたWFSの例がいくつかあります。


ありがとう プレフィックスなしで試してみましたが、より広い問題があると思います
-geo_james

リンクが機能していない
-Sam007

0

フィーチャタイプを「medford:parks」から「parks」に修正するだけです

var wfs = new OpenLayers.Layer.Vector(
            "Stavros Features",
            {
                strategies: [new OpenLayers.Strategy.Fixed()]
                , projection: new OpenLayers.Projection("EPSG:4326")
                , protocol: new OpenLayers.Protocol.WFS({
                    version: "1.0.0",
                    url: "http://localhost:8081/geoserver/wfs",
                    featureType: "parks", //geoserver Layer Name without workspace prefix
                    featureNS: "http://medford.opengeo.org/medford"

                })
            });

例としてjsfiddleを参照してください:http ://jsfiddle.net/expedio/ucrtthya/


-1

コードは大丈夫です。ページのブラウザアドレスを変更するだけです。「file:\ c ......」ではなく、「localhost:8080 / geoserver / www / your_file_name.html」をブラウザページに向けます。

その後、ベクターレイヤーは完全にレンダリングされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.