基于shp2pgsql将shape文件导入到postgresql中
1. 概述
Shapefile是常用的空间数据文件格式,PostgreSQL数据库是常用的关系型数据库
PostGIS是一个PostgreSQL的空间数据库扩展 ,提供空间信息服务功能,更详细的信息可参考:
本文所写的PostgreSQL指包含PostGIS的空间数据库
ESRI Shapefile格式的矢量数据导入到PostgreSQL空间数据库,主要有五种方法:
- 使用ArcGIS将shp数据导入PostgreSQL
- 使用工具shp2pgsql将数据导入PostgreSQL
- 使用GDAL中的ogr2ogr将shp矢量数据导入PostgreSQL
- 使用QGIS将数据导入PostgreSQL
- SQL语句导入PostgreSQL
本文主要写的是使用工具shp2pgsql将数据导入PostgreSQL
使用ArcGIS导入可以参考:
使用ogr2ogr导入可以参考:
使用QGIS导入可以参考:
使用SQL语句导入可以参考:
2. 环境准备
笔者使用的PostgreSQL(包含PostGIS)使用docker安装,PostgreSQL版本号为14,PostGIS版本号为3.2.2,docker地址为:
shp2pgsql的来自于PostGIS工具包,版本号为3.2.2(即,PostGIS 3.2.2 bundle),下载地址为:
有关工具包详细的说明可以参考:
数据来源为PostGIS官方教程,包含一些纽约城市数据,格式为Shapefile,下载地址为:
有关数据的详细说明可以参考:
数据大致情况如下:
注意:
- 这份文件的EPSG为26918
3. GUI导入
PostGIS工具包里含有shp2pgsql的GUI版本,如下图所示:
运行shp2pgsql-gui,进行数据导入
创建一个数据库,笔者这里使用pgAdmin进行连接和创建数据库nyc
- 创建时勾选postgis模板
创建后可以看到已经安装了空间扩展:
设置数据库参数:
确保数据库连接成功,然后添加shp文件:
针对笔者这份文件,需要将SRID改为26918
注释:OGC标准中的参数SRID,也是指的空间参考系统的ID,与EPSG一致
完成后点击Import
开始导入,直至导入完成,可以使用QGIS进行连接查看(也可以使用数据库客户端):
4. 命令行导入
shp2pgsql工具的使用可以参考官方指导手册:
一个简单的导入示例:
$ shp2pgsql -c -D -s 4269 -i -I shaperoads.shp myschema.roadstable > roads.sql $ psql -d roadsdb -f roads.sql
可以参考:
笔者使用的psql是QGIS中带有的,位于QGIS安装目录的bin目录里
在psql中运行生成的sql主要有两者方式
- 使用psql登录,然后运行sql文件( 在psql里执行命令
\i <文件名>
来执行存储在外部文件中的 sql 语句) - 使用psql命令行参数来直接运行sql文件
有关psql命令参数的详细信息可以参考:
第一种方式,使用psql登录运行sql文件:
psql -d nyc -U postgres
输入密码以登录,然后执行sql文件:
\i E:/tmp/nyc_neighborhoods_cmd.sql
第二种方式,使用psql命令行参数来直接运行sql文件
需要先设置登录账户和密码的环境变量,笔者这里是cmd环境下(如果是shell下改为export
):
set PGUSER=postgres
set PGPASSWORD=postgres
然后使用命令行参数执行文件:
psql -d nyc -f E:/tmp/nyc_neighborhoods_cmd.sql
可以在QGIS中查看导入的结果:
5. 参考资料
[1]【开发者笔记】利用shp2pgsql将shape文件导入到postgresql中 - stagebo - 博客园 (cnblogs.com)
[3]基于PostGIS使用GeoServer发布数据量大的GPS轨迹路线图 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com)