背景描述:
手中有一份全球范围土地利用矢量数据,按图幅分成不同的shp文件。想将这些数据都导入到postsql中,使用postgis一个个导很麻烦,最后使用python脚本批量导入了,由于是小白,所以摸索了两天,也积累了两个方案,特此记录一下。
方案一:
python脚本遍历文件夹中的所有shp,读取文件,导入同一表中,
import os
import geopandas as gpd
from sqlalchemy import create_engine
# 设置数据库连接信息
dbname = '数据库名'
user = '用户名'
password = '密码'
host = 'localhost' # 如果 PostgreSQL 不在本地,请更改为相应的主机名
port = '5432' # 默认 PostgreSQL 端口号
# 创建 PostgreSQL 连接引擎
engine = create_engine(f'postgresql://{user}:{password}@{host}:{port}/{dbname}')
# 指定包含多个 shp 文件的文件夹路径
shp_folder = r"shp存储路径"
# 遍历文件夹中的所有 shp 文件
for file_name in os.listdir(shp_folder):
if file_name.endswith('.shp'):
# 构造完整的文件路径
shp_path = os.path.join(shp_folder, file_name)
# 读取 shp 文件
gdf = gpd.read_file(shp_path)
# 将 GeoDataFrame 导入到 PostgreSQL,选择追加数据到表中
gdf.to_postgis(name='表名', con=engine, if_exists='append', index=False)
方案二:
将所有的shp文件导入到一个geopackage文件中,然后用OSGeo4W.bat将整个文件导入到数据库中。
1、shp转geopackge(使用qgis相关的库,需要更改一下编译器)
import os
import shutil
from PyQt5.QtCore import QVariant
from qgis._core import QgsVectorLayer, QgsCoordinateTransformContext, QgsFields, QgsWkbTypes, QgsFeatureSink, QgsField
from qgis.core import QgsVectorFileWriter, QgsCoordinateReferenceSystem
# 设置输入文件夹和输出GeoPackage文件路径
input_folder = r"shp数据存储路径"
output_gpkg = r"geopackage输出路径\output_data.gpkg"
# 创建QgsVectorFileWriter的参数
srs = QgsCoordinateReferenceSystem("EPSG:4326")
# 存储设置
options = QgsVectorFileWriter.SaveVectorOptions()
options.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteLayer
# 执行坐标转换的上下文信息
transformContext = QgsCoordinateTransformContext()
# 遍历输入文件夹中的shapefile并写入GeoPackage
for filename in os.listdir(input_folder):
if filename.endswith(".shp"):
shp_path = os.path.join(input_folder, filename)
layer_name = os.path.splitext(filename)[0]
layer = QgsVectorLayer(shp_path, layer_name, "ogr")
if not layer.isValid():
print("图层创建失败或无效!")
continue
# 将图层写入GeoPackage
# 设置图层名称
options.layerName = layer_name
error, newLayer, errorMsg, additionalMessage = QgsVectorFileWriter.writeAsVectorFormatV3(
layer,
output_gpkg,
transformContext=transformContext,
options=options
)
if error != QgsVectorFileWriter.NoError:
print("无法添加图层到 GeoPackage:", errorMsg)
else:
print("图层成功写入:", newLayer)
print("GeoPackage文件保存成功:", output_gpkg)
2、打开QGIS安装目录,启动"OSGeo4W.bat",输入语句
ogr2ogr -f "PostgreSQL" PG:"dbname=数据库名 user=用户名 password=密码" geopackage的存储路径\output_data.gpkg -nlt PROMOTE_TO_MULTI -lco GEOMETRY_NAME=geom -lco FID=gid -nln 表名
后记:
我在摸索数据批处理的道路,没啥计算机语言背景学起来还挺费劲,大家的学习路线是什么样的嘞?评论区可留言