ST_Transform转换Z值结果差异:如何使第二服务器输出正确Z值?
问题:PostGIS中ST_Transform转换Z值不一致的处理方案
查询语句
with geom as ( select st_transform( st_geometryfromtext( 'POINT Z(114.19515060316667 22.3979100265 81.8574198829997)',4326) ,2326)as a) select st_x(a),st_y(a),st_z(a) from geom;
服务器对比信息
第一台服务器(符合需求,Z值已转换)
- 环境:Google Cloud SQL europe-west8
- 版本信息:
POSTGIS="3.1.4 3.1.4" [EXTENSION] PGSQL="140" GEOS="3.5.0-CAPI-1.9.0 4392" PROJ="Rel. 6.0.0, March 1st, 2019" LIBXML="2.9.10" LIBJSON="0.15" LIBPROTOBUF="1.4.0" - 结果:
838149.9363960824(st_x), 828737.9267898238(st_y), 84.71958220563829(st_z)
第二台服务器(Z值未转换,不符合需求)
- 环境:Google Cloud SQL europe-west3
- 版本信息:
POSTGIS="3.0.3 r3.0.3" [EXTENSION] PGSQL="130" GEOS="3.5.0-CAPI-1.9.0 4392" PROJ="6.1.1" LIBXML="2.9.4" LIBJSON="0.15" LIBPROTOBUF="1.4.1" (core procs from "3.0.0 r0" need upgrade) - 结果:
838149.9363960418(st_x), 828737.9267898289(st_y), 81.8574198829997(st_z)
解决方法
1. 升级PostGIS版本
第二台服务器的PostGIS版本为3.0.3,且提示核心进程需要升级,而第一台使用的3.1.4版本在Z值垂直基准转换逻辑上有优化。升级步骤:
- 先备份数据库,避免数据丢失
- 执行升级命令:
ALTER EXTENSION postgis UPDATE;
- 升级完成后重新运行查询语句,验证Z值转换效果
2. 手动指定垂直基准转换参数
如果暂时无法升级版本,可在ST_Transform中明确指定垂直基准转换规则,适配EPSG:2326(香港1980坐标系)的垂直基准要求:
with geom as ( select st_transform( st_geometryfromtext( 'POINT Z(114.19515060316667 22.3979100265 81.8574198829997)',4326), 2326, 'EPSG:4326+5703' -- 明确指定WGS84(EGM96)到香港1980的垂直基准转换 ) as a) select st_x(a),st_y(a),st_z(a) from geom;
注:第二台服务器的PROJ版本6.1.1支持该垂直基准转换规则。
3. 检查PROJ数据文件完整性
PROJ库的垂直转换依赖网格数据文件,若缺失会导致Z值不转换。可通过以下命令查看PROJ数据路径:
SELECT proj_lib_dir();
确认路径下包含egm96_15.gtx等垂直基准网格文件,若缺失需补充对应PROJ数据文件。
内容的提问来源于stack exchange,提问作者Dez
相关产品推荐
相关产品推荐

