Bagaimana cara menambahkan lapisan WFS sederhana dari GeoServer ke peta OpenLayers?

19

Saya mencoba menambahkan salah satu dataset yang disertakan dengan GeoServer ke peta OpenLayers. Saya telah mengikuti tutorial OpenGeo, melihat utas serupa di sini, tapi sepertinya saya tidak bisa memecahkannya. Dapatkah seseorang melihat kode saya dan pengaturan GeoServer dan memberi tahu saya di mana saya salah?

Ini kode saya:

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

Detail GeoServer: workspace name = medford, Namespace URI = http://medford.opengeo.org Untuk tipe fitur saya telah mencoba "taman" dan "medford: taman"

Lapisan diaktifkan, diiklankan dan memiliki batas pengembalian fitur 30.

Saya berjuang untuk menyatukan peta sederhana.

Solusi Terbaru. Sedang bekerja sekarang

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

Tidak perlu menentukan Nama geometri dalam definisi Layer. Karena Native SRS adalah null dalam dataset kami, jika kami menjaga geometriName daripada yang diperlukan, tetapi tanpa itu, ia menggunakan proyeksi peta (27700- dalam kasus kami).

geo_james
sumber

Jawaban:

24

Lihatlah jawaban saya di posting ini .

  1. Pastikan nilai featureNS Anda ada di "Edit Halaman Ruang Kerja di bawah Namespace URI" di GEOSERVER Anda. Jangan menggunakan sesuatu yang generik seperti " http://postgis.org ". Gunakan sesuatu seperti " http: // yourdomain / application / catalogLayer " atau sesuatu yang unik seperti itu. Anda dapat meningkatkan URI ini, cukup buat unik.
  2. Anda memiliki BBOX () baru sebagai strategi tetapi kotak apa yang dimilikinya sebagai dimensi? Saya akan mengubahnya menjadi [OpenLayers.Strategy.Fixed ()] baru untuk pengujian.
  3. featureType sebenarnya bukan tipe geometri, itu adalah "Layer Name" Anda di GEOSERVER (saya tahu, menyesatkan).
  4. geometryName adalah nama bidang dalam database postgis Anda yang memiliki tipe data Geometri. Di GEOSERVER, Di bawah "Edit Layer" Anda dapat melihat di bagian bawah "Rincian Tipe Fitur". Di sana Anda akan melihat bidang dengan tipe "Geometri". Gunakan nilai di bawah kolom properti

Saya akan menentukan featurePrefix dan versi. Coba sesuatu seperti ini:

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
sumber
Terima kasih capdragon. Saya telah mengambil semua langkah tetapi masih tidak ada sukacita ... ruang kerja saya sekarang disebut rpid dan saya telah menambahkan featurePrefix. Saya sudah mencoba featureType dengan dan tanpa menambahkan ruang kerja. Saya telah mencoba berbagai ruang nama termasuk: " rpid.opengeo.com ", " localhost: 8081 / rpid ". Saya masih bingung tentang properti ini. Saya telah memasukkan nama proyeksi dan geometri (GEOM). Halaman map.html saya ada di sini: file: /// C: /Aptana/Workspace/GIS/map.html. Apakah ini akan membuat saya keluar dengan Kebijakan Asal yang Sama di bawah? Tab Net saya di Firebug menunjukkan 'PILIHAN wfs' tanpa respons
geo_james
2
Namespace dari featureNS dapat berupa apa pun yang Anda suka sehingga keduanya akan berfungsi. Yang penting adalah Anda memilikinya persis sama pada geoserver Anda. Atau hal-hal lain tidak mendapatkan serial dan Anda tidak mendapat respons dari layanan web. Jadi masuk ke geoserver, klik pada Anda workspace(ini akan membawa Anda ke halaman Edit Workspace. NameApa yang dimasukkan featurePrefix. Dan Namespace URIapa yang Anda masukkan featureNS. Juga, tidak yakin apakah file:///c:lokasi akan mengharuskan Anda untuk menggunakan proxy. Tapi saya akan membuat file tinggal di http://localhostuntuk menguji dan memastikan
CaptDragon
OK Sekarang saya sudah memindahkan kode saya ke localhost: 8081 / apps / index.html dan mengubah featureNS saya. Sekarang saya dapat melihat 30 fitur kembali pada respons ... <rpid: OBJECTID> 25 </ rpid: OBJECTID> <rpid: FIELD_ID> NS / 86427/74196 </ rpid: ‌ FIELD_ID> <rpid: GROSS_AREA> 2.307 </ rpid: GROSS_AREA>. Kemajuan! Namun saya tidak melihat salah satu fitur di peta saya. Ketika ditambahkan sebagai WMS saya bisa melihatnya baik-baik saja. Satu-satunya lapisan lainnya adalah basis WMS. Konsol saya juga penuh dengan kesalahan seperti: OpenLayers.Marker tidak terdefinisi dan Ext.preg bukan fungsi. Saya mengimpor semua perpustakaan saya secara lokal ...
geo_james
Ketika Anda mengatakan ada 30 fitur dalam respons. Mereka berada dalam format xml yang dibungkus dengan <wfs:FeatureCollection numberOfFeatures="30"... elemen induk, bukan?
CaptDragon
Saya akan mengatakan membuat halaman pengujian yang sangat sederhana dan menambahkan lapisan WFS. Tampak bagi saya bahwa kesalahan tersebut berasal dari bagian lain dari kode Anda sejak OpenLayers.Marker tidak terlibat dengan WFS. Mungkin saya salah, tetapi membuat halaman pengujian sederhana selalu membantu menentukan apakah itu berfungsi atau tidak. Lagipula itulah yang saya lakukan.
CaptDragon
3

Hal pertama yang perlu diperiksa: apakah halaman web server / test Anda di 'medford.opengeo.org'? Jika tidak, Anda tidak akan dapat mengakses WFS karena Kebijakan Asal yang Sama . Anda secara teknis dapat menggunakan proxy untuk memperbaikinya. (meskipun menurut saya ini hanya kasus WFS menjadi protokol yang dirancang dengan buruk)

tmcw
sumber
1
Sama Asal adalah masalah browser, WFS bekerja persis seperti yang dirancang.
Ian Turton
Ya dan tidak: WFS adalah XML, sehingga mengharuskan parser XML di setiap platform selain Firefox (dan 'desktop'), dan itu juga tidak tercampur dengan baik dengan satu-satunya cara kita harus melakukan komunikasi lintas domain: JSONP. GeoJSON, di sisi lain, secara asli diuraikan di hampir setiap browser dan mudah dan umumnya dibungkus agar kompatibel lintas domain. Jelas bukan apel-ke-jeruk, dan itu bukan sejauh mana kritik WFS saya (kembung, kurang diperluas, dll).
tmcw
Anda mengasumsikan bahwa browser membuat klien WFS yang baik. Anda hampir tidak pernah ingin menarik sejumlah besar data geografis ke browser web sebagai vektor.
Ian Turton
Hai tmcw. Tidak, halaman pengujian saya hanya file lokal di drive C saya. Apa yang harus saya setel pada Namespace URI saya jika saya ingin bekerja dengan GeoServer lokal di port 8081?
geo_james
2

Masalah Anda adalah bahwa Anda memiliki awalan pada nama fitur dan namespace yang membingungkan GeoServer (dan / atau OpenLayers).

Mencoba:

 featureType : "parks",

Saya punya beberapa contoh WFS di http://ian01.geog.psu.edu/geoserver/www/wfs/index.html dengan kode sumber komentar yang dapat Anda pelajari.

Ian Turton
sumber
Terima kasih iant. Saya sekarang sudah mencoba tanpa awalan dan saya pikir ada masalah yang lebih luas
geo_james
tautan tidak berfungsi
Sam007
0

perbaiki tipe properti Anda dari "medford: taman" ke "taman"

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"

                })
            });

Lihat jsfiddle sebagai contoh: http://jsfiddle.net/expedio/ucrtthya/

Thomas B
sumber
-1

Kode Anda baik-baik saja. Anda hanya perlu mengubah alamat browser halaman Anda. Arahkan halaman browser Anda melalui "localhost: 8080 / geoserver / www / your_file_name.html" alih-alih "file: \ c ......"

Maka layer vektor akan merender dengan sempurna.

shahida umar
sumber