在外部编译器中使用pyqgis

该文章介绍了一种方法,通过在VSCode或PyCharm中配置QGIS的Python解释器,利用QGIS的库进行批量处理GDB文件夹。它首先设置输入和输出坐标系,然后遍历GDB文件夹,对每个GDB文件添加新字段并转换为4326坐标系,最后导出为GeoJSON格式。过程中还涉及到目录检查、文件操作以及图层的坐标系设置。
摘要由CSDN通过智能技术生成

pyqgis_dragonzoebai的博客-CSDN博客 升级后整理

例如在vscode当中添加qgis提供的python解释器,那么就可以使用qgis.core等库

例如在PyCharm的File-Settings-Project设置qgis提供的python解释器,那么就可以使用qgis.core等库

 然后就可以使用qgis的“使用外部编辑器打开”按钮了。

以下代码的思路为:

批量处理gdb文件夹,导出对应文件夹目录的geojson文件。

我的gdb文件均没有坐标系,因此需要自己设置正确的坐标系,导出时为4326坐标系。

处理的时候新增了一个字段,并将文件名写入到该字段中。

from qgis.core import *
from qgis.PyQt.QtCore import QVariant
import os

inputCRS = QgsCoordinateReferenceSystem('EPSG:4549')  # 根据经验判断原始坐标系
outputCRS = QgsCoordinateReferenceSystem('EPSG:4326')  # 输出时的坐标系

inputFolder = r'D:\项目\GIS数据库'
outputFolder = r"D:\项目\处理1"

# 处理文件夹
def dealGDBFolder(inputFolder,outputFolder):
    # 检查输入文件夹,如果不存在则返回
    if not os.path.exists(inputFolder):
        print("检查输入文件夹不存在!!!")
        return

    # 检查输出文件夹,如果不存在则创建
    if not os.path.exists(outputFolder):
        print("检查输出文件夹不存在!!!即将创建")
        # os.mkdir(outputFolder) # 创建单层文件夹
        os.makedirs(outputFolder) # 创建多层文件夹

    # 检查输出文件夹子文件夹,如果不存在则创建
    fileName = os.path.split(os.path.realpath(inputFolder))[1]
    outputFolderResult = os.path.join(outputFolder, fileName)
    # print(outputFolderResult)
    if not os.path.exists(outputFolderResult):
        os.mkdir(outputFolderResult)


    for item in os.listdir(inputFolder):
        print(item)
        file_name, file_extension = os.path.splitext(item)
        # 如果是文件夹则递归执行
        if (file_extension == ''):
            dealGDBFolder(os.path.join(inputFolder, item),outputFolder)
            # 如果扩展名为gdb则执行下面的函数
        elif (file_extension.lower() == '.gdb'):
            file_full_name = os.path.join(inputFolder, item)
            dealGDBFile(file_full_name, outputFolderResult, file_name)


# 处理gdb文件
def dealGDBFile(file_full_name, outputFolderResult, file_name):
    # 加载gdb
    gdbLayer = QgsVectorLayer(file_full_name, file_name)
    # 获取里面的子图层
    subLayers = gdbLayer.dataProvider().subLayers()
    for subLayer in subLayers:
        parts = subLayer.split('!!::!!')
        print(file_name + ";" + parts[1] + ";" + parts[2])
        layerName = parts[1]
        lpath = r"{}|layername={}".format(file_full_name, layerName)
        # 原始矢量图层没有坐标系则添加正确的坐标系
        olayer = QgsVectorLayer(lpath, file_name + " " + layerName, "ogr")
        olayer.setCrs(inputCRS)
        # 新增字段
        fdAdd1 = QgsField("layer_name", QVariant.String, comment='图层名')
        olayer.addExpressionField("'" + file_name + "'", fdAdd1)
        olayer.updateFields()
        # 另存为geojson文件,并转换坐标系
        QgsVectorFileWriter.writeAsVectorFormat(olayer, outputFolderResult +"\\" + file_name + " " + layerName + ".geojson", "utf-8", outputCRS, 'GeoJson', 0)
        # 加载到当前视图
        # QgsProject.instance().addMapLayer(olayer)


dealGDBFolder(inputFolder,outputFolder)
print("处理完成")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值