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规则与相关文档/代码位置
PostGIS源码中的OID定义
PostGIS的默认OID在源码的sql/postgis.sql.in文件中定义,比如旧版本可能使用179xx段的OID,新版本切换到180xx段。创建类型的语句类似:CREATE TYPE linestring (...) OID = 17995; -- 旧版 CREATE TYPE linestring (...) OID = 18011; -- 新版你可以直接查看对应PostGIS版本的该文件,了解默认OID分配规则。
PostgreSQL官方文档参考
PostgreSQL中,系统内置类型的OID低于12800,扩展类型的OID默认从12800开始分配,但PostGIS会主动指定固定的默认OID范围,避免与其他扩展冲突。这部分规则可参考PostgreSQL扩展开发章节中关于类型创建的内容。PostGIS官方文档提示
PostGIS官方文档明确不建议硬编码几何类型的OID,因为不同版本、安装环境的OID可能存在差异,推荐通过类型名称动态查询获取。
内容的提问来源于stack exchange,提问作者oshai
相关产品推荐
相关产品推荐

