首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GeoServer:使用PostGIS存储为pk分配配置主键元数据表

GeoServer:使用PostGIS存储为pk分配配置主键元数据表
EN

Stack Overflow用户
提问于 2016-03-01 02:56:50
回答 1查看 2.8K关注 0票数 3

问题

在创建主键元数据表方面,我遵循在GeoServer文档中的指示,但是我无法使用WFS请求中同名的属性的值为分配地理特性的主键(存储在PostGIS存储中)。

具体来说,我正在创建一个UUID客户端(这是必要的),然后将它作为WFS请求XML的'uuid‘属性发送到GeoServer。一旦落入GeoServer手中,我希望将该UUID插入到几何学表的主键列中,也称为“uuid”。相反,GeoServer会自动创建自己的主键,如下所示:

fid--46a202d5_15320520551_-7ffe

语境

以下是我的几何表SQL:

代码语言:javascript
复制
CREATE TABLE test_points (uuid VARCHAR(60) PRIMARY KEY NOT NULL);
ALTER TABLE test_points ADD COLUMN title VARCHAR(30) NOT NULL;
ALTER TABLE test_points ADD COLUMN body TEXT NOT NULL;
SELECT AddGeometryColumn('public', 'test_points', 'geometry', '4326', 'POINT', 2);

下面是我的主键元数据表SQL,与docs中的基本相同:

代码语言:javascript
复制
CREATE TABLE public.gt_pk_metadata_table (
  table_schema VARCHAR(32) NOT NULL,
  table_name VARCHAR(32) NOT NULL,
  pk_column VARCHAR(32) NOT NULL,
  pk_column_idx INTEGER,
  pk_policy VARCHAR(32),
  pk_sequence VARCHAR(64),
  unique (table_schema, table_name, pk_column),
  check (pk_policy in ('sequence', 'assigned', 'autoincrement'))
);

INSERT INTO gt_pk_metadata_table (
  table_schema,
  table_name,
  pk_column,
  pk_policy
) VALUES (
  'public',
  'test_points',
  'uuid',
  'assigned'
);

我已经让WFS-t插入操作正常工作(没有主键分配),但这里有一个WFS请求XML的典型示例,以防有帮助:

代码语言:javascript
复制
<Transaction xmlns="http://www.opengis.net/wfs" service="WFS" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Insert>
    <test_points xmlns="my points">
      <geometry>
        <Point xmlns="http://www.opengis.net/gml" srsName="EPSG:3857">
          <pos>-11828783.001187595 4559315.863154193</pos>
        </Point>
      </geometry>
      <uuid>18984168-27cc-4fc8-8dea-bfbd39c42b22</uuid>
      <title>A Perfect Example</title>
      <body>Here's my body.</body>
    </test_points>
  </Insert>
</Transaction>

就我的GeoServer配置而言,在我使用的数据存储的配置页面上,启用了“公开主键”标志,主键元数据表参数的值保留为空白(请参阅下面的其他值。)

失败尝试

以下是我尝试过的其他事情的清单:

  • 创建几何图形表而不设置主键
  • 使用UUID类型的主键列创建几何图形表
  • 在“public”之外的架构中创建几何表,将主键元数据表保留在“public”模式中
  • 在“public”以外的架构中创建几何图形表和公钥元数据表
  • 更改主键元数据表中的记录,以便pk_column_idx列中的值为0
  • 更改主键元数据表中的记录,以便pk_column_idx列中的值为1
  • 禁用存储配置中的“公开主键”标志
  • 将存储配置中的“主键元数据表”参数的值更改为元数据表的架构限定名。
  • 将存储配置中的“主键元数据表”参数的值更改为元数据表的-schema限定名

每次更改之后,我删除了test_points层,然后重新发布它。此外,我尝试删除和重新创建商店几次。

如你所见,我有点绝望了。任何帮助都是非常感谢的!

更新: GeoServer插入日志

好主意啊,我相信这会有帮助的!下面是GeoServer在插入过程中记录的内容的一个示例。除了idgen设置为GenerateNew这一事实(我认为这表明GeoServer认为它应该生成一个新的pk )之外,在我看来,这一切都很好。但是,这是我使用GeoServer的第一个项目,所以这可能并不意味着什么。提示: UUID、标题、正文和几何学与上面的XML示例不同。

代码语言:javascript
复制
2016-03-01 16:14:29,755 INFO [geoserver.gwc] - DataStoreChange:{/mypoints}test_points PreInsert
2016-03-01 16:14:29,760 INFO [geoserver.gwc] - DataStoreChange: {/mypoints}test_points PostInsert
2016-03-01 16:14:29,763 INFO [geoserver.wfs] - 
Request: transaction
    service = WFS
    version = 1.1.0
    baseUrl = http://127.0.0.1:8080/geoserver/
    group[0] = wfs:insert=net.opengis.wfs.impl.InsertElementTypeImpl@5b886147 (feature: [SimpleFeatureImpl:test_points=[SimpleFeatureImpl.Attribute: uuid<uuid id=fid-4f745b22_1532fc9fb1c_-7ffa>=853596f8-9de1-477a-b287-f3cd114db90a, SimpleFeatureImpl.Attribute: title<title id=fid-4f745b22_1532fc9fb1c_-7ffa>=Another Test, SimpleFeatureImpl.Attribute: body<body id=fid-4f745b22_1532fc9fb1c_-7ffa>=For you!, SimpleFeatureImpl.Attribute: geometry<geometry id=fid-4f745b22_1532fc9fb1c_-7ffa>=POINT (-12044029.67283865 4265797.674539117)]], handle: null, idgen: <unset>, inputFormat: <unset>, srsName: null)
    insert[0]:
        feature[0] = SimpleFeatureImpl:test_points=[SimpleFeatureImpl.Attribute: uuid<uuid id=fid-4f745b22_1532fc9fb1c_-7ffa>=853596f8-9de1-477a-b287-f3cd114db90a, SimpleFeatureImpl.Attribute: title<title id=fid-4f745b22_1532fc9fb1c_-7ffa>=Another Test, SimpleFeatureImpl.Attribute: body<body id=fid-4f745b22_1532fc9fb1c_-7ffa>=For you!, SimpleFeatureImpl.Attribute: geometry<geometry id=fid-4f745b22_1532fc9fb1c_-7ffa>=POINT (-12044029.67283865 4265797.674539117)]
        idgen = GenerateNew
        inputFormat = text/xml; subtype=gml/3.1.1
    releaseAction = ALL
EN

回答 1

Stack Overflow用户

发布于 2017-05-04 22:25:35

向特性添加fid="your_target_id"属性和向wfs:Insert添加idgen="UseExisting"属性使我能够分配一个uuid。

下面是是我在idgen上能找到的最好的文档。我不清楚WFS 1.0.0和2.0.0中的类似物。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35713831

复制
相关文章

相似问题

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