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

Posted

技术标签:

【中文标题】Openlayers 3 - wfs-t:更改几何字段的名称【英文标题】:Openlayers 3 - wfs-t: change name of geometry field 【发布时间】:2016-01-13 14:02:18 【问题描述】:

我正在使用以下代码在 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 调用)时,它会将几何列作为“几何”发送。我需要将其更改为大写“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;

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

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

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

【问题讨论】:

您需要在该功能上使用 setGeometryName。这将由格式提取。 巴特,尝试了你的建议,但没有奏效。请参阅上面的更新 #1。 您需要确保在您的特征值中,几何图形位于该键下。设置名称后 feature.getGeometry() 会产生什么? 巴特,openlayers 3.12.0 不允许使用 setGeometryName。设置后,openlayers 崩溃并出现上述错误。如果我不调用 setGeometryName,getGeometry 会返回要素的几何形状。 您的要素是如何创建的,为什么它们从一开始就没有正确的几何名称? 【参考方案1】:

如果您需要在绘制交互对象geometryName:'the_geom' 中设置几何名称,以便调用“drawend”事件,我假设您使用 ol.transaction.Draw 绘制特征

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

如果你在绘制完成后设置geometryName(错误使用feature.setGeometryName())openlayers会发送一个空对象到服务器。

【讨论】:

这个答案完美,应该被接受:)【参考方案2】:

问题解决了!

创建了一个解决方法来解决问题。如果有人有更好的解决方案,请发布您的答案。

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

【讨论】:

以上是关于Openlayers 3 - wfs-t:更改几何字段的名称的主要内容,如果未能解决你的问题,请参考以下文章

Geoserver 和 Openlayers - 在 WFS-T 中显示详细的消息错误

Openlayers API-Style

WFS-T 对 Geoserver 的调用未可视化 POI

如何在地理服务器中启用全局设置

如何从PostGIS坐标中心openlayers地图?

使用 Openlayers/Geoserver 从我的 WFS 源更改 srsName