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)

[2]About PostGIS | PostGIS

[3]基于PostGIS使用GeoServer发布数据量大的GPS轨迹路线图 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com)

[4]PostGIS教程二:PostGIS安装和创建空间数据库 - 知乎 (zhihu.com)

[5]5. Loading spatial data — Introduction to PostGIS

基于shp2pgsql将shape文件导入到postgresql中的更多相关文章

  1. 【开发者笔记】利用shp2pgsql将shape文件导入到postgresql中

    导入shp文件到postgresql中 1.首先,你需要让shp2pgsql命令可用,百度下载,加入环境变量即可. 下载地址:https://download.osgeo.org/postgis/wi ...

  2. kettle使用文件导入到Postgresql出现如下几种问题的总结

    1.kettle使用文件导入到Postgresql出现如下几种问题的总结: kettle使用文件导入到Postgresql出现如下几种问题的总结: .第一种错误,报错如ERROR: extra dat ...

  3. 怎么把centos虚拟机zip文件导入vm虚拟机中

    执行以上三步就可以将一个压缩的centoszip文件导入到虚拟机中

  4. docker中,如何将镜像保存为tar文件或者将镜像保存为文件,将tar文件导入到docker中

    需求说明: 在实际使用docker的过程中,比如某些机器不能上网,恰巧需要某些docker镜像,一般可以采用在能上网的机器上,pull下来基础镜像,然后将docker 镜像保存为文件,在不能上网的机器 ...

  5. Sqoop 将hdfs上的文件导入到oracle中,关于date类型的问题

    近期的项目中,需要将hadoop运行完成的结果(存在于hdfs上)导入到oracle中,但是在用sqoop导入hdfs中的日期字段'2016-03-01'时,sqoop报错,说date类型必须为'yy ...

  6. 将CSV格式的文件导入到数据中

    --创建表 create table t1( id number primary key, name ), score number, subject ) ) --创建控制文件 t1.ctl,以文本的 ...

  7. 将本地sql文件导入到mysql中

    cmd命令操作:先创建一个同名数据库,然后通过source导入sql文件 1.启动mysql 2.mysql -uroot -p 输入密码运行mysql 3.创建一个同名数据库 create data ...

  8. 关于Excel文件导入到Sqlserver2008中出现截断错误的解决办法

    出现错误的可能原因: 1.数据库字段Varchar长度不够: 2.不能用Text类型: 3.数据中可能存在换行符: 4.数据项文本过长,超过4000: 5.前8行的最大长度不够大,后面有超过的. 解决 ...

  9. CSV文件导入到数据库中读取数据详解(接着上个帖子)

    一.controller层 二.SERVICE层 @Overridepublic Result importJinjiangAssessResult(MultipartFile file) throw ...

  10. SQL Server:把CSV文件导入到SQL Server表中

    有时候我们可能会把CSV中的数据导入到某个数据库的表中,比如做报表分析的时候. 对于这个问题,我想一点也难不倒程序人员吧!但是要是SQL Server能够完成这个任务,岂不是更好! 对,SQL Ser ...

随机推荐

  1. http 缓存 笔记

    http 缓存,有时候静态资源没更新的情况下,不需要每次都去服务器获取,减少资源的请求. Http 报文中与缓存相关的首部字段 1. 通用首部字段(就是请求报文和响应报文都能用上的字段) 2. 请求首 ...

  2. C++面向对象程序设计期末复习笔记[吉林大学](结合历年题速成85)

    1.头文件 头文件的作用就是被其他的.cpp包含进去的.它们本身并不参与编译,但实际上,它们的内容却在多个.cpp文件中得到了编译.根据"定义只能一次"原则我们知道,头文件中不能放 ...

  3. 静态文件配置 django连接MySQL django模型层初识 ORM基本语句

    目录 静态文件配置 1. 问题描述 2. 静态文件 3. 资源访问 form表单属性补充 action method 请求方法 get请求 post请求 views层 request对象 reques ...

  4. 如何5分钟上手使用PaddleSeg人像抠图

    随便打开一个Microsoft Visual Studio,新建一个WinForms项目,从下面列表中随便选择一个NET框架. net35;net40;net45;net451;net452;net4 ...

  5. 网络编程 UDP套接字

    第十二章 UDP套接字 12.1 前言 上一章讲述了TCP通信方式,它是基于流的面向连接的网络通信.UDP是IP协议上的另一种传输协议. TCP和UDP都是端到端的通信协议,都处于TCP/IP网络模型 ...

  6. vscode下无法使用fresh的问题

    使用了go get github.com/pilu/fresh ,需要 go install github.com/pilu/fresh. 在带用go.mod的版本中,go get只是下载代码和帮助修 ...

  7. JDBC的一些基础认识,写的不是特别完善,希望大家看的时候别太介意嘿嘿嘿

    JDBC 1,概念和本质 Java DataBase Connectivity Java 数据库链接, Java语言操作数据库 JDBC的本质:是一套操作所有关系型数据库的规则(接口)而JDBC所有的 ...

  8. Triple 协议支持 Java 异常回传的设计与实现

    作者:Apache Dubbo Contributor 陈景明 背景 在一些业务场景, 往往需要自定义异常来满足特定的业务, 主流用法是在catch里抛出异常, 例如: public void dea ...

  9. ArcGIS工具 - 批量删除空图层

    为了减少数据的冗余,我们经常需将数据库中的空图层(没有任何记录的要素类或表)删除,删除数据本来是一个很简单的操作,但如果数据量大,则需通过程序来处理.例如,删除成百上千个标准分幅DLG数据库中等高线数 ...

  10. AspNetCore底层源码剖析(三)IOC

    title: AspNetCore底层源码剖析(三)IOC date: 2022-09-21 13:20:01 categories: 后端 tags: - .NET 介绍 每个 ASP.NET Co ...