如何将含ArcGIS域信息的GDB导入PostgreSQL并保留域数据?
如何在ArcGIS GDB转PostgreSQL/PostGIS时保留域信息
针对你提到的900万条记录的GDB转库需求,同时保留域(比如quality域的1=low,2=medium,3=high编码规则),可以通过以下几种方案实现:
方案1:用ArcPy提取域信息,在PostgreSQL中构建关联约束
先从GDB中导出所有域的编码-文本映射,再在PostgreSQL中创建查找表并关联目标字段:
步骤1:导出GDB域信息
用ArcPy脚本批量提取域的编码和对应文本,保存为CSV:
import arcpy import csv # 替换为你的GDB路径和输出CSV路径 gdb_path = r"C:\data\your_gdb.gdb" output_csv = r"C:\data\domain_mappings.csv" # 遍历GDB中所有编码型域 domains = arcpy.da.ListDomains(gdb_path) with open(output_csv, "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["domain_name", "code_value", "description"]) for domain in domains: if domain.domainType == "CodedValue": for code, desc in domain.codedValues.items(): writer.writerow([domain.name, code, desc])
步骤2:在PostgreSQL中创建查找表并关联
- 将CSV导入PostgreSQL,创建域映射表(以
quality域为例):
CREATE TABLE domain_quality ( code INTEGER PRIMARY KEY, description VARCHAR(50) NOT NULL ); -- 导入CSV数据(假设用psql的\copy命令) \copy domain_quality FROM 'C:\data\domain_mappings.csv' DELIMITER ',' CSV HEADER WHERE domain_name = 'quality';
- 给目标表的
design_quality字段添加外键约束,确保取值符合域规则:
ALTER TABLE your_target_table ADD CONSTRAINT fk_design_quality FOREIGN KEY (design_quality) REFERENCES domain_quality(code);
- 若需要直接显示文本,可创建视图:
CREATE VIEW your_table_with_domain_text AS SELECT t.*, d.description AS design_quality_text FROM your_target_table t LEFT JOIN domain_quality d ON t.design_quality = d.code;
方案2:用GDAL/ogr2ogr直接导出域文本
GDAL 3.0及以上版本支持读取GDB的域信息,只需添加参数启用该功能,并通过SQL关联生成文本字段:
示例命令
ogr2ogr -f "PostgreSQL" PG:"dbname=your_db user=your_user password=your_pwd host=localhost" "C:\data\your_gdb.gdb" \ -oo READ_DOMAINS=YES \ -sql "SELECT *, domain_quality(design_quality) AS design_quality_text FROM your_feature_class" \ -lco PRECISION=NO \ -lco FID=OID \ -progress
-oo READ_DOMAINS=YES:启用域读取功能domain_quality(design_quality):调用GDAL自动生成的域函数,返回编码对应的文本-lco参数:优化PostgreSQL导入的性能和精度设置
方案3:用ArcGIS官方工具同步域(需许可)
如果有ArcGIS Pro/Desktop许可,直接通过ArcGIS的导出工具可一键同步域信息:
- 在ArcGIS Pro中创建PostgreSQL数据库连接(需配置PostGIS)
- 右键GDB中的要素类,选择导出 > 要素类到要素类
- 目标位置选择已创建的PostgreSQL连接,在环境设置中勾选保留域和子类型
- 导出完成后,ArcGIS会自动将域的编码规则转换为PostgreSQL的检查约束,同时可通过ArcGIS直接识别域信息
大数量数据的性能优化提示
针对900万条记录的转库需求:
- 用ogr2ogr时,可通过
-where参数分批次导出,比如按范围字段拆分:-where "objectid < 1000000" - ArcGIS导出时,关闭验证选项,开启批量插入提升速度
- PostgreSQL端提前关闭自动提交(
BEGIN;),导入完成后再提交(COMMIT;)
内容的提问来源于stack exchange,提问作者Pragati Srivastava
相关产品推荐
相关产品推荐

