Openlayers 3-wfs-t:更改几何体字段的名称



我正在openlayers 3上尝试wfs-t,代码如下:

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();
  }

但是,当我运行更新事务(ajax调用)时,它会将geometry列发送为"geometry"。我需要将其更改为大写"GEOM":

<Property>
<Name>geometry</Name>

应为:

<Property>
<Name>GEOM</Name>

我尝试用我找到的隐藏属性(geometryName_)设置该功能:

f.geometryName _="GEOM";

但这并不奏效。如果您能帮助更改特性以将"GEOM"传递给ajax调用,我们将不胜感激。感谢

更新#1

根据Bart的建议,我添加了setGeometryName:

case 'update':
    f.setGeometryName("GEOM");
    node = formatWFS.writeTransaction(null,[f],null,formatGML);
    break;

但这导致openlayers3js在以下位置出错:

ol.interaction.Modify.prototype.addFeature_
..
if (geometry.getType() in this.SEGMENT_WRITERS) <-- errors out here

错误:无法获取属性getType对象为空

我假设您使用ol.transaction.draw绘制一个特征,如果是这种情况,则在调用"drawind"事件之前,您需要在绘制交互对象geometryName:'the_geom'中设置几何体名称

var interaction = new ol.interaction.Draw({
  type: 'MultiPolygon',
  source: Source,
  geometryName:'the_geom'
});

如果在绘制完成后设置geometryName(WRONG使用feature.setGeometryName()),openlayers将向服务器发送一个空对象。

问题已解决!

创建了一个解决问题的解决方案。如果有人有更好的解决方案,请公布你的答案。

步骤1-修改开关/案例陈述如下:

...
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;
...

步骤2-将以下功能添加到您的代码中:

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;
    }
  }
}

最新更新