我正在使用以下代码在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”发送。我需要将其改为大写“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对象为空
答案 0 :(得分:2)
我假设您使用ol.transaction.Draw绘制一个特征,如果您需要在绘制交互对象geometryName:'the_geom'
中设置几何名称,则需要调用&#39; drawend&#39;事件
var interaction = new ol.interaction.Draw({
type: 'MultiPolygon',
source: Source,
geometryName:'the_geom'
});
如果在绘制完成后设置geometryName(错误使用feature.setGeometryName()
),openlayers将向服务器发送一个空对象。
答案 1 :(得分:1)
解决了问题!
创建解决问题的解决方法。如果有人有更好的解决方案,请发表您的答案。
步骤1 - 修改switch / case语句,如下所示:
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;
}
}
}
第2步 - 将以下功能添加到您的代码中:
.innerHTML