Lebih

Pembaruan OpenLayers 3.5 WFS-T ke GeoServer 2.7 memunculkan StringIndexOutOfBoundsException

Pembaruan OpenLayers 3.5 WFS-T ke GeoServer 2.7 memunculkan StringIndexOutOfBoundsException


Saya menggunakan ol.format.WFS.writeTransaction() (OL3.5) untuk menghasilkan pernyataan WFS-T. Ini berfungsi dengan baik untuk menyisipkan dan menghapus. Masalahnya adalah dengan pernyataan pembaruan.

Setiap pernyataan pembaruan mengembalikan pengecualian berikut dari GeoServer:

 java.lang.StringIndexOutOfBoundsException: Indeks string di luar jangkauan: -1 Indeks string di luar jangkauan: -1

Pengeditan melalui QGIS berfungsi seperti yang diharapkan.

Ini adalah contoh POST yang dihasilkan oleh OL3.5

   dibatasioleh -9693316.43121855,2347365.748407976,-9692555.877885746,2347961.5151853375  geometri     -9693072.420357607 2347961.5151853375 -9693316.43121855 2347628.7731022364 -9692822.071552228 2347365.748407976 -9692555.877885746 2347758.700963257 -9692555.877885746 2347758.700963257 -9692737.951605482 2347825.076779921 -9692893.214319186 2347748.042587353 -9693072.420357607 2347961.5151853375  

Ini karena boundedBy / bbox adalah properti yang dibuat OpenLayers saat mengurai GML, bukan properti fitur sebenarnya. Jadi ketika Anda memperbarui, Anda harus mengkloning fitur dan menyingkirkannya. Beberapa contoh kode:

// lakukan transaksi WFS untuk memperbarui properti var geometri = feature.getProperties(); // singkirkan bbox yang bukan real property delete properties.bbox; var clone = new ol.Feature(properties); clone.setId(fid);

Jika Anda membutuhkan lebih banyak contoh kode, berikut adalah kode yang kami gunakan di OpenGeo Suite SDK untuk WFS-T: https://github.com/boundlessgeo/suite/blob/master/sdk/src/main/resources/client/ol3 -common/app/TransactionHandler.js#L105:L110


Meskipun solusi @ bartvde berfungsi, agak rumit untuk mengkloning Fitur dan membuat ID dan properti yang dibawa. Juga, ada risiko bahwa ada sesuatu yang hilang dalam fitur kloning.

Saya ingin mengusulkan solusi lain:

feature.unset("dibatasi Oleh"); // atau "bbox", tergantung pada nama fitur yang ingin Anda hapus

Itu saja yang dibutuhkan!


Di bawah ini, Anda dapat melihat solusi yang lebih lengkap untuk membuat objekfituryang berisisisipan,pembaruandanmenghapus. Ini menggunakanTemukan()untuk mendapatkan fitur dari ketiga jenis darisumber. Itu juga "membersihkan"pembaruandaridibatasiolehProperti.

const find = mode => this.vectorSource .getFeatures() .filter(feature => feature.modification === mode); const features = { update: find("updated").map(feature => { feature.unset("boundedBy"); kembalikan fitur; }), inserts: find("added"), deletes: find("removed" ) };

Tonton videonya: Geoserver for WebGIS development WMS, WFS, WFS-T Service, Feature editing on web.