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;