pyqgis_dragonzoebai的博客-CSDN博客 升级后整理
例如在vscode当中添加qgis提供的python解释器,那么就可以使用qgis.core等库
批量处理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("处理完成")