
简介这是人大金仓官方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 报错只用于业务表备份和同版本恢复ogr2ogrShapefile、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:host127.0.0.1 port54321 dbnamegismig usersystem password实际密码 \ /data/landuse.shp \ -nln public.landuse \ -nlt PROMOTE_TO_MULTI \ -s_srs EPSG:4326 \ -t_srs EPSG:4547 \ -lco GEOMETRY_NAMEgeom \ -lco SPATIAL_INDEXGIST \ -lco ENCODINGUTF-8 \ -overwrite逻辑说明这条命令把 landuse.shp 读进来在 KingbaseES 里建或覆盖 public.landuse 表几何字段名固定为 geom并按目标坐标系完成一次投影转换。-nlt PROMOTE_TO_MULTI会把同文件里的不同单几何统一提升成 MULTI 类型避免部分图斑是 POLYGON、部分是 MULTIPOLYGON 导致应用端查询时报类型不一致。参数说明-s_srs是源坐标系如果 shapefile 里有 .prjGDAL 会优先使用没有 .prj 时这个参数不能省。-t_srs是目标坐标系实际项目里要按国土、规划业务要求选 CGCS2000 的对应投影带不要为了省事直接投影到 Web 墨卡托。-overwrite会先删后建只有确定表可以被覆盖时才用增量场景换成-append。-lco SPATIAL_INDEXGIST会在导入完成后建空间索引对百万级图斑来说这一步比后补索引省事。如果 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 转要素类这种链路里srid0 几乎是常态。这一章拆开讲坐标系、属性字段和批量参数。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;逻辑说明srid0 表示几何对象没有坐标系标签。ST_SetSRID 只是给几何打标签不会重算坐标。如果原数据实际就是经纬度那么赋 4326 是对的如果原数据是投影坐标要先赋正确的投影 SRID再用 ST_Transform 转到目标坐标系。不要看到 srid0 就直接赋 4326这是最常见的错判。参数说明ST_SRID(geom)0过滤条件很重要避免误改已经带坐标系的记录。执行 UPDATE 前先开事务跑完抽查若干记录再提交。百万级表上这种 UPDATE 会锁全表尽量在晚间窗口做。4.2 属性字段映射与编码中文名、长度和空值的三道关Shapefile 的 DBF 字段名长度限制是 10 个字符字段名带着大写、点号、中文的情况在 GeoJSON 里很常见。导入 KingbaseES 后未加双引号的标识符会被折成小写。应用之前写LandCode的 SQL在目标库可能变成landcode直接报字段不存在。中文编码问题是另一个高频坑。DBF 文件内部可能是 GBKGeoJSON 是 UTF-8如果 ogr2ogr 命令里没显式指定GDAL 按文件头推断推断错了中文属性就是乱码。我一般在命令里加-lco ENCODINGUTF-8并在导入后立即查一条记录确认。ogr2ogr \ -f PostgreSQL \ PG:host127.0.0.1 port54321 dbnamegismig useretl password实际密码 \ /data/parcels.shp \ -nln public.parcels \ -where 地类代码 IS NOT NULL \ -lco ENCODINGUTF-8 \ -overwrite逻辑说明-where是 SQL 条件过滤可以在导入时把空几何、空关键字段的记录挡在外面。这比导入后再 DELETE 快得多也避免脏数据进入目标表。-lco ENCODINGUTF-8是控制输出表字段的编码如果源 DBF 是 GBK一般不影响 PostGIS 兼容库的存储只要连接侧 client_encoding 是 UTF-8。参数说明-where里的字段名要用源文件的字段名不是目标表字段名。字段长度方面DBF 的文本字段默认 254 字节如果源数据里有超长说明文字GDAL 可能截断。稳妥做法是先在目标库里手工建好宽字段表再用-append导入而不是让 ogr2ogr 自动建窄表。4.3 批量迁移参数事务批量、失败跳过和进度观察一个省的图斑几十万甚至上百万ogr2ogr 默认行为不一定是适合生产的。我一般会加三个参数-gt控制事务批量-skipfailures控制坏几何-progress保证能看见进度。没有进度输出的大文件导入跑到一半像是卡死最容易让人误判。ogr2ogr \ -f PostgreSQL \ PG:host127.0.0.1 port54321 dbnamegismig useretl 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 状态一起存到一张迁移检查表。上线两周后有人问为什么边界少了一块至少能翻出当时的验收快照不用把整个库重新翻一遍。数据迁移没有后悔药至少留个快照当后退路。希望帮到你。本文还有配套的精品资源点击获取