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

geo_james
źródło

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"
                })
            });
CaptDragon
źródło
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)

tmcw
źródło
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
2

Problem polega na tym, że masz prefiks na nazwie funkcji i przestrzeni nazw, co dezorientuje GeoServer (i / lub OpenLayers).

Próbować:

 featureType : "parks",

Mam kilka przykładów WFS na http://ian01.geog.psu.edu/geoserver/www/wfs/index.html z zakomentowanym kodem źródłowym, który możesz studiować.

Ian Turton
źródło
Dzięki, Iant. Próbowałem teraz bez prefiksu i myślę, że jest szerszy problem
geo_james
link nie działa iant
Sam007
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/

Thomas B.
źródło
-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.

Shahida Umar
źródło