如何将shape数据 导入到Postgresql数据库中(单个和批量)

一. 背景

很多时候我们需要将shape数据导入到Postgresql数据库,将数据db化。
本文主要讲解四种方式:
使用QGIS工具导入(单个)、通过POSTGIS工具导入(单个或少量)、使用postgresql2 命令工具导入(单个)、使用python脚本批量导入shape数据(批量)。

导入数据的前提:在postgreSQL中创建PostGIS空间扩展模块,在连接数据库后执行下列sql:

CREATE EXTENSION postgis;

二. 使用QGIS工具导入(单个)

前提:安装QGIS

1. 使用QGIS工具打开需要导入的shp文件

打开shp文件方式可以参考博文:如何将shape数据 导入到Postgresql数据库中(单个和批量)

2.连接PG数据库

在QGIS工具的左侧工具部分,选择【PostgreSQL】右键点击 【New Connection】
如何将shape数据 导入到Postgresql数据库中(单个和批量)_第1张图片
输入对应的数据库相关信息,包括账号、密码、端口、数据库名等信息。最后点击【确定】如无报错即可成功创建数据库连接。
如何将shape数据 导入到Postgresql数据库中(单个和批量)_第2张图片

3.使用Database导入数据

点击上方菜单栏【Database】的【DB Manager】
在这里插入图片描述
可以看到对应数据库PG连接
如何将shape数据 导入到Postgresql数据库中(单个和批量)_第3张图片
选择对应数据库后,点击按钮【Import Layer/File】
如何将shape数据 导入到Postgresql数据库中(单个和批量)_第4张图片
然后即可选择对应shape文件,最后点击【确定】按钮,即导入成功。
如何将shape数据 导入到Postgresql数据库中(单个和批量)_第5张图片

在数据库中即可看到对应shape数据的表数据。

三. 通过PostGIS工具导入(单个或少量)

1.打开 应用PostGIS Bundle 3

如何将shape数据 导入到Postgresql数据库中(单个和批量)_第6张图片

2.AddFile 添加shape文件

点击【AddFile】按钮,选择对应需要导入的shape文件,可以选择单个或者多个
如何将shape数据 导入到Postgresql数据库中(单个和批量)_第7张图片

3.开始导入【import】

选择shape文件后,点击【import】,即可导入对应文件dbf或者shp到数据库中
如何将shape数据 导入到Postgresql数据库中(单个和批量)_第8张图片

四. 使用postgresql2 命令工具导入(单个)

1.导入postgresql2基本命令

shp2pgsql [options] shapefile_table_name database_name | psql [connection_option] [database_name]

常用选项:
以下是一些常用的 shp2pgsql 选项:

-c:创建一个新表,如果表已经存在则先删除。
-a:追加数据到现有表中,如果表不存在则创建。
-I:在导入过程中创建空间索引。
-s :设置空间参考系统的 SRID。
-W “latin1”:指定字符集,用于导入 Shapefile 数据。这里的 “latin1” 是一个示例,您可能需要根据实际情况指定字符集。

2. 示例:

(1)创建新表并导入数据:

shp2pgsql -c -s 4326 /path/to/your/shapefile.shp your_table_name | psql -d your_database -U your_user

这将创建一个新表 your_table_name 并导入 Shapefile 数据到该表中。

(2)追加数据到现有表:

`shp2pgsql -a -s 4326 /path/to/your/shapefile.shp your_existing_table_name | psql -d your_database -U` your_user

这将把 Shapefile 数据追加到现有的 your_existing_table_name 表中。

(3)在导入过程中创建空间索引:

shp2pgsql -I -s 4326 /path/to/your/shapefile.shp your_table_name | psql -d your_database -U your_user

这将在导入数据的同时创建空间索引。

3. 注意点:

(1)在执行shp2pgsql 命令时,需要在对应shp2pgsql.exe目录使用cmd 命令进入执行。
(2)每次执行命令后,会输入对应数据库密码(如果需要不输入密码,可以通过.pgpass文件进行密码配置)

五. 使用python脚本批量导入shape数据(批量)

直接给出示例,下列示例可以实现【批量】将xxx文件夹下所有的shape文件,导入到数据库shapeData里面

import geopandas as gpd
from sqlalchemy import create_engine
from geoalchemy2 import Geometry,WKTElement
import os

# 设置 Shapefile 文件夹路径
shapefile_folder = "xxx"

# 遍历根文件夹下所有子文件夹
for subdir, dirs, files in os.walk(shapefile_folder):
    for file in files:
        # 检查文件扩展名是否为 .shp,可以根据实际情况修改
        if file.lower().endswith('.shp') :            
            # 构建完整的文件路径
            shp_path = os.path.join(subdir, file)
            print(shp_path)
            engine = create_engine('postgresql://userName:password@localhost:5432/shapeData')
            # userName:password对应代表你的用户名和密码,格式为用户名:密码
            # localhost:port 为对应地址和端口
            # shapeData:数据库名

            map_data = gpd.GeoDataFrame.from_file(shp_path)
            map_data['geometry'] = map_data['geometry'].apply(lambda x: WKTElement(x.wkt, 4326))
            # if_exists可以使用'replace'或者'append',分别代表替换和追加
            # road_shp_data为数据导入到的数据库表名
            map_data.to_sql("road_shp_data", engine, if_exists='append', index=False,
                            dtype={
                                'geometry': Geometry(geometry_type='LineString', srid=4326)}
                            )

六. 四种方式对比

(1)QGIS工具导入:

每次只支持单个,不推荐,且还需要安装QGIS软件,带来额外工具成本

(2)通过PostGIS工具导入(单个或少量):

每次支持单个或少量个数,但是数据在多个不同文件夹下时,不方便全部导入

(3)postgresql2 命令工具:

命令行运行简单,只支持单个,且每次需要密码,在导入少量shape数据时推荐

(4)python脚本批量导入:

支持批量,脚本代码灵活,可编辑性强,缺点是:需要稍微懂一点python脚本

你可能感兴趣的:(GIS,postgressql,shape,数据库,postgresql,GIS,QGIS,PostGIS,shape)