第一次尝试使用qgis的python批量处理数据。
场景需求:业主给了一些农村污水管网数据,每个村一个.gdb文件,里面包含两个图层:管线数据(命名规则中包含PS_WSG_LINE)和管井数据(命名规则中包含PS_WSG_POINT)。
处理步骤如下:
1、插件-Python控制台,或者直接从工具栏上面找
2、
大体思路:循环遍历,如果是gdb文件则找到里面的具体图层,设置正确坐标系,导出geojson格式到新文件夹,导出的同时转换坐标系,具体代码如下:
inputCRS = QgsCoordinateReferenceSystem(4549) # 根据经验判断原始坐标系
outputCRS = QgsCoordinateReferenceSystem(4326) # 输出时的坐标系
#inputFolder = 'D:\\GIS数据库'
inputFolder = 'D:\\GIS数据库\\镇11个'
outputFolder = "C:\\Users\\Desktop\\新建文件夹\\"
# 处理文件夹
def dealGDBFolder(path):
for item in os.listdir(path):
#print(item)
file_name, file_extension = os.path.splitext(item)
# 如果是文件夹则递归执行
if(file_extension==''):
dealGDBFolder(os.path.join(path, item))
# 如果扩展名为gdb则执行下面的函数
elif(file_extension == '.gdb' or file_extension == '.GDB'):
file_full_name = os.path.join(path, item)
dealGDBFile(file_full_name, file_name)
# 处理gdb
def dealGDBFile(file_full_name, 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)
# 另存为geojson文件,并转换坐标系
QgsVectorFileWriter.writeAsVectorFormat(olayer, outputFolder+file_name+" "+layerName+".geojson", "utf-8", outputCRS,'GeoJson', 0)
# 加载到当前视图
#QgsProject.instance().addMapLayer(olayer)
dealGDBFolder(inputFolder)
print("处理完成")
每个图层导出到新文件夹中,然后进行后续处理。