PostGIS ST_Distance(geography)始终返回0问题求助
PostgreSQL 16 + PostGIS 3 升级后 ST_Distance(geography) 返回0.0 排查方案
检查PostGIS依赖库版本一致性
- 执行以下命令查看系统中PROJ、GDAL的版本,对比全新Ubuntu 20.04环境的对应版本:
proj gdalinfo --version - 登录PostgreSQL 16集群,查询加载的PROJ库路径,确认是否为系统正确版本:
SELECT * FROM pg_libraries WHERE lower(filename) LIKE '%proj%';
- 执行以下命令查看系统中PROJ、GDAL的版本,对比全新Ubuntu 20.04环境的对应版本:
验证geography类型的空间参考有效性
- 使用明确指定SRID的测试语句,确认是否返回正确结果:
SELECT ST_Distance( ST_GeographyFromText('SRID=4326;POINT(116.39723 39.9075)'), ST_GeographyFromText('SRID=4326;POINT(121.4737 31.2304)') ); - 检查
spatial_ref_sys表中关键SRID(如4326)的定义是否完整,对比全新环境的该表数据:SELECT * FROM spatial_ref_sys WHERE srid=4326;
- 使用明确指定SRID的测试语句,确认是否返回正确结果:
重新安装PostGIS扩展(彻底清理后重建)
- 在目标数据库中彻底删除并重新创建PostGIS扩展:
DROP EXTENSION IF EXISTS postgis CASCADE; CREATE EXTENSION postgis; - 查看PostGIS完整版本信息,确认组件无缺失:
SELECT postgis_full_version();
- 在目标数据库中彻底删除并重新创建PostGIS扩展:
排查PostgreSQL配置文件问题
- 对比PostgreSQL 13和16集群的
postgresql.conf,重点检查:shared_preload_libraries是否包含postgisdynamic_library_path是否正确指向PostGIS 3的库路径
- 重启PostgreSQL 16服务确保配置生效:
systemctl restart postgresql@16-main.service
- 对比PostgreSQL 13和16集群的
测试底层PROJ库功能
- 使用PROJ命令行工具测试坐标转换,确认库本身功能正常:
echo '116.39723 39.9075' | proj +proj=latlong +datum=WGS84 +to +proj=merc +datum=WGS84
- 使用PROJ命令行工具测试坐标转换,确认库本身功能正常:
检查系统库缓存
- 确认系统加载的是正确版本的PROJ、GDAL库:
ldconfig -p | grep proj ldconfig -p | grep gdal - 若发现旧版本库被优先加载,可调整
/etc/ld.so.conf.d/下的配置文件,更新缓存后重启服务:ldconfig systemctl restart postgresql@16-main.service
- 确认系统加载的是正确版本的PROJ、GDAL库:
内容的提问来源于stack exchange,提问作者PaDi
相关产品推荐
相关产品推荐

