PostGIS_GCJ02toWGS84_操作文档

前情提要:

发现数据库中有一张表的坐标系为GCJ02,先需统一为WGS84

第一步:备份原表

打开 pgAdmin 4,连接存放 gis.poi_11 的数据库;右键该数据库 → Query Tool。

CREATE TABLE gis.poi_11_backup_20261016 AS

SELECT *

FROM gis.poi_11;

日期可改成实际备份日期。如果表已存在,不要直接覆盖。

1.1 验证备份

SELECT

(SELECT COUNT(*) FROM gis.poi_11) AS 原表记录数,

(SELECT COUNT(*) FROM gis.poi_11_backup_20261015) AS 备份记录数;

两个数字必须一致。建议再确认备份表有 geom 字段。

SELECT column_name, data_type, udt_name

FROM information_schema.columns

WHERE table_schema='gis'

AND table_name='poi_11_backup_20261015'

ORDER BY ordinal_position;

提示:CREATE TABLE AS 是表数据副本,不等于完整数据库备份;不会完整复制主键、索引、触发器等。重要生产环境还应使用 pgAdmin Backup/pg_dump 做正式备份。

第二步:获取 geoc-pg-coordtransform.sql

本方案使用 pg-coordtransform 项目提供的 PostgreSQL 坐标转换函数。

官方仓库:https://github.com/geocompass/pg-coordtransform

• 打开仓库 → Code → Download ZIP。

• 解压 ZIP。

• 找到 geoc-pg-coordtransform.sql。

• 保留原始 SQL 文件,并记录下载日期/版本。

它不是需要安装到 Windows 的软件,而是一份 SQL 脚本;所谓安装,就是在目标 PostgreSQL 数据库中执行脚本,让数据库创建转换函数。

第三步:安装 SQL 脚本

• 确认 pgAdmin 当前连接的是存放 gis.poi_11 的数据库。

• 右键数据库 → Query Tool。

• 打开 geoc-pg-coordtransform.sql;找不到打开按钮时,可用记事本/VS Code打开,Ctrl+A、Ctrl+C,再粘贴到 Query Tool。

• 执行整个脚本。

• 执行完成后如果出现 ERROR,先停止,不要进行坐标转换。

安装函数只影响当前数据库;GeoServer 不需要安装这个 SQL。

第四步:检查转换函数是否存在

SELECT

n.nspname AS 函数所在Schema,

p.proname AS 函数名称,

pg_get_function_identity_arguments(p.oid) AS 参数

FROM pg_proc p

JOIN pg_namespace n ON n.oid = p.pronamespace

WHERE p.proname = 'geoc_gcj02towgs84';

正常情况会返回 geoc_gcj02towgs84。记下函数所在 Schema。也可检查常见签名:

SELECT to_regprocedure('geoc_gcj02towgs84(geometry)');

如果返回 NULL,不要继续转换;检查 SQL 是否成功执行、当前数据库是否正确、函数是否安装在其他 Schema。

第五步:检查原始 geom

SELECT

ST_GeometryType(geom) AS 几何类型,

ST_SRID(geom) AS SRID,

COUNT(*) AS 记录数

FROM gis.poi_11

WHERE geom IS NOT NULL

GROUP BY ST_GeometryType(geom), ST_SRID(geom);

预期:ST_MultiPolygon、SRID=0。不要把 SRID=0 直接当成错误;本项目已确认实际坐标为 GCJ-02,采用临时 SRID=4326 的方式调用转换函数。

第六步:执行坐标转换函数

确认备份成功、测试成功后再执行。推荐使用事务:

BEGIN;

UPDATE gis.poi_11

SET geom = ST_SetSRID(

geoc_gcj02towgs84(

ST_SetSRID(geom, 4326)

),

0

)

WHERE geom IS NOT NULL;

-- 确认 UPDATE 影响行数正常、没有 ERROR 后:

COMMIT;

如果事务尚未提交且发现错误:

ROLLBACK;

COMMIT 后不能靠 ROLLBACK 撤销。若提交后发现位置错误,应使用备份表恢复。

7.出现问题时怎么处理

**函数不存在:**重新执行函数检查 SQL,确认连接的是正确数据库,并记录函数所在 Schema;若函数在其他 Schema,调用时使用 schema.函数名。

**转换结果为 NULL:**检查输入 geom 是否为空、SRID 是否符合函数要求,以及函数是否安装正确。

**转换后位置仍偏移:**确认另一个参考图层是 WGS 84;检查是否重复进行了 GCJ-02 转换;用多个控制点验证算法结果。

**GeoServer 仍显示旧位置:**先看 GeoServer Layer Preview;若预览已正确而前端不正确,优先检查缓存。服务器状态-资源缓存-清除。

**误操作后需要恢复:**不要继续修改原表。用 poi_1_backup_20261015 与当前 poi_1 对比,确认恢复方案后再操作。

相关推荐
天府云创1 小时前
SRE之DeepSeek 10月15日故障分析、旁推和思考
网络·数据库·人工智能·故障处理·deepseek·api恢复
Tsuki_tl1 小时前
Redis 单线程 + 多编码,到底怎么配合的?
数据库·redis·哈希表·redis数据类型·编码方式·单线程模型·redis底层
ynchyong1 小时前
创建MySQL只读账号
android·数据库·mysql
晴天¥1 小时前
如何手动方式(无 Broker)安全删除 ADG 备库?
数据库·oracle·oracle dg
Dovis(誓平步青云)1 小时前
车辆进入隧道后信号断开,座舱旅程怎样补回事件
java·开发语言·前端·数据库·电脑
红海云1 小时前
Agent 工程化的智能面积
数据库
March.s2 小时前
Redis 核心知识与高可用架构实践
数据库·redis·架构
数据库小学妹10 小时前
国产数据库怎么选?兼容、迁移、核心案例与融合架构四道关
数据库·架构·国产数据库·数据库迁移·融合数据库