输入到 postgres 数据库的数据以某种方式被更改?

The data entered to the postgres db is altered somehow?

我创建了一个带有 postgis 扩展的 postgres 数据库和一个 table 使用这个命令:

create table lgeognad33 (ID serial primary key, geom geometry(POLYGON,3857) not null );

然后创建工作区和 postgis 数据存储并将 table 作为地理服务器中的图层发布...该图层将由 openlayers 客户端用作 'WFS' 请求...客户端代码是:

var formatWFS = new WFS();

var formatGML = new GML({
  featureNS: 'https://data.drawns.org/',
  featureType: 'lgeognad33',
  srsName: 'EPSG:3857'
});

var sourceWFS = new VectorSource({
  loader: function (extent) {
    $.ajax('http://localhost:8080/geoserver/SDWS/ows', {
      type: 'GET',
      data: {
      service: 'WFS',
      version: '1.1.0',
      request: 'GetFeature',
      typename: 'lgeognad33',
      srsname: 'EPSG:3857',
     // bbox: extent.join(',') + ',EPSG:3857'
    }
  }).done(function (response) {
  sourceWFS.addFeatures(formatWFS.readFeatures(response));
});
},
//strategy: ol.loadingstrategy.tile(ol.tilegrid.createXYZ()),
strategy: extent,
projection: 'EPSG:3857'
});

var layerWFS = new VectorLayer({
  source: sourceWFS
});

var map = new Map({
  target: 'map',
  controls: [],
  layers: [
    new TileLayer({
      source: new OSM()
    }), layerWFS
  ],
  view: new View({
 // center: fromLonLat([-1.7, 53.2]),
  center: [4086950.39, 4127574.58],
  zoom: 6
  })
});

var transactWFS = function (p, f) {
  let node;
  switch (p) {
    case 'insert':
      node = formatWFS.writeTransaction([f], null, null, formatGML);
      break;
  }

  var s = new XMLSerializer();
  var str = s.serializeToString(node);
  $.ajax('http://localhost:8080/geoserver/SDWS/lgeognad33/wfs', {
    service: 'WFS',
    type: 'POST',
    dataType: 'xml',
    processData: false,
    contentType: 'text/xml',
    data: str,
  }).done();
}

var interaction;

$('#drawPoly').on('click', function (event) {
  interaction = new Draw({
  type: 'Polygon',
  source: layerWFS.getSource()
  });
  map.addInteraction(interaction);
  interaction.on('drawend', function (e) {
  transactWFS('insert', e.feature);
  });
});

我希望数据库中插入的数据在 epsg:3857 但任何插入的多边形的结果是 0 0 0 1 1 1 1 0 0 0 ...我不知道地理服务器是否是转换数据或重新投影它(没有找到任何线索为什么会发生这种情况)...

客户端发送的请求载荷为:

<Transaction xmlns="http://www.opengis.net/wfs" service="WFS" version="1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"><Insert><lgeognad33 xmlns="https://data.test.org/"><geometry><Polygon xmlns="http://www.opengis.net/gml" srsName="EPSG:3857"><exterior><LinearRing srsName="EPSG:3857"><posList srsDimension="2">4039544.0708149946 4071341.874581627 4144721.421735397 4034652.1010047426 4012638.236858613 3995516.342522732 4039544.0708149946 4071341.874581627</posList></LinearRing></exterior></Polygon></geometry></lgeognad33></Insert></Transaction>

注:geoserver中的Native SRS和Declared SRS为:epsg:3857

注意: 这是 table 的照片,唯一不同的行是我用手插入的一行,它在地图,所有其他行都是从客户端提交的不同多边形 database image

注:交易请求为:

Request: transaction
    service = WFS
    version = 1.1.0
    baseURL = http://localhost:8080/geoserver/
    group[0] = wfs:insert=net.opengis.wfs.impl.InsertElementTypeImpl@fa0073 (feature: [SimpleFeatureImpl:lgeognad33=[SimpleFeatureImpl.Attribute: geom<geom id=fid--5772524c_1681ace82ae_-7ff7>=POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))]], handle: null, idgen: <unset>, srsName: null)
    insert[0]:
        feature[0] = SimpleFeatureImpl:lgeognad33=[SimpleFeatureImpl.Attribute: geom<geom id=fid--5772524c_1681ace82ae_-7ff7>=POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))]
        idgen = GenerateNew
        inputFormat = text/xml; subtype=gml/3.1.1
    releaseAction = ALL

我无法发表评论,但您是否检查过图层是否具有 "write" 访问权限?在“安全”下,然后是“数据”下,您可以添加一个规则来授予层的权限。该图层通常一开始是只读的,因此您需要为其添加 "write" 权限。添加新规则后,我将除管理员以外的所有角色添加到我所有的事务层。

问题出在数据库中几何字段的名称上,默认名称是 "geometry",这是 geoserver 理解的,但是当您使用其他名称如 "geom" 时,您应该使用openlayers 功能的 setGeometryName 函数 class 为您插入的功能设置几何名称,我做了以下解决问题:

feature.setGeometryName('geom');
transactWFS('insert', feature);