Jak dodać prostą warstwę WFS z GeoServer do mapy OpenLayers?


19

Próbuję dodać jeden z dołączonych zestawów danych z GeoServer do mapy OpenLayers. Śledziłem samouczki OpenGeo, widziałem tutaj podobny wątek, ale nie mogę go złamać. Czy ktoś może rzucić okiem na mój kod i konfigurację GeoServer i powiedzieć mi, gdzie się mylę?

Oto mój kod:

//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();

Szczegóły GeoServer: nazwa obszaru roboczego = medford, URI przestrzeni nazw = http://medford.opengeo.org Dla typu funkcji wypróbowałem „parki” i „medford: parki”

Warstwa jest włączona, reklamowana i ma limit zwrotu 30 funkcji.

Próbuję stworzyć prostą mapę.

Zaktualizowane rozwiązanie. Teraz pracuje.

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

Nie trzeba określać nazwy geometrii w definicji warstwy. Ponieważ Native SRS był pusty w naszym zbiorze danych, jeśli zachowamy GeometryName niż domyślnie, ale bez niego użyje odwzorowania mapy (27700 - w naszym przypadku).

Odpowiedzi:


24

Zobacz moją odpowiedź na ten post .

  1. Upewnij się, że wartość featureNS znajduje się w „Edytuj stronę obszaru roboczego w URI przestrzeni nazw” w GEOSERVER. Nie używaj czegoś tak ogólnego, jak „ http://postgis.org ”. Użyj czegoś takiego jak „ http: // twojadomena / aplikacja / katalogWarstwy ” lub czegoś wyjątkowego. Możesz utworzyć ten identyfikator URI, po prostu uczyń go unikalnym.
  2. Masz nową BBOX () jako strategię, ale co to pole ma jako wymiary? Zmieniłbym go na [new OpenLayers.Strategy.Fixed ()] do testowania.
  3. FeatureType nie jest tak naprawdę typem geometrii, to twoja „nazwa warstwy” w GEOSERVER (wiem, wprowadzająca w błąd).
  4. geometryName to nazwa pola w bazie danych Postgis, które ma typ danych Geometry. W GEOSERVER, w „Edytuj warstwę”, możesz zobaczyć na dole „Szczegóły typu operacji”. Tam zobaczysz pole typu „Geometria”. Użyj wartości w kolumnie właściwości

Podałbym featurePrefix i wersję. Wypróbuj coś takiego:

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

Dzięki capdragon. Podjąłem wszystkie kroki, ale nadal nie mam radości ... mój obszar roboczy nazywa się teraz rpid i dodałem funkcję FeaturePrefix. Próbowałem featureType z i bez dołączania obszaru roboczego. Próbowałem różnych przestrzeni nazw, w tym: „ rpid.opengeo.com ”, „ localhost: 8081 / rpid ”. Nadal jestem zdezorientowany co do tej nieruchomości. Wstawiłem nazwę rzutu i geometrii (GEOM). Moja strona map.html znajduje się tutaj: plik: /// C: /Aptana/Workspace/GIS/map.html. Czy to przyłapie mnie na tych samych zasadach dotyczących pochodzenia poniżej? Moja tabe netto w Firebug pokazuje Options WFS "bez odpowiedzi
— geo_james

2
Przestrzeń nazw featureNS może być dowolna, więc obie będą działać. Ważne jest to, że masz to samo na swoim geoserver. W przeciwnym razie sprawy nie będą serializowane i nie otrzymasz odpowiedzi z serwisu internetowego. Więc wejdź do geoserver, kliknij na workspace(to przeniesie Cię na stronę Edit Workspace. To Namejest to, co umieściłeś jako featurePrefix. I Namespace URIto, co umieściłeś jako featureNS. Ponadto, nie jestem pewien, czy file:///c:lokalizacja będzie wymagać użycia proxy. Ale zrobiłbym plik na żywo, http://localhostaby go przetestować i się upewnić
— CaptDragon

OK. Teraz przeniosłem mój kod do localhost: 8081 / apps / index.html i zmieniłem moją funkcjęNS. Widzę teraz 30 funkcji powracających po odpowiedzi ... <rpid: OBJECTID> 25 </ rpid: OBJECTID> <rpid: FIELD_ID> NS / 86427/74196 </ rpid: ‌ FIELD_ID> <rpid: GROSS_AREA> 2.307 </ rpid: GROSS_AREA>. Postęp! Jednak nie widzę żadnych funkcji na mojej mapie. Po dodaniu jako WMS widzę je dobrze. Jedyną inną warstwą jest podstawowy WMS. Moja konsola jest również pełna błędów, takich jak: OpenLayers.Marker jest niezdefiniowany, a Ext.preg nie jest funkcją. Wszystkie moje biblioteki importuję lokalnie ...
— geo_james

Gdy powiesz, że w odpowiedzi jest 30 funkcji. Są w formacie XML zawinięte w <wfs:FeatureCollection numberOfFeatures="30"... element nadrzędny , prawda?
— CaptDragon,

Powiedziałbym, że utwórz nową, bardzo prostą stronę testową i dodaj tę warstwę WFS. Wydaje mi się, że błędy te pochodzą z innych części twojego kodu, ponieważ OpenLayers.Marker nie jest zaangażowany w WFS. Może się mylę, ale utworzenie prostej strony testowej zawsze pomaga ustalić, czy działa, czy nie. I tak właśnie robię.
— CaptDragon

3

Najpierw sprawdź: czy twoja strona serwera / strony testowej znajduje się na stronie „medford.opengeo.org”? Jeśli tak nie jest, nie będziesz mógł uzyskać dostępu do WFS ze względu na zasady tego samego pochodzenia . Możesz technicznie użyć proxy, aby to naprawić. (choć moim zdaniem jest to tylko przypadek, że WFS jest źle zaprojektowanym protokołem)


1
To samo pochodzenie jest problemem przeglądarki, WFS działa dokładnie tak, jak zostało zaprojektowane.
— Ian Turton

Tak i nie: WFS jest XML, więc wymaga parsera XML na każdej platformie oprócz Firefoksa (i „pulpitu”), a także nie miesza się dobrze z jedynym sposobem komunikacji między domenami: JSONP. Z drugiej strony, GeoJSON jest natywnie parsowany w prawie każdej przeglądarce i jest łatwo i powszechnie pakowany, aby był kompatybilny z wieloma domenami. Oczywiście nie od jabłek do pomarańczy, i to nie jest zakres mojej krytyki WFS (wzdęcia, słabo rozwinięte itp.).
— tmcw

Zakładasz, że przeglądarki tworzą dobrych klientów WFS. Prawie nigdy nie chcesz pobierać dużych ilości danych geograficznych do przeglądarki internetowej jako wektorów.
— Ian Turton

Cześć tmcw. Nie, moja strona testowa to tylko lokalny plik na moim dysku C. Na co powinienem ustawić mój identyfikator URI przestrzeni nazw, jeśli chcę pracować z lokalnym GeoServer na porcie 8081?
— geo_james


0

po prostu popraw swój typ z „medford: parki” na „parki”

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"

                })
            });

Zobacz jsfiddle jako przykład: http://jsfiddle.net/expedio/ucrtthya/


-1

Twój kod jest w porządku. Musisz tylko zmienić adres przeglądarki swojej strony. Skieruj stronę przeglądarki do „localhost: 8080 / geoserver / www / your_file_name.html” zamiast „file: \ c ......”

Następnie warstwa wektorowa będzie renderowana idealnie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.