Based on the reasons from the beginning of this chapter, our main focus is on attribute management. However, we cannot get past the geometry part without a word. In this example, called ch04_geometry, we pull out the swiss army knife of modifying geometries in OpenLayers 3. As we made a note of issues with the coordinate order in GeoServer, we swap the coordinates of a whole layer. Note that, for now, we only modify the geometries internally. We will do some visual and GUI modifications in the next chapter:
var modifiedFeatures = [];
var features = this.getFeatures();
for (var i = 0; i < features.length; i += 1) {
var modifiedFeature = features[i].clone();
modifiedFeature.getGeometry().applyTransform(function (flatCoordinates, flatCoordinates2, stride) {
for (var j = 0; j < flatCoordinates.length; j += stride) {
var y = flatCoordinates[j];
var x = flatCoordinates[j + 1];
flatCoordinates[j] = x;
flatCoordinates[j + 1] = y;
}
});
modifiedFeatures.push(modifiedFeature);
}Firstly, we use stride to know how much further we have to step our iteration to get to the next pair of coordinates. We clone the features, modify them in place, and then save them in an array. The only thing left is writing a WFS-T request based on the new features:
var WFSTSerializer = new ol.format.WFS();
var featObject = WFSTSerializer.writeTransaction(null, modifiedFeatures, null, {
featureType: 'ne:countries',
featureNS: 'http://naturalearthdata.com',
srsName: 'EPSG:4326'
});As GeoServer's coordinate swapping issue is well known, when updating existing features with WFS-T in the projection EPSG:4326, we include the features in the update array.