如何在PostgreSQL中用SQL批量插入几何或GIS空间数据?

大丽吖_8853

大丽吖_8853

2026-10-26

146人浏览

原创

完全可行,但必须配合st_geomfromtext()或st_point()等构造函数,不能将wkt当普通字符串插入geometry字段;需显式指定srid,推荐批量用copy+st_makepoint,插入后及时vacuum和analyze。

如何在postgresql中用sql批量插入几何或gis空间数据?

INSERT INTO ... VALUES 中直接写 WKT 字符串是否可行?

完全可行,但必须配合 ST_GeomFromText() 或 ST_Point() 等构造函数,不能把 WKT 当普通字符串插入 geometry 字段。PostgreSQL 的 geometry 列不接受裸文本,否则会报错:column "geom" is of type geometry but expression is of type text。

常见错误是这样写:

INSERT INTO places (name, geom) VALUES ('A', 'POINT(120.1 30.2)');

正确写法必须显式转换:

INSERT INTO places (name, geom) VALUES ('A', ST_GeomFromText('POINT(120.1 30.2)', 4326));
  • ST_GeomFromText() 第二个参数是 SRID,强烈建议显式指定(如 4326),否则默认为 0,后续空间查询可能失效
  • 若数据全是点且坐标规整,用 ST_Point(x, y) 更快、更安全(自动绑定 SRID):ST_Point(120.1, 30.2, 4326)
  • WKT 字符串里空格和括号必须严格,'POINT(120.1,30.2)'(逗号)会解析失败

大批量导入时,用 INSERT ... SELECT FROM VALUES 还是 COPY?

优先用 COPY,尤其当数据源是 CSV 或内存中已组织好的行集。单条 INSERT 插入万级几何对象可能慢 5–10 倍,因为每行都触发函数调用、SRID 检查和索引更新。

实操建议:

  • 把原始坐标整理成 CSV(例如 name,x,y),再用 COPY 导入临时表,最后一次性转 geometry:
    COPY temp_coords (name, x, y) FROM '/path/to/data.csv' WITH (FORMAT csv, HEADER true);<br>INSERT INTO places (name, geom)<br>SELECT name, ST_SetSRID(ST_MakePoint(x, y), 4326)<br>FROM temp_coords;
  • 如果只能走 SQL(比如从应用层拼语句),用 VALUES 批量 + ST_MakePoint 组合比 ST_GeomFromText 快:后者要解析字符串,前者直接数值计算
  • 避免在 VALUES 里混用不同 SRID,ST_SetSRID(ST_MakePoint(...), srid) 比多次调用 ST_GeomFromText(..., srid) 更轻量

批量插入后空间索引没生效?别忘了 VACUUM 和 ANALYZE

即使你执行了 CREATE INDEX ON places USING GIST (geom),刚插入大量数据后,查询仍可能走全表扫描——因为 PostgreSQL 的统计信息还没更新,优化器不知道新数据分布。

关键动作:

  • 插入完成后立即运行:VACUUM places(清理死元组,释放空间)
  • 紧接着运行:ANALYZE places(更新列统计,让查询计划器知道 geom 列有新数据)
  • 如果插入前已有空间索引,无需重建;但若中途禁用了索引(比如为提速临时 DROP INDEX),插入完必须 CREATE INDEX 回来
  • 用 EXPLAIN (ANALYZE, BUFFERS) 查看实际是否命中索引,别只看 EXPLAIN 的预估

从 GeoJSON 或其他格式转批量插入,绕不开 jsonb 和函数链

PostgreSQL 12+ 可直接解析 GeoJSON 字符串,但要注意嵌套层级和坐标顺序(GeoJSON 是 [lon, lat],WGS84 下对应 x, y)。

例如有一列存 GeoJSON Feature 对象的 jsonb,想批量抽点:

INSERT INTO places (name, geom)<br>SELECT <br>  data->>'name',<br>  ST_SetSRID(<br>    ST_MakePoint(<br>      (data->'geometry'->'coordinates')->>0, -- lon<br>      (data->'geometry'->'coordinates')->>1  -- lat<br>    ),<br>    4326<br>  )<br>FROM (SELECT '{"type":"Feature","properties":{"name":"B"},"geometry":{"type":"Point","coordinates":[120.1,30.2]}}'::jsonb AS data) AS t;
  • jsonb 路径提取用 -> 和 ->>,后者返回 text,适合喂给 ST_MakePoint
  • GeoJSON 的 coordinates 是数组,->>0 取第一个元素(字符串),需确保它可转 float,否则 ST_MakePoint 报错
  • 多点、线、面类型需先判断 data->'geometry'->>'type',再分支处理,不能硬写 ->'coordinates'

真正麻烦的是坐标系混杂或含 Z/M 值——这时候别硬撑,先用 Python 或 GDAL 预处理,再进库。SQL 不是万能解析器。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、\l、\c、\dt、\d table_name、\du、\i file_name、\e和\q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.10

233

5

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4629

19

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、\l、\c、\dt、\d table_name、\du、\i file_name、\e和\q等。更详细的postgresql常用命令,大家可以访问下面的文章。

2023.11.16

647

3

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有\l、\d、\d5、\di、\ds、\dv、\df、\dn、\db、\dg、\dp、\c、\pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

2023.11.20

1396

6

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

2026.02.12

480

19

PostgreSQL 性能优化与查询执行计划实战
PostgreSQL 性能优化与查询执行计划实战

本专题深入解析PostgreSQL性能优化核心,聚焦查询执行计划的实战应用。通过EXPLAIN命令精准定位瓶颈,结合索引策略、SQL改写与参数调优,系统提升查询效率。从执行计划解读到性能调优全流程,助你掌握数据库性能诊断与优化实战能力。

2026.05.08

150

10

PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践
PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践

本文详解如何利用Next.js(搭配Drizzle ORM)与Go后端构建高性能应用,充分发挥PG在JSONB非结构化存储与pgvector向量检索上的优势。从数据建模到Docker容器化部署,打造支持AI时代的“One Database”工程化解决方案。

2026.05.08

901

10

PostgreSQL高级特性、内核机制与现代数据架构
PostgreSQL高级特性、内核机制与现代数据架构

本专题从MVCC并发控制与WAL日志等内核机制出发,详解JSONB、PostGIS及pgvector等高级特性。探讨如何利用单一引擎支撑关系型、向量及图数据等现代数据架构需求,助您掌握构建高并发、智能化应用的核心技术。

2026.05.08

244

10

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2825

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习