矢量数据导入postSQL

背景描述:

手中有一份全球范围土地利用矢量数据,按图幅分成不同的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 表名

后记:

我在摸索数据批处理的道路,没啥计算机语言背景学起来还挺费劲,大家的学习路线是什么样的嘞?评论区可留言

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值