Come aggiungere un semplice livello WFS da GeoServer alla mappa OpenLayers?


19

Sto cercando di aggiungere uno dei set di dati inclusi con GeoServer a una mappa OpenLayers. Ho seguito i tutorial di OpenGeo, ho visto un thread simile qui, ma non riesco a romperlo. Qualcuno può dare un'occhiata al mio codice e alla configurazione di GeoServer e dirmi dove sto andando storto?

Ecco il mio codice:

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

Dettagli GeoServer: workspace name = medford, Namespace URI = http://medford.opengeo.org Per il tipo di funzione ho provato "Parks" e "Medford: Parks"

Il livello è abilitato, pubblicizzato e ha un limite di restituzione di 30 funzioni.

Sto lottando per mettere insieme una semplice mappa.

Soluzione aggiornata. Funzionando Adesso.

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

Non è necessario specificare il nome della geometria nella definizione del livello. Dal momento che Native SRS era nullo nel nostro set di dati, se manteniamo geometryName di quello che richiede di default, ma senza di esso, utilizza la proiezione della mappa (27700- nel nostro caso).

Risposte:


24

Dai un'occhiata alla mia risposta su questo post .

  1. Assicurati che il valore di featureNS sia presente nella "Modifica pagina dell'area di lavoro in URI dello spazio dei nomi" nel tuo GEOSERVER. Non utilizzare qualcosa di generico come " http://postgis.org ". Usa qualcosa come " http: // tuodominio / application / catalogLayer " o qualcosa di unico come quello. Puoi creare questo URI, renderlo unico.
  2. Hai un nuovo BBOX () come strategia, ma che cosa ha quella scatola come dimensioni? Lo cambierei in [new OpenLayers.Strategy.Fixed ()] per i test.
  3. featureType non è in realtà il tipo di geometria, è il tuo "Nome livello" in GEOSERVER (lo so, fuorviante).
  4. geometryName è il nome del campo nel database postgis che ha il tipo di dati Geometry. In GEOSERVER, in "Modifica livello" puoi vedere in fondo "Dettagli tipo di funzione". Lì vedrai un campo con tipo "Geometria". Utilizzare il valore nella colonna delle proprietà

Vorrei specificare featurePrefix e versione. Prova qualcosa del genere:

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

Grazie capdragon. Ho preso tutti i passaggi ma ancora nessuna gioia ... il mio spazio di lavoro ora si chiama rpid e ho aggiunto una featurePrefix. Ho provato featureType con e senza aggiungere spazio di lavoro. Ho provato vari spazi dei nomi tra cui: " rpid.opengeo.com ", " localhost: 8081 / rpid ". Sono ancora confuso su questa proprietà. Ho inserito il nome di proiezione e geometria (GEOM). La mia pagina map.html risiede qui: file: /// C: /Aptana/Workspace/GIS/map.html. Questo mi colpirà con la stessa politica di origine di seguito? La mia scheda Net in Firebug mostra un 'OPTIONS wfs' senza risposta
geo_james

2
Lo spazio dei nomi di featureNS può essere quello che ti piace, quindi entrambi funzioneranno. L'importante è che tu abbia esattamente lo stesso sul tuo geoserver. Altrimenti le cose non vengono serializzate e non si ottiene alcuna risposta dal servizio web. Quindi vai in geoserver, fai clic sul tuo workspace(questo ti porterà alla pagina Edit Workspace. NameÈ quello che metti come featurePrefix. E Namespace URIche è quello che metti come featureNS. Inoltre, non sono sicuro se la file:///c:posizione richiederà di usare un proxy. Ma farei il file è http://localhost
attivo

OK Ora ho spostato il mio codice su localhost: 8081 / apps / index.html e ho cambiato la mia funzioneNS. Ora riesco a vedere 30 funzionalità che ritornano sulla risposta ... <rpid: OBJECTID> 25 </ rpid: OBJECTID> <rpid: FIELD_ID> NS / 86427/74196 </ rpid: ‌ FIELD_ID> <rpid: GROSS_AREA> 2.307 </ RPID: GROSS_AREA>. Progresso! Tuttavia non vedo nessuna delle funzionalità sulla mia mappa. Quando aggiunto come WMS posso vederli bene. L'unico altro livello è un WMS di base. La mia console è anche piena di errori come: OpenLayers.Marker non è definito e Ext.preg non è una funzione. Sto importando tutte le mie librerie localmente ...
geo_james

Quando dici che ci sono 30 funzionalità nella risposta. Sono in formato xml racchiusi in un <wfs:FeatureCollection numberOfFeatures="30"... elemento genitore giusto?
CaptDragon,

Direi di creare una nuova pagina di test molto semplice e aggiungere quel livello WFS. Mi sembra che tali errori provengano da altre parti del codice poiché OpenLayers.Marker non è coinvolto in WFS. Forse sbaglio, ma la creazione di una semplice pagina di prova aiuta sempre a determinare se funziona o no. Questo è quello che faccio comunque.
CaptDragon,

3

Prima cosa da controllare: la tua pagina web server / test su "medford.opengeo.org"? In caso contrario, non sarà possibile accedere a WFS a causa della stessa politica di origine . È possibile utilizzare tecnicamente un proxy per risolvere questo problema. (anche se secondo me questo è solo un caso in cui WFS è un protocollo mal progettato)


1
La stessa origine è un problema del browser, WFS funziona esattamente come progettato.
Ian Turton

Sì e no: WFS è XML, quindi necessita di un parser XML su tutte le piattaforme tranne Firefox (e "il desktop"), e inoltre non si combina bene con l'unico modo in cui dobbiamo fare comunicazioni tra domini: JSONP. GeoJSON, d'altra parte, viene analizzato in modo nativo in quasi tutti i browser ed è facilmente e comunemente racchiuso per essere compatibile tra domini. Ovviamente non dalle mele alle arance, e questa non è l'estensione della mia critica WFS (gonfia, mal estesa, ecc.).
tmcw,

Supponete che i browser siano buoni client WFS. Quasi mai vuoi estrarre grandi quantità di dati geografici in un browser web come vettori.
Ian Turton

Ciao tmcw. No la mia pagina di test è solo un file locale sul mio disco C. Cosa devo impostare il mio URI dello spazio dei nomi se voglio lavorare con un GeoServer locale sulla porta 8081?
geo_james,


0

correggi il tuo talento da "medford: Parks" a "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"

                })
            });

Vedi jsfiddle come esempio: http://jsfiddle.net/expedio/ucrtthya/


-1

Il tuo codice è ok Devi solo cambiare l'indirizzo del browser della tua pagina. Punta la pagina del browser attraverso "localhost: 8080 / geoserver / www / nome_file.html" anziché "file: \ c ......"

Quindi il layer vettoriale verrà visualizzato perfettamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.