Wie füge ich einen einfachen WFS-Layer von GeoServer zur OpenLayers-Karte hinzu?

19

Ich versuche, einer OpenLayers-Karte einen der in GeoServer enthaltenen Datasets hinzuzufügen. Ich habe die OpenGeo-Tutorials befolgt und hier einen ähnlichen Thread gesehen, aber ich kann ihn scheinbar nicht knacken. Kann jemand einen Blick auf meinen Code und mein GeoServer-Setup werfen und mir sagen, wo ich falsch liege?

Hier ist mein Code:

//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-Details: Name des Arbeitsbereichs = medford, Namespace URI = http://medford.opengeo.org Für den Feature-Typ habe ich "parks" und "medford: parks" ausprobiert.

Der Layer ist aktiviert, angekündigt und hat ein Rückgabelimit von 30 Features.

Ich habe Mühe, eine einfache Karte zusammenzustellen.

Aktualisierte Lösung. Arbeite jetzt.

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

Der Geometriename muss nicht in der Ebenendefinition angegeben werden. Da Native SRS in unserem Dataset null war, wird bei Beibehaltung von geometryName die Standardeinstellung verwendet, ohne diese jedoch die Kartenprojektion (in unserem Fall 27700-).

geo_james
quelle

Antworten:

24

Schauen Sie sich meine Antwort auf diesen Beitrag an .

  1. Stellen Sie sicher, dass sich Ihr featureNS-Wert in Ihrem GEOSERVER auf der Seite "Edit Workspace Page under Namespace URI" befindet. Verwenden Sie keine so allgemeinen Informationen wie " http://postgis.org ". Verwenden Sie etwas wie " http: // yourdomain / application / catalogLayer " oder etwas Einzigartiges. Sie können diesen URI erstellen, indem Sie ihn einfach einzigartig machen.
  2. Sie haben eine neue BBOX () als Strategie, aber welche Dimensionen hat diese Box? Ich würde es zum Testen in [new OpenLayers.Strategy.Fixed ()] ändern.
  3. featureType ist eigentlich nicht der Typ der Geometrie, sondern Ihr "Ebenenname" in GEOSERVER (ich weiß, irreführend).
  4. geometryName ist der Name des Feldes in Ihrer Postgis-Datenbank, das den Datentyp Geometry hat. In GEOSERVER sehen Sie unter "Ebene bearbeiten" unten "Feature-Typ-Details". Dort sehen Sie ein Feld mit dem Typ "Geometrie". Verwenden Sie den Wert unter der Eigenschaftsspalte

Ich würde FeaturePrefix und Version angeben. Versuchen Sie so etwas:

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"
                })
            });
CaptDragon
quelle
Vielen Dank, Capdragon. Ich habe alle Schritte unternommen, aber immer noch keine Freude ... mein Arbeitsbereich heißt jetzt rpid und ich habe ein FeaturePrefix hinzugefügt. Ich habe versucht, FeatureType mit und ohne Anhängen des Arbeitsbereichs. Ich habe verschiedene Namespaces ausprobiert, darunter: " rpid.opengeo.com ", " localhost: 8081 / rpid ". Ich bin immer noch verwirrt über diese Eigenschaft. Ich habe den Projektions- und Geometrienamen (GEOM) eingefügt. Meine map.html Seite lebt hier: file: /// C: /Aptana/Workspace/GIS/map.html. Fängt mich das mit der gleichen Herkunftsrichtlinie weiter unten auf? Mein Net-Tabe in Firebug zeigt eine 'OPTIONS wfs' ohne Antwort
geo_james
2
Der Namespace von featureNS kann beliebig sein, sodass beide funktionieren. Wichtig ist, dass Sie es auf Ihrem Geoserver genauso haben. Andernfalls werden die Dinge nicht serialisiert und Sie erhalten keine Antwort vom Webdienst. Gehe also in den Geoserver, klicke auf deinen workspace(das bringt dich auf die Seite Edit Workspace. Das Nameist, was als gesetzt wird featurePrefix. Und das Namespace URIist, was du als gesetzt hast featureNS. Außerdem weißt du nicht, ob der file:///c:Ort es erfordert, dass du einen Proxy benutzt. Aber ich würde machen Die Datei live http://localhostzu testen und sicherzustellen.
CaptDragon
OK, ich habe jetzt meinen Code nach localhost: 8081 / apps / index.html verschoben und meine featureNS geändert. In der Antwort werden nun 30 Features angezeigt ... <rpid: OBJECTID> 25 </ rpid: OBJECTID> <rpid: FIELD_ID> NS / 86427/74196 </ rpid: ‌ FIELD_ID> <rpid: GROSS_AREA> 2.307 </ rpid: GROSS_AREA> Fortschritt! Ich sehe jedoch keine der Funktionen auf meiner Karte. Wenn als WMS hinzugefügt, kann ich sie gut sehen. Die einzige andere Schicht ist ein Basis-WMS. In meiner Konsole gibt es auch Fehler wie: OpenLayers.Marker ist undefiniert und Ext.preg ist keine Funktion. Ich importiere alle meine Bibliotheken lokal ...
geo_james
Wenn Sie sagen, dass die Antwort 30 Funktionen enthält. Sie sind im XML-Format in ein übergeordnetes <wfs:FeatureCollection numberOfFeatures="30"... Element eingebettet, oder?
CaptDragon
Ich würde sagen, erstellen Sie eine neue, sehr einfache Testseite und fügen Sie diese WFS-Ebene hinzu. Es scheint mir, dass diese Fehler aus anderen Teilen Ihres Codes stammen, da OpenLayers.Marker nicht mit WFS befasst ist. Vielleicht liege ich falsch, aber das Erstellen einer einfachen Testseite hilft immer dabei, festzustellen, ob sie funktioniert oder nicht. Das ist was ich sowieso tue.
CaptDragon
3

Das erste, was Sie überprüfen sollten: Befindet sich Ihre Server- / Test-Webseite auf "medford.opengeo.org"? Wenn dies nicht der Fall ist, können Sie aufgrund derselben Ursprungsrichtlinie nicht auf WFS zugreifen . Sie können technisch einen Proxy verwenden, um dies zu beheben. (obwohl meiner Meinung nach nur der Fall ist, dass WFS ein schlecht gestaltetes Protokoll ist)

tmcw
quelle
1
Same Origin ist ein Browser-Problem, WFS funktioniert genau wie geplant.
Ian Turton
Ja und nein: WFS ist XML, daher ist auf jeder Plattform außer Firefox (und 'dem Desktop') ein XML-Parser erforderlich, und es lässt sich auch nicht gut mit der einzigen Möglichkeit kombinieren, die wir für die domänenübergreifende Kommunikation haben: JSONP. GeoJSON hingegen wird von Haus aus in nahezu jedem Browser analysiert und ist einfach und häufig domänenübergreifend verpackt. Offensichtlich keine Apfelsinen, und das ist nicht das Ausmaß meiner WFS-Kritik (aufgebläht, schlecht verlängert usw.).
tmcw
Sie gehen davon aus, dass Browser gute WFS-Clients sind. Sie möchten selten große Mengen an geografischen Daten als Vektoren in einen Webbrowser ziehen.
Ian Turton
Hi tmcw. Nein, meine Testseite ist nur eine lokale Datei auf meinem C-Laufwerk. Auf was sollte ich meinen Namespace-URI einstellen, wenn ich mit einem lokalen GeoServer auf Port 8081 arbeiten möchte?
Geo_James
2

Ihr Problem ist, dass Sie das Präfix für den Feature-Namen und einen Namespace haben, was GeoServer (und / oder OpenLayers) verwirrt.

Versuchen:

 featureType : "parks",

Ich habe einige WFS-Beispiele unter http://ian01.geog.psu.edu/geoserver/www/wfs/index.html mit kommentiertem Quellcode, den Sie studieren können.

Ian Turton
quelle
Vielen Dank iant. Ich habe es jetzt ohne das Präfix versucht und ich denke, es gibt ein größeres Problem
geo_james
Link funktioniert nicht iant
Sam007
0

Korrigieren Sie einfach Ihren Featuretyp von "medford: parks" zu "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"

                })
            });

Siehe jsfiddle als Beispiel: http://jsfiddle.net/expedio/ucrtthya/

Thomas B
quelle
-1

Ihr Code ist in Ordnung. Sie müssen nur die Browseradresse Ihrer Seite ändern. Zeigen Sie mit Ihrer Browserseite durch "localhost: 8080 / geoserver / www / your_file_name.html" anstelle von "file: \ c ......"

Dann wird die Vektorebene perfekt gerendert.

Shahida Umar
quelle