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

Gis Openlayers 3-wfs-t:更改几何体字段的名称,gis,openlayers-3,geoserver,Gis,Openlayers 3,Geoserver,我正在使用以下代码在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)

我正在使用以下代码在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”:

但这会导致openlayers 3 js在以下位置出错:

ol.interaction.Modify.prototype.addFeature_
..
if (geometry.getType() in this.SEGMENT_WRITERS) <-- errors out here
ol.interaction.Modify.prototype.addFeature_
..
如果(此.SEGMENT_WRITERS中的geometry.getType())问题已解决

创建解决问题的变通方法。如果有人有更好的解决方案,请张贴您的答案

步骤1-修改switch/case语句,如下所示:

...

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;
    }
  }
}
函数removeLowerCaseGeometryNodeForInsert(节点)
{
var geometryNodes=node.getElementsByTagName(“几何”),元素;
while(geometryNode=geometryNodes[0])
{
geometryNode.parentNode.removeChild(geometryNode);
}
}
函数removeNodeForWfsUpdate(节点,值ToRemove)
{
var propNodes=node.getElementsByTagName(“属性”);
对于(var i=0;i
我假设您使用ol.transaction.draw绘制一个特征,如果是这种情况,您需要在调用“抽屉”事件之前,在绘制交互对象
geometryName:“the_geom”
中设置几何体名称

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

如果在绘制完成后设置geometryName(错误使用
功能。setGeometryName()
),openlayers将向服务器发送空对象。

您需要在功能上使用setGeometryName。这将通过格式来获取。巴特,尝试了你的建议,但没有成功。请参见上面的更新#1。您需要确保特征值中的几何图形位于该键下。设置名称后feature.getGeometry()会产生什么结果?Bart,openlayers 3.12.0不允许使用setGeometryName。设置后,openlayers会因上述错误而崩溃。如果我不调用setGeometryName,getGeometry会返回特征的几何体。特征是如何创建的,为什么它们从一开始就没有正确的几何体名称?这个答案非常有效,应该接受:)
...

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;

...
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;
    }
  }
}
var interaction = new ol.interaction.Draw({
  type: 'MultiPolygon',
  source: Source,
  geometryName:'the_geom'
});