ChinaGeoJson 导入 PostgreSQL / PostGIS 说明文档

本文档记录了../../../ChinaGeoJson项目中的行政区划 GeoJSON 数据以及元数据字典导入到 PostgreSQL 数据库的结构规范、对应关系与维护脚本。


一、数据库连接信息

  • Host: localhost
  • Port: 5432
  • Database: osmchina
  • User: eric
  • Extension: postgis

二、数据源与数据表对应关系

数据库表名 对应文件 / 目录 记录数 几何字段类型 说明
map_china china.json 1 MultiPolygon (EPSG:4326) 全国总轮廓边界
map_province province/*.json (34 文件) 476 MultiPolygon (EPSG:4326) 各省级行政区下辖市级边界
map_citys citys/*.json (419 文件) 2,818 MultiPolygon (EPSG:4326) 各地级市下辖区县级边界
map_county county/*.json (2,784 文件) 2,784 MultiPolygon (EPSG:4326) 各区县精细要素边界
map_info info.json 3,238 Point (EPSG:4326) 全国行政区划层级树与中心点字典表

三、数据表结构设计

1. 边界要素表(map_china, map_province, map_citys, map_county)

四张边界图层统一采用规范化 PostGIS 结构:

CREATE TABLE <table_name> (
    id SERIAL PRIMARY KEY,
    adcode INTEGER NOT NULL,                       -- 行政区划编码
    name VARCHAR(100) NOT NULL,                    -- 行政区名称
    level VARCHAR(50),                             -- 行政级别 (country / province / city / district)
    parent_adcode INTEGER,                         -- 上级行政区编码
    children_num INTEGER,                          -- 下级数量
    sub_feature_index INTEGER,                     -- 子要素索引号
    acroutes INTEGER[],                            -- 归属层级数组 (例如 [100000, 130000, 130100])
    center GEOMETRY(Point, 4326),                  -- 显示中心点坐标 (EPSG:4326)
    centroid GEOMETRY(Point, 4326),                -- 几何质心点坐标 (EPSG:4326)
    properties JSONB,                              -- 原始 properties 扩展属性
    geom GEOMETRY(MultiPolygon, 4326)              -- 统一多边形几何边界 (EPSG:4326)
);

-- 索引
CREATE INDEX idx_<table_name>_geom ON <table_name> USING GIST (geom);
CREATE INDEX idx_<table_name>_center ON <table_name> USING GIST (center);
CREATE INDEX idx_<table_name>_centroid ON <table_name> USING GIST (centroid);
CREATE INDEX idx_<table_name>_adcode ON <table_name> (adcode);
CREATE INDEX idx_<table_name>_parent_adcode ON <table_name> (parent_adcode);

2. 区划字典与拓扑树表(map_info)

对应 info.json,提供全国层级树检索和中心点查询:

CREATE TABLE map_info (
    adcode INTEGER PRIMARY KEY,                    -- 行政区划代码 (主键)
    name VARCHAR(100) NOT NULL,                    -- 行政区名称
    level VARCHAR(50),                             -- 行政级别 (country / province / city / district)
    parent_adcode INTEGER,                         -- 上级行政区编码
    children_num INTEGER,                          -- 下级数量
    acroutes INTEGER[],                            -- 归属层级数组
    center GEOMETRY(Point, 4326),                  -- 中心点坐标 (EPSG:4326)
    centroid GEOMETRY(Point, 4326),                -- 质心点坐标 (EPSG:4326)
    children JSONB,                                -- 下级节点简略结构列表
    raw_data JSONB                                 -- 原始完整 JSON 字典
);

-- 索引
CREATE INDEX idx_map_info_level ON map_info (level);
CREATE INDEX idx_map_info_parent ON map_info (parent_adcode);
CREATE INDEX idx_map_info_center ON map_info USING GIST (center);
CREATE INDEX idx_map_info_centroid ON map_info USING GIST (centroid);

四、执行导入与脚本维护

项目根目录下提供了全量自动化导入脚本 import_all_to_pg.py。

运行环境要求

  • Python 3
  • psycopg2 驱动模块
  • 本地运行的 PostgreSQL / PostGIS 实例

执行命令

python3 /home/eric/00works/ChinaGeoJson/import_all_to_pg.py

该脚本具备事务保护,支持幂等执行(自动 DROP TABLE IF EXISTS 重建表并批量导入)。


五、常用查询示例

1. 查询河北省(130000)下辖所有地级市

SELECT adcode, name, level, ST_AsText(center) 
FROM map_province 
WHERE parent_adcode = 130000;

2. 空间相交查询(如查找包含指定经纬度点的区县)

SELECT adcode, name, level 
FROM map_county 
WHERE ST_Contains(geom, ST_SetSRID(ST_Point(116.4074, 39.9042), 4326));

3. 获取各层级要素数量

SELECT 'map_china' AS tbl, count(*) FROM map_china
UNION ALL SELECT 'map_province', count(*) FROM map_province
UNION ALL SELECT 'map_citys', count(*) FROM map_citys
UNION ALL SELECT 'map_county', count(*) FROM map_county
UNION ALL SELECT 'map_info', count(*) FROM map_info;