Robert Smith
Robert Smith

Reputation: 779

Openlayers 3 - wfs-t: change name of geometry field

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

Answers (2)

Met Kiani
Met Kiani

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

Robert Smith
Robert Smith

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

Related Questions