
示例数据中国国界 省级行政区 GeoJSON本文全程用这套数据演示 链接夸克网盘分享 提取码Vysu 网盘失效请评论区留言我看到会补前置阅读先把环境装好这篇是纯实操流程不再重复讲安装。如果你还没装 PostgreSQL / PostGIS / QGIS先看这两篇保姆级教程跟着做一遍再回来PostgreSQL PostGIS pgRouting 安装PostgreSQL以及PostGIS和pgRouting插件安装保姆级教程2026年最新Windows版QGIS 安装与底图加载QGIS安装教程Windows版从下载安装到底图加载一篇讲透本文假设你已经跑通了本机 PostgreSQL 服务能启动、PostGIS 扩展能创建、QGIS 能加载 XYZ 底图。做时空数据、监测类项目的朋友应该都遇到过这种场景手里拿到一份 GeoJSON——可能是前端同事给的行政区边界、可能是无人机航测出的图斑、也可能是从 OSM 下载的路网——需要把它塞进 PostGIS 里做后续的空间查询、叠加分析或者瓦片服务发布。命令行党会直接用ogr2ogr或者shp2pgsql但如果数据本身坐标系不干净、字段类型要调整、几何还有自相交需要修一修纯命令行反而绕远。最省心的路径其实是 QGIS图形化连接数据库、拖拽加载数据、右键导出入库中间还能顺手做数据检查和坐标重投影。整个链路十几分钟就能跑通比翻文档拼 SQL 快得多。这篇把完整流程拆开写一遍重点是几个新手容易踩坑的地方——SRID 选错、中文字段乱码、几何类型混杂、索引没建——都一并说清楚。示例数据用开头网盘里的中国国界和省界 GeoJSON跟着做一遍就能复现。一、准备工作建库、启用扩展、看清数据1.1 新建一个专用的 GIS 数据库装完 PostgreSQL/PostGIS 之后默认只有postgres、template0、template1三个库别直接把业务数据塞postgres库里规范的做法是给 GIS 数据单开一个-- 用 postgres 超级用户执行 CREATE DATABASE test_learn; \c gis_demo CREATE EXTENSION IF NOT EXISTS postgis; -- 验证 SELECT PostGIS_Full_Version();正常会返回类似POSTGIS3.4.1 xxxxx [EXTENSION] PGSQL150的版本串。扩展必须在目标库里手动 CREATE很多新手以为装完 PostGIS 就全局可用结果 QGIS 连上库却建不了空间表卡在这里半天。如果打算用 pgAdmin 图形化操作也可以Databases → 右键 → Create → Database然后连上这个新库在 Query Tool 里跑上面的 CREATE EXTENSION。1.2 先看清 GeoJSON 长啥样把网盘里的国界和省界 GeoJSON 下载下来用 VSCode 或者在线 geojson.io 打开确认三件事顶层结构必须是FeatureCollection不能是单个Feature或Geometry。QGIS 也能读单 Feature但入库时容易只写一条记录坑得很隐蔽。几何类型是否统一省界数据一般是MultiPolygon因为一个省可能包含多个岛屿飞地国界可能是Polygon或MultiPolygon。混着来的话 PostGIS 会强制建成GEOMETRY通用类型后续查询效率差、也不能建针对性的空间索引。坐标系GeoJSON 规范RFC 7946默认要求 WGS84EPSG:4326但国内数据经常被人塞成 GCJ-02 火星坐标或者 CGCS2000肉眼看不出来导到底图上偏移几百米才发现。网盘里这两份数据是标准 WGS84直接可用你手上如果拿到别的数据得留个心眼第 3 节讲怎么处理。二、QGIS 连接 PostGIS 数据库打开 QGIS左侧 Browser 面板浏览器找到PostGIS节点右键 →新建连接。弹窗里几个关键字段字段值说明名称test_learn自己起QGIS 里显示的别名主机localhost远程库填 IP 或域名端口5432PostgreSQL 默认端口数据库test_learn上面 CREATE DATABASE 建的那个用户名postgres或者专门的 GIS 用户密码**勾选保存密码省得每次输关键的两个勾选项✅允许无密码保存配合项目文件切换时不用反复输密码。❌只列出拥有权限的图层新手建议取消勾选否则你自己刚导入的表可能因为权限过滤看不到还以为导入失败了。点测试连接弹窗显示连接成功就 OK。这时候 Browser 面板 PostGIS 下会展开你的连接能看到publicschema 里已有的空间表如果之前有的话以及spatial_ref_sys这张系统表。常见连接问题Q: 测试连接报 FATAL: password authentication failed检查pg_hba.confPostgreSQL data 目录下把本地连接方式从scram-sha-256改成md5或者临时改成trust测试改完记得重启 PostgreSQL 服务。生产环境别用 trust。Q: 报 connection refused十有八九是 PostgreSQL 服务没启动或者端口被占。Windows 服务里找postgresql-x64-15手动启动或者netstat -ano | findstr 5432看端口监听情况。Q: 远程库连不上本地能连默认 PostgreSQL 只监听 localhost需要改postgresql.conf里的listen_addresses *同时在pg_hba.conf加一条host all all 0.0.0.0/0 md5生产环境把 0.0.0.0/0 换成具体网段改完重启服务防火墙放行 5432。三、加载 GeoJSON 到 QGIS三种方式任选一种直接拖拽从资源管理器把 .geojson 文件拖到 QGIS 画布最省事。菜单加载Layer → Add Layer → Add Vector Layer数据源类型选文件浏览选中 GeoJSON。Browser 面板如果文件在 QGIS 已注册的目录里直接双击。把网盘里的国界和省界两份数据都加载进来配上底图看一眼中国轮廓清晰、各省分界连续说明数据本身没问题。加载成功后左侧 Layers 面板会出现图层名画布上显示矢量要素。这时候先别急着导出做两件检查工作3.1 检查坐标系右键图层 → 点击属性。看CRS那一行坐标系那一栏会显示 EPSG 编码。如果显示EPSG:4326 - WGS 84正常跳到下一步。如果显示EPSG:3857或者其他投影坐标系说明数据已经是投影过的需要判断入库用哪个 CRS。经验法则展示、瓦片服务、Web 端入 EPSG:3857Web Mercator或者 4326 都行看后端约定。面积/长度计算、缓冲区分析入投影坐标系比如国内用 CGCS2000 3-degree Gauss-Kruger 带EPSG:4513-4533 系列单位是米算出来才是真米。不确定就统一 4326PostGIS 里后续可以用ST_Transform现算。如果需要改坐标系右键图层 → 导出 → 要素另存为在 CRS 下拉里选目标坐标系导出成一个新的临时 GeoJSON 或者 Shapefile再把这个中间产物入库。也可以在导入 PostGIS 那一步直接指定目标 CRS下一节讲。踩坑提醒国内项目常见的偏移问题多数是 GeoJSON 存的是 GCJ-02 但声明成 WGS84QGIS 认不出来直接入 WGS84 底图会偏 100-500 米。这种情况得先用 coordtransform 之类的库做 GCJ-02 → WGS84 转换QGIS 本身没有内置这个转换因为它不是官方 EPSG 定义。3.2 检查几何有效性Processing ToolboxCtrlAltT 打开里搜Check Validity运行后会给出一份无效几何清单。常见的自相交、环方向错误可以用Fix Geometries工具一键修复输出一个新的临时图层用这个修复版去入库。国界和省界这类公开数据一般几何都很干净这步可以跳过但如果是从 CAD 转过来的、或者前端同事用 d3-geo 手撸出来的 GeoJSON最好过一遍。判断标准入库后跑ST_Intersects之类的分析报错GEOSIntersects: TopologyException八成就是几何无效回来补做。四、导出到 PostGIS两种方式对比方式一数据库管理器点击上方的工具栏中的数据库然后点击数据库管理器选择要导入的数据库然后点击导入图层或文件。下面是导入的选项说明点 OKQGIS 底部状态栏会显示进度。省界数据大约三十几条记录、几万个顶点几秒就导完国界数据顶点更多一些十几秒也够了。完成后 Browser 面板刷新能在 test_learn → public 下看到china_province和china_border两张新表双击就能加载回画布验证。方式二DB Manager 插件适合批量、需要写 SQL 前后处理菜单 Database → DB Manager左侧树展开 PostGIS → test_learn选中目标 schema上方工具栏点Import Layer/File图标。弹窗比 Export 简洁一些多了几个选项Source SRID / Target SRID可以显式指定做坐标系转换更可控。Create single-part geometries instead of multi-part同上。Replace all selected columns with strings所有属性字段强制转 text防止数值类型推断错误。DB Manager 还有个杀手锏是内置 SQL 窗口可以导入前先在源图层跑一段 SQL 做过滤SELECT * FROM china_province WHERE name LIKE %河南% AND ST_IsValid(geom)然后再导入。这种边导边筛的能力右键 Export 做不到。如果只想把某几个省单独入一张表做重点分析走这条路。两种方式怎么选单个图层、字段类型清晰、直接入库Export。多个图层批量、需要 SQL 预处理、需要精细控制 SRIDDB Manager。需要写入非 public schema 且 schema 尚未创建先在 DB Manager 或者 psql 里CREATE SCHEMA xxx;再回来导入Export 不能自动建 schema。五、验证与后续处理5.1 psql 里查一下-- 表结构 \d public.china_province -- 记录数 SELECT COUNT(*) FROM china_province; -- 几何类型和 SRID 确认 SELECT GeometryType(geom), ST_SRID(geom) FROM china_province LIMIT 1; -- 空间范围应该覆盖中国全域经度 73-135纬度 3-54 左右 SELECT ST_Extent(geom) FROM china_province; -- 索引情况 SELECT indexname, indexdef FROM pg_indexes WHERE tablename china_province; -- 抽样看几条属性 SELECT name, ST_Area(geom::geography)/1e6 AS area_km2 FROM china_province ORDER BY area_km2 DESC LIMIT 5;应该能看到geom geometry(MultiPolygon,4326)这样的字段类型索引里应该有一条gist (geom)。最后那条面积查询会返回新疆、西藏、内蒙古这几个大区能对上就说明数据、坐标系、投影都没问题。5.2 QGIS 里加载回来看看Browser 面板找到刚导入的表双击加载。如果画布上什么都不显示先点工具栏的Zoom Full放大镜图标大概率是视图没定位到数据范围。右键图层 → Properties → Source看 Features count 是否和 psql 查出来的记录数一致。再顺手做个直观验证把 QGIS 底图切到天地图或者 OSM看看 PostGIS 里的省界是不是完美贴合底图轮廓。有偏移的话就是坐标系问题回头查第三节。5.3 补建索引如果导入时漏了CREATE INDEX idx_china_province_geom ON china_province USING GIST (geom); -- 更新统计信息让查询规划器走对索引 ANALYZE china_province;省界这种规模的数据其实无所谓但如果你导的是百万级路网或者上亿点云建议再补一个-- 空间聚类让物理存储顺序和空间位置贴近范围查询提速明显 CLUSTER china_province USING idx_china_province_geom;CLUSTER 是一次性操作后续新增数据不会自动重排定期维护的话可以配 pg_cron 定时跑。六、常见坑与排查清单坑 1中文字段乱码现象psql 查出来name字段是???或者一串拉丁字母乱码比如河南省变成?ê??。原因GeoJSON 是 UTF-8但导入时 Encoding 选了 SystemWindows 下就是 GBK。修复Export 对话框 Encoding 明确选 UTF-8重新导一次。已经入库的可以ALTER TABLE china_province ALTER COLUMN name TYPE text USING convert_from(convert_to(name, GBK), UTF8);不过说实话重新导比转换靠谱。坑 2几何类型不匹配现象QGIS 加载入库表时报 WKB type MultiPolygon not supported by this layer。原因Export 时选了 Force single-part把 MultiPolygon 拆成了 Polygon但图层元数据还写着 Multi。修复删表重导或者 QGIS 里 Layer → Add Layer 时手动指定几何类型。坑 3SRID 0 或者 -1现象SELECT ST_SRID(geom)返回 0。原因GeoJSON 文件里没写 crs 字段QGIS 也没识别出来导入时 CRS 下拉框被留成未知。修复入库时明确选 EPSG:4326或者事后 UPDATEUPDATE china_province SET geom ST_SetSRID(geom, 4326);注意ST_SetSRID只改标签不做坐标变换如果原始坐标本来就是经纬度那没问题如果是投影坐标被误标成 4326得用ST_Transform重算。坑 4远程库导入极慢现象本机导几万条秒完远程库卡半小时。原因QGIS 是逐条 INSERT网络往返放大延迟。修复Export 对话框下方有个Use bulk insert或者切换到 DB Manager 用 COPY 模式速度能提一到两个数量级。或者干脆把 GeoJSON 传到服务器本地用ogr2ogr命令行导那是最快的。坑 5权限不足现象连得上库但导入时报permission denied for schema public。原因PostgreSQL 15 之后public schema 默认不再给普通用户 CREATE 权限。修复用超级用户执行GRANT CREATE, USAGE ON SCHEMA public TO gis_user; -- 或者更规范地建独立 schema CREATE SCHEMA gis_data AUTHORIZATION gis_user;七、写在最后用 QGIS 把 GeoJSON 塞进 PostGIS 这条路胜在可视化、可回溯、中间能改特别适合数据本身不太干净、需要边看边调的场景。等流程稳定了、数据结构固化了再切换到ogr2ogr或者 Python 脚本批处理也不迟。如果这篇文章对你有用点个赞、收藏一下评论区聊聊你入库时遇到的奇葩数据格式。