随着人工智能技术的飞速发展,编程语言和脚本开发正变得前所未有的便捷。在GIS领域,QGIS作为一款卓越的开源地理信息系统软件,凭借其易于下载、界面简洁、功能强大等诸多优势,赢得了全球用户的青睐。更令人兴奋的是,QGIS深度集成了Python作为其脚本语言,这为GIS专业人士和爱好者提供了高效提升工作效率的强大工具。
本文将带您深入了解QGIS及其Python脚本开发,并通过实际案例展示其强大功能。
1. QGIS 简介
QGIS(Quantum GIS)是一款免费且开源的桌面地理信息系统软件,它允许用户创建、编辑、可视化、分析和发布地理空间信息。QGIS的强大之处在于其活跃的社区支持、丰富的插件生态系统以及对多种数据格式的广泛兼容性。无论您是GIS初学者还是经验丰富的专家,QGIS都能满足您在地图制作、空间分析和数据管理方面的需求。
2. 在QGIS中启用Python编辑器
在QGIS中使用Python进行开发非常便捷。QGIS自带了一个内置的Python编辑器,当然您也可以选择在第三方IDE中进行开发。为了方便起见,这里我们重点介绍如何在QGIS内部使用其自带的Python编辑器。
要打开Python控制台,只需点击QGIS菜单栏中的 “插件” -> “Python 控制台”。
启动Python编辑器
Python控制台打开后,点击其界面上方的 “显示编辑器” 按钮,即可调出内置的Python脚本编辑器。在这里,您可以直接编写、运行和调试您的Python代码。
3. Python 脚本开发实战
接下来,让我们通过几个简单的案例,亲身体验QGIS Python脚本开发的魅力。
案例一:新建点图层并绘制圆形缓冲区
此脚本将创建一个中心点图层(包含经纬度属性),并以该点为圆心,绘制一个半径为1000米的圆形面图层。
from qgis.core import (QgsProject,QgsVectorLayer,QgsFeature,QgsGeometry,QgsPointXY,QgsField,QgsFields,QgsCoordinateReferenceSystem,QgsCoordinateTransform,QgsUnitTypes
)
from qgis.PyQt.QtCore import QVariant# 1. 创建点图层(添加经度纬度属性)
def create_point_layer():# 设置中心点坐标(纬度29.385413°,经度107.489439°)center_lat = 29.385413center_lon = 107.489439center_point = QgsPointXY(center_lon, center_lat)# 创建一个内存中的点图层point_layer = QgsVectorLayer("Point?crs=EPSG:4326", "Center_Point", "memory")# 添加属性字段(包括经度、纬度)provider = point_layer.dataProvider()fields = QgsFields()fields.append(QgsField("id", QVariant.Int))fields.append(QgsField("longitude", QVariant.Double)) # 经度字段fields.append(QgsField("latitude", QVariant.Double)) # 纬度字段provider.addAttributes(fields)point_layer.updateFields()# 创建点要素feature = QgsFeature()feature.setGeometry(QgsGeometry.fromPointXY(center_point))feature.setAttributes([1, center_lon, center_lat]) # 设置属性值# 将要素添加到图层provider.addFeature(feature)# 添加到QGIS项目中QgsProject.instance().addMapLayer(point_layer)return point_layer, center_point# 2. 创建圆形缓冲区(保持不变)
def create_circle_buffer(center_point):# 创建一个临时坐标系用于测量(使用UTM,假设在UTM zone 48N)source_crs = QgsCoordinateReferenceSystem("EPSG:4326") # WGS84target_crs = QgsCoordinateReferenceSystem("EPSG:32648") # UTM zone 48N# 坐标转换transform = QgsCoordinateTransform(source_crs, target_crs, QgsProject.instance())center_utm = transform.transform(center_point)# 创建圆形缓冲区(1000米半径)buffer_distance = 1000 # 米circle = QgsGeometry.fromPointXY(center_utm).buffer(buffer_distance, 100) # 100段线段近似圆# 转换回WGS84transform = QgsCoordinateTransform(target_crs, source_crs, QgsProject.instance())circle.transform(transform)# 创建多边形图层buffer_layer = QgsVectorLayer("Polygon?crs=EPSG:4326", "1000m_Buffer", "memory")provider = buffer_layer.dataProvider()provider.addAttributes([QgsField("id", QVariant.Int)])buffer_layer.updateFields()# 创建要素feature = QgsFeature()feature.setGeometry(circle)feature.setAttributes([1])# 添加要素provider.addFeature(feature)# 添加到QGIS项目中QgsProject.instance().addMapLayer(buffer_layer)return buffer_layer# 执行函数
point_layer, center_point = create_point_layer()
buffer_layer = create_circle_buffer(center_point)print("点图层(含经度纬度属性)和1000米缓冲区已创建完成!")
案例二:为现有图层添加经纬度属性
此脚本将查找当前QGIS项目中的名为"Center_Point"的点图层,并为其属性表添加“longitude”(经度)和“latitude”(纬度)字段,然后填充相应的值。
from qgis.core import (QgsProject,QgsVectorLayer,QgsField,QgsFeature,QgsWkbTypes
)
from qgis.PyQt.QtCore import QVariantdef add_lon_lat_fields_to_layer():# 获取当前项目project = QgsProject.instance()# 查找名为"Center_Point"的图层center_point_layer = Nonefor layer in project.mapLayers().values():if layer.name() == "Center_Point" and isinstance(layer, QgsVectorLayer):center_point_layer = layerbreakif not center_point_layer:print("错误:未找到名为'Center_Point'的点图层")return False# 检查图层类型是否为点图层if center_point_layer.wkbType() != QgsWkbTypes.Point:print("错误:'Center_Point'图层不是点图层")return False# 开始编辑图层center_point_layer.startEditing()# 添加经度和纬度字段(如果不存在)provider = center_point_layer.dataProvider()fields = provider.fields()# 获取或创建字段索引lon_idx = fields.lookupField("longitude")if lon_idx == -1:provider.addAttributes([QgsField("longitude", QVariant.Double)])center_point_layer.updateFields()lon_idx = fields.count() # 新添加的字段索引lat_idx = fields.lookupField("latitude")if lat_idx == -1:provider.addAttributes([QgsField("latitude", QVariant.Double)])center_point_layer.updateFields()lat_idx = fields.count() + 1 # 新添加的字段索引# 更新所有要素的属性for feature in center_point_layer.getFeatures():geom = feature.geometry()if geom and not geom.isEmpty():point = geom.asPoint()center_point_layer.changeAttributeValue(feature.id(), lon_idx, point.x())center_point_layer.changeAttributeValue(feature.id(), lat_idx, point.y())# 提交更改if center_point_layer.commitChanges():print(f"成功为'{center_point_layer.name()}'图层添加经度和纬度属性")return Trueelse:print("错误:提交更改失败")center_point_layer.rollBack()return False# 执行函数
add_lon_lat_fields_to_layer()
在 Python 编辑器中支持打开、编辑、保存、新建 Python 文件,将上面的脚本复制进去点击运行即可。
4. Python 脚本在GIS中的作用
QGIS Python脚本的核心价值在于其自动化和流程化的能力。通过编写脚本,您可以:
-
自动化重复性任务: 将日常GIS操作(如数据导入、格式转换、图层符号化)编写成脚本,一键执行,极大节省时间。
-
实现复杂分析: 结合PyQGIS库,可以进行高级的空间分析、数据处理和模型构建,解决传统界面操作难以完成的任务。
-
定制化工作流: 根据特定项目需求,创建定制化的工具和功能,使工作流程更符合您的习惯。
5. AI时代下的Python脚本学习与使用
在AI日益普及的今天,学习和使用QGIS Python脚本变得更加容易。您不再需要从零开始记忆所有API和语法。关键在于:
-
明确需求: 清楚您希望QGIS完成什么任务。
-
梳理逻辑: 将复杂任务分解为一系列可编程的步骤。
-
借助AI辅助: 利用大型语言模型(如您正在使用的AI)来生成初步代码、解释概念或解决遇到的问题。AI可以作为您高效学习和开发的强大助手。
-
深入学习: 在实践中不断学习,结合官方手册和API文档,理解代码背后的原理,从而真正掌握PyQGIS的精髓。
相关资料
为了您的进一步学习,这里提供一些官方和社区资源:
-
PyQGIS Developer Cookbook[1]
-
PyQGIS API 文档[2]
-
QGIS Python 控制台帮助[3]
网址
[1] https://docs.qgis.org/3.40/en/docs/pyqgis_developer_cookbook/index.html
[2] https://qgis.org/pyqgis/3.40/
[3] https://docs.qgis.org/3.40/zh-Hans/docs/user_manual/plugins/python_console.html