基于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)
[4]PostGIS教程二:PostGIS安装和创建空间数据库 - 知乎 (zhihu.com)
[5]5. Loading spatial data — Introduction to PostGIS
基于shp2pgsql将shape文件导入到postgresql中的更多相关文章
- 【开发者笔记】利用shp2pgsql将shape文件导入到postgresql中
导入shp文件到postgresql中 1.首先,你需要让shp2pgsql命令可用,百度下载,加入环境变量即可. 下载地址:https://download.osgeo.org/postgis/wi ...
- kettle使用文件导入到Postgresql出现如下几种问题的总结
1.kettle使用文件导入到Postgresql出现如下几种问题的总结: kettle使用文件导入到Postgresql出现如下几种问题的总结: .第一种错误,报错如ERROR: extra dat ...
- 怎么把centos虚拟机zip文件导入vm虚拟机中
执行以上三步就可以将一个压缩的centoszip文件导入到虚拟机中
- docker中,如何将镜像保存为tar文件或者将镜像保存为文件,将tar文件导入到docker中
需求说明: 在实际使用docker的过程中,比如某些机器不能上网,恰巧需要某些docker镜像,一般可以采用在能上网的机器上,pull下来基础镜像,然后将docker 镜像保存为文件,在不能上网的机器 ...
- Sqoop 将hdfs上的文件导入到oracle中,关于date类型的问题
近期的项目中,需要将hadoop运行完成的结果(存在于hdfs上)导入到oracle中,但是在用sqoop导入hdfs中的日期字段'2016-03-01'时,sqoop报错,说date类型必须为'yy ...
- 将CSV格式的文件导入到数据中
--创建表 create table t1( id number primary key, name ), score number, subject ) ) --创建控制文件 t1.ctl,以文本的 ...
- 将本地sql文件导入到mysql中
cmd命令操作:先创建一个同名数据库,然后通过source导入sql文件 1.启动mysql 2.mysql -uroot -p 输入密码运行mysql 3.创建一个同名数据库 create data ...
- 关于Excel文件导入到Sqlserver2008中出现截断错误的解决办法
出现错误的可能原因: 1.数据库字段Varchar长度不够: 2.不能用Text类型: 3.数据中可能存在换行符: 4.数据项文本过长,超过4000: 5.前8行的最大长度不够大,后面有超过的. 解决 ...
- CSV文件导入到数据库中读取数据详解(接着上个帖子)
一.controller层 二.SERVICE层 @Overridepublic Result importJinjiangAssessResult(MultipartFile file) throw ...
- SQL Server:把CSV文件导入到SQL Server表中
有时候我们可能会把CSV中的数据导入到某个数据库的表中,比如做报表分析的时候. 对于这个问题,我想一点也难不倒程序人员吧!但是要是SQL Server能够完成这个任务,岂不是更好! 对,SQL Ser ...
随机推荐
- 一图看懂Hadoop中的MapReduce与Spark的区别:从单机数据系统到分布式数据系统经历了哪些?
今日博主思考了一个问题:Hadoop中的MapReduce与Spark他们之间到底有什么关系? 直到我看到了下面这张图 废话不多说先上图 我们知道,单机数据系统,在本地主机上针对数据有单机本地存储操作 ...
- Qt网络编程-书接上文,浅谈TCP文件收发,以及心跳包
qt网络编程-书接上文,浅谈文件收发 上文Qt网络编程-从0到多线程编程中谈到 在qt中的qtcpsocket通讯的用法,接下来浅谈一下关于tcp通讯的实际应用,当然了由于是浅谈,也不能保证其功能的完 ...
- 盘点现在用的SqlServer 5种分页方式和拉姆达表达式分页,进来看看吧。
现在基本上大家都在使用各种轮子自带的分页,大家是否还记得sql分页怎么写? 今天我们就来盘一盘怎么写和用哪种方式写. 欢迎大家评论区讨论. 1.ROW_NUMBER() OVER()方式(SQL201 ...
- python 之集合(set)
集合是一个无序的,不允许重复的元素列表,根据这个特性,可以利用集合对列表进行去重操作 集合创建 # 集合中不能含list.dict set2 = {"rice", 1, (True ...
- 【转载】SQL Server FileStream 体验
FileStream是SQL Server 2008提供的新特性,之前附件在SQL的存储一种是直接放数据库,一种是存储一个路径,附件单独放在磁盘上.前一种方法会使数据库空间更快变大,而且读写占用较多数 ...
- 发布了一个jar包到中央仓库,我的心好累…
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. 前几天我在网上冲浪的时候,看见有一个老铁在git上给我提了一个issue: 万万没想到,有一天我写的烂代码居然也 ...
- Java集合 - ConcurrentHashMap
介绍 ConcurrentHashMap 技术是为了解决问题而生的,ConcurrentHashMap 解决了多个线程同时操作一个 HashMap 时,可能出现的内部问题.当多个线程同时操作一个 Ha ...
- (16)go-micro微服务jaeger链路追踪
目录 一 jaeger链路追踪介绍 什么是链路追踪: 链路追踪主要功能: 二 jaeger链路追踪作用 三 jaeger链路追踪主要特性 四 jaeger链路追踪原理图 1.链路调用原理 2. 一次调 ...
- DVWA靶场实战(九)——Weak Session IDS
DVWA靶场实战(九) 九.Weak Session IDS: 1.漏洞原理: Weak Session IDS也叫做弱会话,当用户登录后,在服务器就会创造一个会话(session),叫做会话控制,接 ...
- 關於scanf()的使用
要使用scanf函數進行輸入: 1.如果用scanf()要輸入讀取基本變量的值,需要加&. 2.如果用scanf()讀取的是把字符串讀入字符數組中,則不需要加& 1 #include& ...