【问题标题】:Javascript editing WFS from GeoServer using OpenLayersJavascript 使用 OpenLayers 从 GeoServer 编辑 WFS
【发布时间】:2016-10-03 14:03:27
【问题描述】:

在阅读了非常好的tutorial on how to edit WFS with OpenLayers 之后,我尝试复制它,但使用来自 Geoserver 的我自己的 WFS 层。需要一些 Javascript 帮助来找出问题所在。

我成功地加载了 WFS 和我的底图,并设法让按钮显示出来。按钮显示正确,就像在working example from that page 中一样,但是由于某种原因,几何数据没有被保存。每次用户绘制东西时,都会在表格上创建一个新的 id,但其关联的几何列是空的

发帖的地方是:

var formatWFS = new ol.format.WFS();
var formatGML = new ol.format.GML({
featureNS: 'http://geoserver.org/bftchamber',
featureType: 'bft',
srsName: 'EPSG:27700'
});
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('http://localhost:8080/geoserver/wfs',{
    type: 'POST',
    dataType: 'xml',
    processData: false,
    contentType: 'text/xml',
    data: str
    }).done();
}

摆弄整个代码(如果它看起来很混乱,很抱歉,其中大部分来自工作示例2https://jsfiddle.net/Luffydude/ex06jr1e/6/

应用如下所示:

此外,即使我在 QGIS 中加载 WFS 时它在泰晤士河上正确显示,但在我的应用程序中,即使我指定 EPSG 27700,它也会出现在海洋的其他地方(尽管目前这只是一个小烦恼)。

我现在的主要问题是如何让编辑按钮将用户编辑保存到 WFS 层?

【问题讨论】:

  • 你遇到了什么错误?
  • @JoseHermosillaRodrigo 控制台没有错误,按钮不起作用
  • 在示例 (dbauszus-webmaps.appspot.com/ol3-wfs-t) 中,您提供的按钮按预期工作。现在你说你的代码不起作用,但你没有提供你的代码。你指望我们怎么找出问题????试着制作一个小提琴来证明你的情况。
  • 当我按下任何按钮时,我得到ReferenceError: interaction is not defined map.removeInteraction(interaction);
  • 您的那段代码存在某种错误。不过,在初始化交互之前调用 map.removeInteraction(interaction); 的声音逻辑。你的小提琴有点乱。我试着把它整理一下,但需要一些我现在没有的时间。对此感到抱歉。我建议使用 firebug 是为了解决任何 firebug 错误,然后看看你是否仍然遇到问题

标签: javascript jquery html openlayers-3 geoserver


【解决方案1】:

我已经有一段时间没有真正愤怒地看着 OpenLayers 了,我有点不小心更新了我的工作示例。我刚刚将一个新的JSFiddle 与用于多边形的简单 WFS-T 插入组合在一起。

我在生产中使用 Geoserver 2.8(在开发和测试中使用 2.9)。

数据库后端是生产中的 PostGIS 2.1(2.2 开发版)。

小提琴使用 OpenLayers 3.16。

关于我的设置的几点说明。我倾向于在 EPSG:3857 中包含所有几何图形,并且我没有在 PostGIS 中指定 SRS。讨厌的人会讨厌,但我只是将几何列设置为几何。这样我就可以在同一张表中获得线、点和多边形。我在 QGIS 中看不到混合几何,但这是一个简单的测试设置。几何字段称为几何是很重要的。这可能是可能的,但我无法使用名为 the_geom 或 geom 的字段来完成这项工作。在这种情况下,插入了一条记录,但几何字段为空,如帖子中所述。我相信这是问题所在。

CREATE TABLE wfs_geom
(
  id bigint NOT NULL,
  geometry geometry,
  CONSTRAINT wfs_geom_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE wfs_geom
  OWNER TO geoserver;

这是来自 jsfiddle 的代码。

var formatWFS = new ol.format.WFS();

var formatGML = new ol.format.GML({
    featureNS: 'https://geolytix.net/wfs',
    featureType: 'wfs_geom',
    srsName: 'EPSG:3857'
});

var s = new XMLSerializer();

var sourceWFS = new ol.source.Vector({
    loader: function (extent) {
        $.ajax('https://maps.geolytix.net/geoserver/geolytix.wfs/wfs', {
            type: 'GET',
            data: {
                service: 'WFS',
                version: '1.1.0',
                request: 'GetFeature',
                typename: 'wfs_geom',
                srsname: 'EPSG:3857',
                bbox: extent.join(',') + ',EPSG:3857'
            }
        }).done(function (response) {
            sourceWFS.addFeatures(formatWFS.readFeatures(response));
        });
    },
    strategy: ol.loadingstrategy.bbox,
    projection: 'EPSG:3857'
});

var layerWFS = new ol.layer.Vector({
    source: sourceWFS
});

var map = new ol.Map({
    target: 'map',
    layers: [
        new ol.layer.Tile({
            source: new ol.source.OSM({
                url: 'https://cartodb-basemaps-{a-d}.global.ssl.fastly.net/light_nolabels/{z}/{x}/{y}.png',
                opaque: false,
                attributions: []
            })
        }),
        layerWFS
    ],
    view: new ol.View({
        center: ol.proj.fromLonLat([-0.1, 51.50]),
        zoom: 13
    })
});

var interaction = new ol.interaction.Draw({
    type: 'Polygon',
    source: layerWFS.getSource()
});

map.addInteraction(interaction);

interaction.on('drawend', function (e) {
    $.ajax('https://maps.geolytix.net/geoserver/geolytix.wfs/wfs', {
        type: 'POST',
        dataType: 'xml',
        contentType: 'text/xml',
        data: s.serializeToString(formatWFS.writeTransaction([e.feature], null, null, formatGML))
    }).done();
});

【讨论】:

  • 我会说“GISters会讨厌”和“有充分的理由”。不指定 SRS 是个坏主意,因为,我怎么知道源数据的 SRS 是什么?以及如何告诉 postGIS 在另一个 SRS 中获取几何图形?此外,您没有指定尺寸或几何类型,这也是一种不好的做法。尝试在 Geoserver 中呈现类似的 postGIS 图层,您会感到奇怪的行为。另外,将这一层与另一层相交会产生什么结果?点、线、多边形?另外,如果您要为几何列编制索引,我担心??
  • 当然您可以这样做,postGIS 允许您这样做,但至少可以方便地使用视图来分隔点线和多边形,以便您的解决方案“对 GIS 友好”
  • 赞成,因为您为 Openlayers 提供了一个解决方案来提供 WFS,但我建议您建议这种创建几何列的方式不是一个好习惯。
  • 我完全同意 cmets 中的所有观点。这是一个非常简单的测试设置,用于 jsfiddle 而不是生产环境。我提到这一点是为了让人们分叉小提琴并放入其他类型的几何体。
  • 因此我支持你!!我写只是为了展示如何正确定义几何列!无论如何,你提供了一个很好的例子! =)
猜你喜欢
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多