输入到 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);
我创建了一个带有 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);