Reputation: 779
I am attempting wfs-t on openlayers 3 with the following code:
var formatWFS = new ol.format.WFS();
var formatGML = new ol.format.GML({
featureNS: 'http://argeomatica.com',
featureType: 'playa_sample',
srsName: 'EPSG:3857'
});
var transactWFS = function(p,f) {
switch(p) {
case 'insert':
node = formatWFS.writeTransaction([f],null,null,formatGML);
break;
case 'update':
node = formatWFS.writeTransaction(null,[f],null,formatGML);
break;
case 'delete':
node = formatWFS.writeTransaction(null,null,[f],formatGML);
break;
}
s = new XMLSerializer();
str = s.serializeToString(node);
$.ajax('https://gsx.geolytix.net/geoserver/geolytix_wfs',{
type: 'POST',
dataType: 'xml',
processData: false,
contentType: 'text/xml',
data: str
}).done();
}
However, when I run an update transaction (ajax call), it sends the geometry column as "geometry". I need to change it to be upper case "GEOM":
...
<Property>
<Name>geometry</Name>
...
should be: ...
<Property>
<Name>GEOM</Name>
...
I tried setting the feature with a hidden property I found (geometryName_):
f.geometryName_ = "GEOM";
But that does not work. Any help changing the feature to pass "GEOM" to the ajax call would be appreciated. Thanks
Update # 1
As suggested by Bart, I added setGeometryName:
case 'update':
f.setGeometryName("GEOM");
node = formatWFS.writeTransaction(null,[f],null,formatGML);
break;
But that causes openlayers 3 js to error out at:
ol.interaction.Modify.prototype.addFeature_
..
if (geometry.getType() in this.SEGMENT_WRITERS) <-- errors out here
Error: unable to get property getType object is null
Upvotes: 3
Views: 2147
Reputation: 894
I assume that you draw a feature with ol.transaction.Draw if that is the case you need to set your geometry name in the draw interaction object geometryName:'the_geom'
befor you call 'drawend' event
var interaction = new ol.interaction.Draw({
type: 'MultiPolygon',
source: Source,
geometryName:'the_geom'
});
if you set the geometryName after drawing is finished (WRONG using feature.setGeometryName()
)openlayers will send a null object to the server.
Upvotes: 5
Reputation: 779
Problem Solved!
Created a work-around to solve the problem. If someone has a better solution, please post your answer.
Step 1 - Modify the switch/case statement as follows:
...
case 'insert':
// Insert Parameter for new GEOMETRY NODE
f.set('GEOM', f.getGeometry());
node = formatWFS.writeTransaction([f], null, null, formatGML);
// Remove default lower case geometry node
removeLowerCaseGeometryNodeForInsert(node);
break;
case 'update':
// Update Parameter for new GEOMETRY NODE
f.set('GEOM', f.getGeometry());
node = formatWFS.writeTransaction(null, [f], null, formatGML);
// Remove lower case geometry node which will cause update to fail
removeNodeForWfsUpdate(node, "geometry");
break;
...
Step 2 - Add the following functions to your code:
function removeLowerCaseGeometryNodeForInsert(node)
{
var geometryNodes = node.getElementsByTagName("geometry"), element;
while (geometryNode = geometryNodes[0])
{
geometryNode.parentNode.removeChild(geometryNode);
}
}
function removeNodeForWfsUpdate(node, valueToRemove)
{
var propNodes = node.getElementsByTagName("Property");
for (var i = 0; i < propNodes.length; i++)
{
var propNode = propNodes[i];
var propNameNode = propNode.firstElementChild;
var propNameNodeValue = propNameNode.firstChild;
if (propNameNodeValue.nodeValue === valueToRemove)
{
propNode.parentNode.removeChild(propNode);
break;
}
}
}
Upvotes: 1