Suite

La mise à jour OpenLayers 3.5 WFS-T vers GeoServer 2.7 lève StringIndexOutOfBoundsException


J'utilise ol.format.WFS.writeTransaction() (OL3.5) pour générer des instructions WFS-T. Cela fonctionne bien pour l'insertion et la suppression. Le problème vient de la déclaration de mise à jour.

Toute instruction de mise à jour renvoie l'exception suivante de GeoServer :

 java.lang.StringIndexOutOfBoundsException : Index de chaîne hors limites : -1 Index de chaîne hors limites : -1

Les modifications via QGIS fonctionnent comme prévu.

Ceci est un exemple de POST généré par OL3.5

   délimité par -9693316.43121855,2347365.748407976,-9692555.877885746,2347961.5151853375  géométrie     -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  

C'est parce que boundedBy / bbox est une propriété qu'OpenLayers crée lors de l'analyse du GML, ce n'est pas une propriété de fonctionnalité réelle. Ainsi, lorsque vous effectuez une mise à jour, vous devez cloner la fonctionnalité et vous en débarrasser. Quelques exemples de code :

// effectuer une transaction WFS pour mettre à jour la géométrie var properties = feature.getProperties(); // se débarrasser de bbox qui n'est pas une propriété réelle delete properties.bbox; var clone = new ol.Feature(properties); clone.setId(fid);

Si vous avez besoin de plus d'exemples de code, voici le code que nous utilisons dans le SDK OpenGeo Suite pour WFS-T : https://github.com/boundlessgeo/suite/blob/master/sdk/src/main/resources/client/ol3 -common/app/TransactionHandler.js#L105:L110


Bien que la solution de @bartvde fonctionne, il est un peu fastidieux de cloner la fonctionnalité et de créer un ID et des propriétés de transfert. En outre, il existe un risque que quelque chose d'autre manque dans la fonctionnalité clonée.

J'aimerais proposer une autre solution :

feature.unset("boundedBy"); // ou "bbox", selon le nom de la fonctionnalité dont vous souhaitez vous débarrasser

C'est tout ce qu'il faut !


Ci-dessous, vous pouvez voir une solution plus complète qui crée un objetfonctionnalitéscela contientinserts,mises à jouretsupprime. Il utilisetrouver()pour obtenir des fonctionnalités des trois types dela source. Il "nettoie" aussimises à jourdudélimité parbiens.

const find = mode => this.vectorSource .getFeatures() .filter(feature => feature.modification === mode); const features = { updates : find("updated").map(feature => { feature.unset("boundedBy"); return feature; }), insère : find("added"), supprime : find("removed" ) } ;


Voir la vidéo: GETTING STARTED WITH POSTGIS, GEOSERVER AND OPENLAYERS (Octobre 2021).