You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostGIS不同版本几何数据Wire Protocol类型编号规则咨询

解决PostGIS几何类型Wire Protocol OID差异问题

核心问题说明

你遇到的数字(18011、17995)是PostgreSQL的OID(Object Identifier),PostGIS的几何类型OID并非固定值——不同PostGIS版本可能使用不同的默认OID范围,甚至同一版本在不同环境安装时,若已有其他扩展占用默认OID,也会动态调整。硬编码OID必然会出现兼容问题。

正确的处理方式:动态获取OID注册解码器

不要直接写死OID,而是在客户端初始化时,通过查询PostgreSQL的pg_type表获取对应几何类型的OID,再动态注册解码器:

SELECT oid, typname FROM pg_type WHERE typname IN ('geometry', 'linestring', 'point', 'polygon', 'multipoint', 'multilinestring', 'multipolygon', 'geometrycollection');

在Java代码中,执行这个查询后,遍历结果将OID和对应的解码器绑定注册,这样就能兼容所有PostGIS版本的环境。

OID规则与相关文档/代码位置

  1. PostGIS源码中的OID定义
    PostGIS的默认OID在源码的sql/postgis.sql.in文件中定义,比如旧版本可能使用179xx段的OID,新版本切换到180xx段。创建类型的语句类似:

    CREATE TYPE linestring (...) OID = 17995; -- 旧版
    CREATE TYPE linestring (...) OID = 18011; -- 新版
    

    你可以直接查看对应PostGIS版本的该文件,了解默认OID分配规则。

  2. PostgreSQL官方文档参考
    PostgreSQL中,系统内置类型的OID低于12800,扩展类型的OID默认从12800开始分配,但PostGIS会主动指定固定的默认OID范围,避免与其他扩展冲突。这部分规则可参考PostgreSQL扩展开发章节中关于类型创建的内容。

  3. PostGIS官方文档提示
    PostGIS官方文档明确不建议硬编码几何类型的OID,因为不同版本、安装环境的OID可能存在差异,推荐通过类型名称动态查询获取。

内容的提问来源于stack exchange,提问作者oshai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:45:42