简介:这是人大金仓官方KingbaseES V8.6的GIS数据迁移方案文档,面向需要将ArcGIS、GeoScene、SuperMap等平台中的空间数据迁入国产数据库KingbaseES的数据库管理员与GIS工程师。文档从GIS能力介绍切入,系统说明KDTS迁移工具在ArcGIS平台上的ETL操作流程、ArcGIS/GeoScene直接导入方法、SuperMap平台导出配置,以及第三方通用GIS格式的入库步骤;每个环节均附有迁移结果验证方法和常见FAQ,便于排查连接配置、字段映射、数据类型兼容等问题。文档提供了从数据源连接、目标库配置、待迁移图层选择到字段映射及结果校验的完整操作指引,能显著降低迁移过程中的试错成本。压缩包内为单个PDF文件,共1个文件,大小2.76MB,按前言、第2章至第5章组织,章节结构清晰,可直接按需查阅。目前已有133人学习,适合正在推进GIS数据国产化迁移或需要KingbaseES落地参考的技术团队。
1. 人大金仓 KingbaseES v8.6 接 GIS 数据:迁移前先想清楚坐标系和空间扩展
人大金仓 KingbaseES v8.6 接 GIS 数据,最容易踩的坑不是表导不过来,而是空间参考和扩展没对齐。很多团队拿到迁移任务,第一反应是拿传统 ETL 把属性表搬完就收工,等 WebGIS 出图时才发现 geom 字段是空、坐标系整层偏移,或者业务库根本没有空间函数。这篇方案讲清楚从 PostGIS、Shapefile、ArcGIS 要素类这类异构 GIS 数据往 KingbaseES v8.6 迁移时,怎么选路径、怎么写最小命令、怎么验证成果;适合数据中台建设里的异构系统整合场景,也适合做国产化替代项目的人当落地笔记。
2. 迁移方案选型:为什么我优先选逻辑导出而不是整库物理拷贝
拿到一张源库清单,先别急着连。GIS 迁移方案里最核心的决策不是选工具,而是确认源数据在哪个层级:到底是关系表里存了几何 WKT,还是已经用 PostGIS 做了空间扩展,还是只有一堆散装 shp。这三类的处理手法完全不一样。数据中台建设中的数据迁移方案常把异构系统整合挂在嘴边,真正落到 KingbaseES 上时,第一步就是做数据资产盘点,把几何类型、坐标系、属性编码、是否分幅归档都登记一遍。
2.1 先区分空间数据和业务表:迁移路径完全不一样
我把源数据分成两层。第一层是业务表,比如项目编号、权属单位、台账字段,这类数据没有几何列,用逻辑导出/导入就行。第二层是空间要素,表里至少有一个 geometry 或 geography 列;这种表不能拿普通 row-by-row 导入硬套,因为几何列在 PostgreSQL 生态里通常不是简单字符串,而是带类型修饰符加 SRID 的二进制对象。
KingbaseES v8.6 保留了 PostgreSQL 的很多习惯,但空间扩展不一定叫 postgis,不同发行包的模块名有差异。直接 COPY 的话,几何值会变成一段看不懂的十六进制,SRID 信息也落在扩展层里,普通文本导入补不回来。尤其是从 Oracle Spatial 的 SDO_GEOMETRY 过来时,很多人把 SDO_GEOMETRY 导出成 WKT 再导入,看着成功,实际坐标系和几何类型已经丢了。
我一般会先做一张源库登记表,字段至少包含:源库类型、空间扩展、几何字段名、SRID、几何类型(点线面/多点)。这张表决定了后续用哪条路径。源库是 PostGIS 且目标也是 KingbaseES v8.6,空间扩展能力对齐后,可以用逻辑导出;源库是散装 shp 或 GeoJSON,直接走 GDAL;源库是 Oracle Spatial,先转成中间格式再进目标库,避免目标环境装一堆 Oracle 客户端。
整库物理拷贝看似省事,但我不会在生产里用。物理拷贝需要源和目标页大小、扩展版本、用户信息、license 全部对齐,跨平台就更别提了。KingbaseES 和源库对空间函数的实现版本不一致时,拷贝过去很容易出现启动失败或 ST_Transform 这类函数不存在。逻辑导出的优势是可控,能看见每一步处理的边界。
2.2 四种路径对比:哪条适合你的源库和目标环境
| 路径 | 适合场景 | 风险点 | 我的用法 |
|---|---|---|---|
| sys_dump / sys_restore | 源和目标都是 KingbaseES v8.6,迁移业务表 | 空间扩展函数版本不一致,恢复时容易在 CREATE EXTENSION 报错 | 只用于业务表备份和同版本恢复 |
| ogr2ogr | Shapefile、GeoJSON、FileGDB、PostGIS 兼容库 | SRID 要显式给,GDAL 版本太老对 CGCS2000 支持不全 | 首选,空间表都走这条 |
| SQL INSERT / COPY | 小表、临时表清洗 | 大数据慢,几何函数用错会把类型写坏 | 5 万行以下才用 |
| ETL 工具 | 异构系统整合中的属性清洗 | 几何字段常被展平成文本,坐标系丢失 | 属性表清洗,空间表最后交给 ogr2ogr |
这里多说一句 ETL。Kettle、DataStage 这类工具在属性表层面很强,但对几何字段的处理往往很保守,输出到 KingbaseES 时可能把 geometry 映射成 text 或 blob,后面查询又得洗一遍。数据中台项目里最忌讳的就是“看起来跑通了,实际没空间能力”。所以我的顺序是:先用 ogr2ogr 建空间表,再用 SQL 做属性补录,最后用 sys_dump 做定时备份。这样每个环节都能验证,翻车时知道是哪一步造成的。
3. 最小可跑通的 KingbaseES GIS 库:建库、空间扩展、连接参数
选好路径只是开始。下面这套最小命令,已经把环境初始化、密码、编码、坐标转换都绑在一起,照着跑能少踩一半坑。如果没有现成环境,我建议用官方容器镜像起一个临时 v8.6 实例,端口通常映射到 54321,密码通过 KINGBASE_PASSWORD 环境变量在启动时传入;这样能避开本机残留旧版本带来的干扰。
3.1 建库和空间扩展:先用一个查询确认扩展名
KingbaseES v8.6 的默认超级用户不是 postgres,而是 system。以 system 登录后,先建一个独立库,再确认空间扩展名,不同发行包的结果可能不同。
-- 以超级用户登录 KingbaseES ksql -U system -h 127.0.0.1 -p 54321 -d postgres -- 建一个独立迁移库 CREATE DATABASE gismig OWNER system; -- 重连到新库 \c gismig -- 查可用的空间扩展名 SELECT name, default_version FROM pg_available_extensions WHERE name ILIKE '%gis%'; -- 上一步结果可能是 postgis,也可能是 kingbase_gis -- 如果是 postgis,直接执行: CREATE EXTENSION IF NOT EXISTS postgis; -- 如果是 kingbase_gis,把上面一行替换成对应的扩展名逻辑说明:先查 pg_available_extensions 是为了避免盲目执行 CREATE EXTENSION postgis。v8.6 不同发行包里空间模块的注册名不一样,用通配符查一次就能看到当前发行包提供了什么。CREATE EXTENSION 会把空间函数、geometry 类型、SRID 元数据全部装进当前库,所以必须在迁移库上执行,而不是在 postgres 系统库上装。
参数说明:system是 KingbaseES 的超级用户,建库和扩展都需要它。如果应用账号不是超级用户,后面只授库内表的权限。54321是 KingbaseES 常见默认端口,具体以安装时配置为准。
3.2 用 ogr2ogr 把 Shapefile 灌入 KingbaseES:一条命令带齐 SRID 与编码
空间表我基本都用 ogr2ogr 创建,而不是手写 CREATE TABLE。原因很简单:GDAL 会读 shapefile 的几何类型、属性字段和 prj 文件,一次性把结构带过去。下面这条命令是迁移中最常用的模板。
ogr2ogr \ -f "PostgreSQL" \ PG:"host=127.0.0.1 port=54321 dbname=gismig user=system password=实际密码" \ /data/landuse.shp \ -nln public.landuse \ -nlt PROMOTE_TO_MULTI \ -s_srs EPSG:4326 \ -t_srs EPSG:4547 \ -lco GEOMETRY_NAME=geom \ -lco SPATIAL_INDEX=GIST \ -lco ENCODING=UTF-8 \ -overwrite逻辑说明:这条命令把 landuse.shp 读进来,在 KingbaseES 里建或覆盖 public.landuse 表,几何字段名固定为 geom,并按目标坐标系完成一次投影转换。-nlt PROMOTE_TO_MULTI会把同文件里的不同单几何统一提升成 MULTI 类型,避免部分图斑是 POLYGON、部分是 MULTIPOLYGON 导致应用端查询时报类型不一致。
参数说明:-s_srs是源坐标系,如果 shapefile 里有 .prj,GDAL 会优先使用;没有 .prj 时这个参数不能省。-t_srs是目标坐标系,实际项目里要按国土、规划业务要求选 CGCS2000 的对应投影带,不要为了省事直接投影到 Web 墨卡托。-overwrite会先删后建,只有确定表可以被覆盖时才用;增量场景换成-append。-lco SPATIAL_INDEX=GIST会在导入完成后建空间索引,对百万级图斑来说,这一步比后补索引省事。
如果 GDAL 的 PostgreSQL 驱动连不上 target,先查 GDAL 版本和客户端驱动,不是命令写错。我见过老版本 GDAL 对 KingbaseES 的握手兼容有问题,升级 GDAL 或改走 ODBC 驱动后,同一套参数就能跑通。
3.3 连接参数和用户权限:影响迁移成败的四个变量
迁移环境里最容易被忽略的不是 SQL,而是连接侧参数。我每次跑批量导入前,都会先确认四件事:端口、client_encoding、search_path、application_name。端口错了第一行就失败;编码错了中文属性和图斑名称会乱;schema 错了数据落到别的用户下,后面应用查不到;application_name 是为了在数据库侧排查慢查询时能找到迁移会话。
ksql -U etl -d gismig -h 127.0.0.1 -p 54321 \encoding UTF8 SET search_path TO public, geo; SET application_name = 'gis_migration';逻辑说明:\encoding UTF8控制客户端显示和后续 SQL 的文本编码。search_path要让业务账号能同时看到 public 和目标 schema,否则 ogr2ogr 写入的表虽然存在,但应用连接后默认 schema 看不到,就会误报“表不存在”。application_name对空间查询没有直接影响,但迁移过程一旦出现锁等待,DBA 能根据这个名字快速定位是哪批导入在占用资源。
参数说明:账号权限不要直接用 system 跑业务。生产库上我会建一个 etl 账号,只授权目标 schema 的表读写;导入完成后把 system 密码换掉,避免脚本里的密码长期有效。建扩展这个动作必须是超级用户,所以顺序是先 system 建库建扩展,再创建业务账号并授权,最后业务账号执行 ogr2ogr 和后续 SQL。
4. 字段映射、坐标系转换与属性缺失:迁移时的精细化处理
GDAL 能把表建出来,不代表字段映射和坐标参考是对的。GIS 数据的坐标系是黑匣子,尤其在 CAD 转 shp、GeoJSON 转要素类这种链路里,srid=0 几乎是常态。这一章拆开讲坐标系、属性字段和批量参数。
4.1 SRID 转换:为什么 4326 进 4547 出会整层跑偏
最常翻车的场景是:源数据没有 .prj 文件,GDAL 默认按 EPSG:4326 读,但实际坐标是 CGCS2000 投影坐标,一导入就整体跑到海里。反过来的情况也有:坐标值看着像经纬度,但被当成投影坐标,要素在 WebGIS 上被压成一条线。
我建议在导入前先对源数据做一次预检:取几个已知控制点,拿原始坐标值和实际位置对比。如果坐标值范围是 300000 到 500000 这种,基本是投影坐标;如果范围是 73 到 135,基本是经纬度。SRID 给错,后面无论怎么调 ST_Transform 都是错上加错,因为第一步已经把坐标系读歪了。
-- 已经导入且 SRID 为 0 的表,补救方法 UPDATE public.landuse SET geom = ST_SetSRID(geom, 4326) WHERE ST_SRID(geom) = 0;逻辑说明:srid=0 表示几何对象没有坐标系标签。ST_SetSRID 只是给几何打标签,不会重算坐标。如果原数据实际就是经纬度,那么赋 4326 是对的;如果原数据是投影坐标,要先赋正确的投影 SRID,再用 ST_Transform 转到目标坐标系。不要看到 srid=0 就直接赋 4326,这是最常见的错判。
参数说明:ST_SRID(geom)=0过滤条件很重要,避免误改已经带坐标系的记录。执行 UPDATE 前先开事务,跑完抽查若干记录再提交。百万级表上这种 UPDATE 会锁全表,尽量在晚间窗口做。
4.2 属性字段映射与编码:中文名、长度和空值的三道关
Shapefile 的 DBF 字段名长度限制是 10 个字符,字段名带着大写、点号、中文的情况在 GeoJSON 里很常见。导入 KingbaseES 后,未加双引号的标识符会被折成小写。应用之前写"LandCode"的 SQL,在目标库可能变成landcode,直接报字段不存在。
中文编码问题是另一个高频坑。DBF 文件内部可能是 GBK,GeoJSON 是 UTF-8,如果 ogr2ogr 命令里没显式指定,GDAL 按文件头推断,推断错了中文属性就是乱码。我一般在命令里加-lco ENCODING=UTF-8,并在导入后立即查一条记录确认。
ogr2ogr \ -f "PostgreSQL" \ PG:"host=127.0.0.1 port=54321 dbname=gismig user=etl password=实际密码" \ /data/parcels.shp \ -nln public.parcels \ -where "地类代码 IS NOT NULL" \ -lco ENCODING=UTF-8 \ -overwrite逻辑说明:-where是 SQL 条件过滤,可以在导入时把空几何、空关键字段的记录挡在外面。这比导入后再 DELETE 快得多,也避免脏数据进入目标表。-lco ENCODING=UTF-8是控制输出表字段的编码;如果源 DBF 是 GBK,一般不影响 PostGIS 兼容库的存储,只要连接侧 client_encoding 是 UTF-8。
参数说明:-where里的字段名要用源文件的字段名,不是目标表字段名。字段长度方面,DBF 的文本字段默认 254 字节,如果源数据里有超长说明文字,GDAL 可能截断。稳妥做法是先在目标库里手工建好宽字段表,再用-append导入,而不是让 ogr2ogr 自动建窄表。
4.3 批量迁移参数:事务批量、失败跳过和进度观察
一个省的图斑几十万甚至上百万,ogr2ogr 默认行为不一定是适合生产的。我一般会加三个参数:-gt控制事务批量,-skipfailures控制坏几何,-progress保证能看见进度。没有进度输出的大文件导入,跑到一半像是卡死,最容易让人误判。
ogr2ogr \ -f "PostgreSQL" \ PG:"host=127.0.0.1 port=54321 dbname=gismig user=etl password=实际密码" \ /data/parcels.shp \ -nln public.parcels \ -gt 2000 \ -skipfailures \ -progress逻辑说明:-gt 2000表示每 2000 个要素提交一个事务。如果导入到第 5 万条时断电,前面已提交的批次保留,当前批次回滚,下次可以从最后成功位置附近重新处理。-skipfailures是双刃剑:它能跳过坏几何继续跑,但也会掩盖字段缺失、坐标系错乱等问题。开这个参数时,必须记下 GDAL 输出的成功数量与总数量,两数不等就说明有数据没进去。
参数说明:-gt不是越大越快,事务太大回滚成本高,太小则提交开销明显。2000 到 5000 对大多数字段类型都是合理区间。-progress输出的是精度较低的百分比,不能替代最终数量核对。百万级空间表,如果目标表已经存在且带 GIST 索引,导入会明显变慢;极端情况下可以先导入到空表,再补建索引。
5. 从选型到落地的避坑清单:初始密码、授权文件、坐标系偏移和在线底图加载
这些都是我踩过或者帮别人排过的问题。按这个顺序排查,能省掉半天无效操作。在 KingbaseES v8.6 上做 GIS 迁移,真正劝退人的往往不是 SQL,而是环境侧的小问题。
5.1 初始密码试错半天?先把默认账号换成 system
现象:ksql 里用 postgres 账号登录一直提示口令错误,\dx看不到扩展,于是怀疑是空间模块没装,反复重装。
原因:KingbaseES v8.6 默认超级用户是 system,不是 postgres。安装包和容器镜像首次启动时的初始口令,一般写在启动日志或由环境变量生成,不是固定的“postgres”。拿 PostgreSQL 的习惯去连,当然连不上。
解决:先看安装目录日志里的提示,或者在容器启动时通过 KINGBASE_PASSWORD 环境变量指定初始密码。登录成功后立刻执行 ALTER USER system PASSWORD 换成强密码,后续脚本里用专有业务账号,不要把这次试出来的密码带进迁移脚本。
5.2 授权文件不对导致空间扩展装不上或整表不可查
现象:CREATE EXTENSION 时报 license error;或者迁移到一定行数后,查询开始报超出授权限制。
原因:KingbaseES 是商用数据库,license 决定版本、实例数和能力范围。空间模块可能在标准版里没有开通,或者授权文件放置的位置不对。授权文件不足时,数据库本身能启动,但空间扩展和部分高级功能会被拦截。
解决:拿到授权文件后,先和 DBA 确认它覆盖的版本和企业版/标准版能力,再放到安装目录对应的授权目录,重启数据库,重新查 pg_available_extensions。能查到空间扩展名再执行 CREATE EXTENSION。授权文件有生效范围,迁移验证和生产的 license 要分开管理,不要把试用授权直接用于生产数据。
5.3 坐标偏移:CAD 图整层跑偏,先在源端校正而不是目标端硬改
现象:从 CAD 导出的 DXF 转成 shp,导入 KingbaseES 后,叠加天地图底图时整层图斑平移了几十米甚至几百米,属性表却完全正常。
原因:CAD 坐标经常是毫米或局部坐标系,导出 shp 时如果没有赋投影,GDAL 会把数值当成经纬度读进来。比如一条线坐标是 500000 多,真实身份是 CGCS2000 投影坐标,却被打上 4326 标签,图斑自然跑到海里去。
解决:在源端先用 GIS 工具把单位改成米,明确指定 CGCS2000 投影,再生成 shp。迁移脚本里-s_srs不要省。验证时不要只看图,取两个已知控制点,在源图和目标库里分别算ST_Distance,和实测值对不上就说明坐标系或单位有问题。CAD 图里的尖锐角、重复点这类坏几何,导入后还会被 ST_IsValid 判为无效,这类要在源端做拓扑处理,别指望数据库硬兜。
5.4 GIS Pro 在线地图加载不了:先看底图服务,不背数据库的锅
现象:KingbaseES 图层加进 GIS Pro 后属性表能打开,但叠加天地图底图时黑屏或一直转圈,日志提示无法加载。
原因:在线底图和数据库是两个链路。天地图这类在线服务涉及服务 token、SSL 证书和客户端缓存目录权限,任何一个出问题都会表现为“加载不了”,但这和刚才导入的 geom 字段没有关系。
解决:先在 GIS Pro 里把 KingbaseES 图层导出成 GeoJSON 或直接用范围查询,确认数据本身正常;再单独添加天地图底图服务,按服务文档重新配置 token 和缓存路径。如果在线底图仍然不行,就改用本地切片包先验证业务图层,不要让底图问题干扰数据迁移验收。
6. 迁移后的验证与增量更新:用 SQL 把“看起来成功”变成“确认没丢数”
迁移到位只是第一步,我用三组 SQL 做验收。第一组看几何完整性和有效性;第二组和源系统按业务字段核对数量;第三组用范围对比排除坐标系问题。这三组跑完,才算真正落地。
-- 几何完整性和范围检查 SELECT count(*) AS total, count(geom) AS with_geom, sum(CASE WHEN geom IS NOT NULL AND NOT ST_IsValid(geom) THEN 1 ELSE 0 END) AS invalid_geom, ST_Extent(geom) AS bounds FROM public.parcels; -- 和源系统按业务字段核对 SELECT code, count(*) AS cnt, round(sum(ST_Area(ST_Transform(geom, 4547))::numeric / 10000), 2) AS area_ha FROM public.parcels GROUP BY code;逻辑说明:第一条 SQL 里,with_geom 小于 total 说明有记录丢了几何;invalid_geom 大于 0 说明源数据有尖锐角、重复点这类坏几何,这类记录要回到源系统处理,不能靠 ST_MakeValid 硬改。ST_Extent 返回的是整个范围,拿这个和源图的四至对比,能快速发现坐标系是否整体偏移。第二条 SQL 的 area_ha 需要提前确认 geom 已经转到投影坐标系;如果直接拿经纬度 4326 算 ST_Area,得到的是“度²”,不是面积。永久基本农田这类要出两位小数的面积,最好先落到和地籍一致的投影带再做统计。
参数说明:ST_Transform(geom, 4547) 里的 EPSG:4547 是 CGCS2000 投影坐标系的一个常见编码,实际项目要按业务区域选对应中央经线。area_ha 的计算结果只是数据库层面的对比值,真正供入库的面积平差,要在专业 GIS 工具里完成,不要在 SQL 里直接四舍五入充当成果。
我现在的习惯是每次迁移完,都会把这三组 SQL 的结果连同 ogr2ogr 的 skipped count、目标库版本、license 状态一起存到一张迁移检查表。上线两周后有人问为什么边界少了一块,至少能翻出当时的验收快照,不用把整个库重新翻一遍。数据迁移没有后悔药,至少留个快照当后退路。希望帮到你。
本文还有配套的精品资源,点击获取