很多时候我们需要将shape数据导入到Postgresql数据库,将数据db化。
本文主要讲解四种方式:
使用QGIS工具导入(单个)、通过POSTGIS工具导入(单个或少量)、使用postgresql2 命令工具导入(单个)、使用python脚本批量导入shape数据(批量)。
导入数据的前提:在postgreSQL中创建PostGIS空间扩展模块,在连接数据库后执行下列sql:
CREATE EXTENSION postgis;
前提:安装QGIS
打开shp文件方式可以参考博文:如何将shape数据 导入到Postgresql数据库中(单个和批量)
在QGIS工具的左侧工具部分,选择【PostgreSQL】右键点击 【New Connection】
输入对应的数据库相关信息,包括账号、密码、端口、数据库名等信息。最后点击【确定】如无报错即可成功创建数据库连接。
点击上方菜单栏【Database】的【DB Manager】
可以看到对应数据库PG连接
选择对应数据库后,点击按钮【Import Layer/File】
然后即可选择对应shape文件,最后点击【确定】按钮,即导入成功。
在数据库中即可看到对应shape数据的表数据。
点击【AddFile】按钮,选择对应需要导入的shape文件,可以选择单个或者多个
选择shape文件后,点击【import】,即可导入对应文件dbf或者shp到数据库中
shp2pgsql [options] shapefile_table_name database_name | psql [connection_option] [database_name]
常用选项:
以下是一些常用的 shp2pgsql 选项:
-c:创建一个新表,如果表已经存在则先删除。
-a:追加数据到现有表中,如果表不存在则创建。
-I:在导入过程中创建空间索引。
-s :设置空间参考系统的 SRID。
-W “latin1”:指定字符集,用于导入 Shapefile 数据。这里的 “latin1” 是一个示例,您可能需要根据实际情况指定字符集。
(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
这将在导入数据的同时创建空间索引。
(1)在执行shp2pgsql 命令时,需要在对应shp2pgsql.exe目录使用cmd 命令进入执行。
(2)每次执行命令后,会输入对应数据库密码(如果需要不输入密码,可以通过.pgpass文件进行密码配置)
直接给出示例,下列示例可以实现【批量】将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)}
)
每次只支持单个,不推荐,且还需要安装QGIS软件,带来额外工具成本
每次支持单个或少量个数,但是数据在多个不同文件夹下时,不方便全部导入
命令行运行简单,只支持单个,且每次需要密码,在导入少量shape数据时推荐
支持批量,脚本代码灵活,可编辑性强,缺点是:需要稍微懂一点python脚本