没有这样的 属性:在 openlayers 3 - Geoserver 中更新特征时的几何

No such property: geometry when updating feature in openlayers 3 - Geoserver

我正在使用 Openlayers 3、Postgresql 和 Geoserver 2.8 开发一个 webmapping 应用程序,我想进行 WFS-T 事务以进行绘图和更新,所以我按照以下步骤操作 https://medium.com/@goldrydigital/wfs-t-with-openlayers-3-16-6fb6a820ac58 这是我的修改代码:

var dirty = {};
select.getFeatures().on('add', function(e) {
    e.element.on('change', function(e) {
        dirty[e.target.getId()] = true;
    });
});
var clone;
select.getFeatures().on('remove', function(e) {
    var f = e.element;
    if (dirty[f.getId()]){
        delete dirty[f.getId()];
        featureProperties = f.getProperties();
        delete featureProperties.boundedBy;
        clone = new ol.Feature(featureProperties);
        clone.setId(f.getId());
        clone.setGeometryName("the_geom");
    }
});

var node = formatwfs.writeTransaction(null, [clone], null, {
            featureNS: "myNameSpace",
            featureType: "myLayer"
        });

        $.ajax({
            type: "POST",
            url: "http://localhost:8080/geoserver/wfs",
            data: new XMLSerializer().serializeToString(node),
            contentType: 'text/xml',
            success: function(data) {
                alert((new XMLSerializer()).serializeToString(data));
            },
            error: function(e) {
                var errorMsg = e? (e.status + ' ' + e.statusText) : "";
                alert('Error saving this feature to GeoServer.<br><br>'
                + errorMsg);
            },
            context: this
        });

绘图部分工作正常,但更新时出现错误:

<ows:ExceptionText>No such property: geometry</ows:ExceptionText>

我的 table 和层中的几何列是 "the_geom" 所以我用 setGeometryName("the_geom") 在我的代码中仔细检查它但是当我制作 AJAX 调用我得到上面的错误。

首先想到的是将我的postgresql中的geometry列名table改成geometry,然后在geoserver中重新发布图层,但是我想先知道有没有不太听话的解决方案为此,提前致谢

在将 postgresql 中的几何列名称更改为 "geometry" 之后,我现在得到另一个错误:

<ows:ExceptionText>java.lang.NullPointerException</ows:ExceptionText>

我把geometry的列名改成了"geometry",然后就出现了Java空指针相关的错误,然后我发现生成的XML代码是错误的,需要修改,因为它引用了错误的类型名称 feature:myLayer 而它应该是 myNameSpace:myLayer 对于这个我所要做的就是将其替换为 Javascript :

var str=new XMLSerializer().serializeToString(node);
var data=str.replace("feature:myLayer","myNameSpace:myLayer");

除了 Hicham Zouarhi 的解决方案之外,您还可以像这样更改几何类型:

//Change feature name
const find_feature = `feature:${layerName}`;
const re_feature = new RegExp(find_feature, "g");

//Change feature geometry column
const find_geometry = `<Property><Name>geometry</Name>`;
const re_geometry = new RegExp(find_geometry, "g");

const payload = xs.serializeToString(formatWFS.writeTransaction(null, f, null, formatGML))
 .replace(re_feature, `Bugra:${layerName}`)
 .replace(re_geometry, `<Property><Name>${layerGeometryColumn}</Name>`);