首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GeoServer使用OpenLayers编辑WFS

使用GeoServer使用OpenLayers编辑WFS
EN

Stack Overflow用户
提问于 2016-06-03 13:18:26
回答 1查看 3.6K关注 0票数 3

在阅读了一个非常好的关于如何使用OpenLayers编辑WFS的教程之后,我尝试了复制它,但是使用了来自Geoserver的自己的WFS层。需要一些Javascript帮助找出它的问题所在。

我成功地加载了WFS和basemap,并设法使按钮显示出来。这些按钮在该页面中的工作示例中显示正确,但由于某种原因,几何数据没有保存。每次用户绘图时,都会在表上创建一个新id,但其相关的几何图形列将为空。

张贴的要点是:

代码语言:javascript
复制
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();
}

修改整个代码(如果代码看起来很混乱,请原谅,大部分代码来自于工作示例2 ) https://jsfiddle.net/Luffydude/ex06jr1e/6/

该应用程序如下所示:

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-07 16:16:25

我已经有一段时间没有怒气冲冲地看OpenLayers了,我有点忘了更新我的工作示例。我只是把一个新的JSFiddle与简单的WFS插入为多边形。

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

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

小提琴使用OpenLayers 3.16。

一些关于我的设置的笔记。我倾向于拥有EPSG:3857中的所有几何图形,并且我没有在PostGIS中指定SRS。恨我的人会讨厌但我只是把我的几何列设为几何学。这样我就可以在同一张表中得到直线、点和多边形。我看不到QGIS中的混合几何,但这是一个简单的测试设置。几何域称为几何学是很重要的。这可能是可能的,但我无法使这一领域被称为the_geom或geom。在这种情况下,会插入一个记录,但如post中所述,几何图形字段是空的。我相信这就是问题所在。

代码语言:javascript
复制
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;

这是弹琴的代码位。

代码语言:javascript
复制
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();
});
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37615490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档