将 Shp 导入 PostGIS 空间数据的五种方式(全)
前言
在地理信息系统(GIS)开发与空间数据处理中,将 Shapefile(Shp) 导入 PostGIS 空间数据库是常见且基础操作。无论是数据分析、地图可视化,还是空间计算,高效的数据迁移能力直接影响工作的流畅性。
本文将介绍五种方法实现 Shp 数据导入到 PostGIS 空间数据库,这几种方式各有其特点和优势,读者可根据需求自行尝试。
创建空间拓展
无论使用五种方式中任何一种,在进行数据导入之前,都需要先创建空间拓展。
安装完成PostgreSQL
数据库和PostGIS
插件之后,新建一个数据库进行测试,例子中我创建的数据库名称为geodata
。之后需要启用空间拓展,也就是在数据库查询中运行以下语句。只有成功创建空间拓展,才能存储和管理空间数据。对于一些应用来说,启用postgis
和postgis_topology
就已经足够了。
:::block-1
– pg 空间拓展
CREATE EXTENSION postgis;
– pg 拓扑工具
CREATE EXTENSION postgis_topology;
– pg 路由
CREATE EXTENSION pgrouting;
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION address_standardizer;
:::
成功创建空间拓展后,刷新数据库,可以看到在数据库中多了一个表spatial_ref_sys
,表结构内容如下,可以看出这是一个有关坐标系统定义的表。
1. PostGIS Bundle 导入 Shp 到 PostGIS 空间数据库
PostGIS Bundle提供了高效的工具,可将Shapefile (Shp)空间数据快速导入 PostgreSQL/PostGIS 空间数据库,支持几何对象、属性数据及空间参考的完整迁移。无论是单文件导入还是批量处理,均可通过命令行或图形化工具轻松完成。PostGIS Bundle for PostgreSQL 是一套专为 PostgreSQL 数据库设计的空间数据库扩展包,它显著增强了 PostgreSQL 在地理空间数据处理方面的能力。PostGIS 支持多种空间数据类型,并且具有强大的空间索引能力和丰富的空间函数,在空间数据处理和分析方面具有强劲的优势,是为空间数据库的首选。
详情请参考文章:PostGIS Bundle 导入 Shp 到 PostGIS 空间数据库
打开PostGIS Bundle
插件,点击View connection details
,填写数据库连接信息。用户名为postgres
,填写密码、主机地址、端口号以及创建用于导入Shp
的数据库,然后点击OK
。
:::block-1
- Username:postgres
- Password:your password
- Server Host:localhost
- Port:5432
- Database:geodata
:::
2. shp2pgsql 导入 Shp 到 PostGIS 空间数据库
shp2pgsql
是PostGIS
自带的命令行工具,用于将Shapefile
文件声称SQL
脚本导入到PostGIS
空间数据库。
详情请参考文章:shp2pgsql 导入 Shp 到 PostGIS 空间数据库
shp2pgsql
命令行工具与PostGIS
工具集成在一起,无需单独下载。该命令行工具可以在安装路径下的bin
目录中找到。
也可以打开shp2pgsql
图形界面工具,也就是上一节中的PostGIS Bundle for PostgreSQL来导入Shp数据。
(1)直接导入到数据库:
:::block-1
shp2pgsql -s 4326 -I -W “UTF-8” C:\Users\hasee\Desktop\conutries\countries.shp public.countries | psql -U postgres -d geodata
:::
其中postgres
数据库用户名,geodata
为数据库名称。
(2)通过SQL导入数据库:
:::block-1
shp2pgsql -s 4326 -I -W “UTF-8” C:\Users\hasee\Desktop\conutries\countries.shp public.countriesSQL>C:\Users\hasee\Desktop\conutries\countries.sql
:::
3. ogr2ogr 导入 Shp 到PostGIS空间数据库
ogr2ogr
属于GDAL
库的一部分,是一款功能强大的开源命令行工具,主要用于处理和转换地理空间数据。它支持多种矢量数据格式转换,包括 ESRI Shapefile、GeoJSON、KML、GML、PostgreSQL/PostGIS、GeoPackage 等,是地理信息系统 (GIS) 数据处理的必备工具。
详情请参考文章:ogr2ogr 导入 Shp 到PostGIS空间数据库
ogr2ogr
可以作为包含在QGIS
中的一部分进行下载:https://qgis.org/download
也可以直接下载OSGeo4W
,然后在OSGeo4W Shell
命令行执行导入语句。在
OSGeo4W Shell
命令行执行以下语句可将Shp
数据导入到PostGIS
目标数据库。
:::block-1
ogr2ogr -f PostgreSQL PG:“dbname=geodata host=127.0.0.1 user=postgres port=5432 password=123456” C:\Users\hasee\Desktop\region\province.shp -nln province -nlt MULTIPOLYGON -lco GEOMETRY_NAME=geom -lco FID=gid -lco SPATIAL_INDEX=GIST
:::
ogr2ogr
可执行文件名称。根据需要设置,可以将可执行文件添加到PATH
中,也可以使用可执行文件的完整路径。
-nln
nln
选项表示新图层名称"new layer name"
,即在目标数据库中要创建的表名。
-nlt
nlt
选项表示新图层类型"new layer type"
。特别是对于Shapfile
文件的输入,新的图层类型通常是"multi-part geometry"
,因此需要提前告知系统使用"MultiPolygon"
而不是"Polygon"
作为几何体类型。
-lco
lco
选项表示图层创建选项"layer create option"
。不同的驱动程序有不同的创建选项,这里显示PostgreSQL
驱动程序选项。
:::block-1
- GEOMETRY_NAME:设置几何图形列的列名。为了与数据库中几何字段标准名称相对应,可以使用
"geom"
- **FID:**设置主键列名。为了与数据库准名称相对应,可以使用
"gid"
- **PRECISION:**控制数字字段在数据库中的表示方式。加载
Shapefile
文件时的默认值是使用数据库"数字"类型,这比"整数"和"双精度"等简单数字类型更精确,但有时更难使用。使用"NO"来关闭"数字"类型。
:::
4. QGIS DB Manager 导入 Shp 到 PostGIS 空间数据库
QGIS DB Manager 属于 QGIS 的数据库管理工具,允许用户直接连接、管理和操作多种类型的空间数据库, 包括 PostgreSQL/PostGIS、SpatiaLite、Oracle。利用此工具可以方便的导入导出空间数据,并且具备空间可视化能力。
详情请参考文章:QGIS DB Manager 导入 Shp 到 PostGIS 空间数据库
(1)下载QGISQGIS
下载地址:https://qgis.org/download
QGIS DB Manager
属于QGIS
的数据库管理工具,它集成在QGIS
软件包中,无需单独下载。
在使用QGIS DB Manager
前,请确保已经安装完成PostGIS
空间插件,并且为目标数据库创建空间拓展。
(2)连接数据库如下图填写数据库连接信息:
Name:自定义名称,如下可以是数据库名称Service:服务实例名称,可选参数Host:主机地址Port:端口号Database:数据库名称
5. GeoTools 将 Shp 导入PostGIS 空间数据库
GeoTools 在空间数据转换处理方面具有强大的能力,能够高效、简洁的操纵 Shp 数据。特别是与空间数据库PostGIS 相结合,更能展示出其空间数据处理的优势,借助 GeoTools,我们可以实现 Shp 数据高效入库。
(1)环境搭建在进行GeoTools
开发前,需要先完成一些准备工作。俗话说,工欲善其事,必先利其器,只有将前期工作做好了,才能更好的推进往后的开发工作。
以下是环境搭建的一些软件工具,包括JDK
、Maven
以及IDE
:::block-1
JDK
:当前例子中使用的JDK
版本为11,需要先行下载,并设置好环境变量。Maven
:当前例子中使用的Maven
版本是3.6.3
,需要先行下载,并配置好仓库地址。IDE
:当前例子中使用的IDE
是IDEA 2020.3
,需要先行下载,并进行项目配置。GeoTools
:当前例子中使用的版本是34-SNAPSHOT
:::
(2)下载依赖在以前依赖的基础上,需要下载以下两个包。对于其他依赖,请参考之前的文章。
<!-- postgis-jdbc -->
<dependency><groupId>org.geotools.jdbc</groupId><artifactId>gt-jdbc-postgis</artifactId> <version>${geotools.version}</version>
</dependency>
<!-- PostgreSQL 驱动 -->
<dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.7.3</version>
</dependency>
(3)·········
详情请参考文章:GeoTools 将 Shp 导入PostGIS 空间数据库
OpenLayers示例数据下载,请回复关键字:ol数据
全国信息化工程师-GIS 应用水平考试资料,请回复关键字:GIS考试
【GIS之路】 已经接入了智能助手,欢迎关注,欢迎提问。
欢迎访问我的博客网站-长谈GIS:
http://shanhaitalk.com
都看到这了,不要忘记点赞、收藏 + 关注 哦 !
本号不定时更新有关 GIS开发 相关内容,欢迎关注 !