QGIS Python脚本开发(入门级)

article/2025/6/29 9:44:14

随着人工智能技术的飞速发展,编程语言和脚本开发正变得前所未有的便捷。在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和语法。关键在于:

  1. 明确需求: 清楚您希望QGIS完成什么任务。

  2. 梳理逻辑: 将复杂任务分解为一系列可编程的步骤。

  3. 借助AI辅助: 利用大型语言模型(如您正在使用的AI)来生成初步代码、解释概念或解决遇到的问题。AI可以作为您高效学习和开发的强大助手。

  4. 深入学习: 在实践中不断学习,结合官方手册和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


http://www.hkcw.cn/article/gsSbpiogxK.shtml

相关文章

【算法】分支限界

一、基本思想 (分支限界, 分枝限界, 分支界限 文献不同说法但都是一样的) 分支限界法类似于回溯法,也是一种在问题的解空间树上搜索问题解的算法。 但一般情况下,分支限界法与回溯法的求解目标不同。回溯…

【springcloud】快速搭建一套分布式服务springcloudalibaba(四)

第四篇 基于nacos搭建分布式项目 分布式系统日志(skywalkinges) 项目所需 maven nacos java8 idea git mysql redis skywalking es 本文主要从客户下单时扣减库存的操作,将链路日志模拟出来,网关系统/用户系统/商品系统/订…

设计模式(行为型)-中介者模式

目录 定义 类图结构展示 角色职责详解 模式的优缺点分析 优点 缺点 适用场景 应用实例 与其他模式的结合与拓展 总结 定义 中介者模式的核心思想可以概括为:用一个中介对象来封装一系列的对象交互。这个中介者就像一个通信枢纽,使各对象不需要…

PMOS以及电源转换电路设计

PMOS的使用 5V_EN5V时&#xff0c;PMOS截止&#xff1b; 5V_EN0V时&#xff0c;PMOS导通&#xff1b; 电源转换电路 当Vout0V时&#xff0c;Vg0V, Vgs>Vth, PMOS导通&#xff0c;只有电池供电&#xff1b; 当Vout5V时&#xff0c;Vg4.9V, Vs4.8V?, Vgs<Vth, PMOS截止&am…

本地部署 DeepSeek R1(最新)【从下载、安装、使用和调用一条龙服务】

文章目录 一、安装 Ollama1.1 下载1.2 安装 二、下载 DeepSeek 模型三、使用 DeepSeek3.1 在命令行环境中使用3.2 在第三方软件中使用 一、安装 Ollama 1.1 下载 官方网址&#xff1a;Ollama 官网下载很慢&#xff0c;甚至出现了下载完显示 无法下载&#xff0c;需要授权 目…

数据治理的演变与AI趋势

知识星球&#xff1a;数据书局。打算通过知识星球将这些年积累的知识分享出来&#xff0c;让各位在数据治理、数据分析的路上少走弯路&#xff0c;另外星球也方便动态更新最近的资料&#xff0c;提供各位一起讨论数据的小圈子 1.数据治理的演变 1.1.摘要 数据治理是指组织管…

Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理

Fullstack 面试复习笔记&#xff1a;操作系统 / 网络 / HTTP / 设计模式梳理 面试周期就是要根据JD调整准备内容&#xff08;挠头&#xff09;&#xff0c;最近会混合复习针对全栈这块的内容&#xff0c;目前是根据受伤的JD&#xff0c;优先选择一些基础的操作系统、Java、Nod…

【MIMO稳定裕度】基于数据驱动的多输入多输出系统稳定裕度分析

最近一直在忙着写论文&#xff0c;只能说要写一篇高水平论文确实不容易&#xff0c;要一直反复来回修改调整&#xff0c;要求比较高&#xff0c;所以没太有时间和精力写博客&#xff0c;这两天结束了初稿&#xff0c;又正好是假期&#xff0c;出来冒个泡。 本次分享的主题是&am…

Python 训练营打卡 Day 33-神经网络

简单神经网络的流程 1.数据预处理&#xff08;归一化、转换成张量&#xff09; 2.模型的定义 继承nn.Module类 定义每一个层 定义前向传播流程 3.定义损失函数和优化器 4.定义训练过程 5.可视化loss过程 预处理补充&#xff1a; 分类任务中&#xff0c;若标签是整…

TDengine 的 AI 应用实战——电力需求预测

作者&#xff1a; derekchen Demo数据集准备 我们使用公开的UTSD数据集里面的电力需求数据&#xff0c;作为预测算法的数据来源&#xff0c;基于历史数据预测未来若干小时的电力需求。数据集的采集频次为30分钟&#xff0c;单位与时间戳未提供。为了方便演示&#xff0c;按…

【03】完整开发腾讯云播放器SDK的UniApp官方UTS插件——优雅草上架插件市场-卓伊凡

【03】完整开发腾讯云播放器SDK的UniApp官方UTS插件——优雅草上架插件市场-卓伊凡 一、项目背景与转型原因 1.1 原定计划的变更 本系列教程最初规划是开发即构美颜SDK的UTS插件&#xff0c;但由于甲方公司内部战略调整&#xff0c;原项目被迫中止。考虑到&#xff1a; 技术…

(aaai2024) Omni-Kernel Network for Image Restoration

代码&#xff1a;https://github.com/c-yn/OKNet 研究动机&#xff1a;作者认为Transformer模型计算复杂度太高&#xff0c;因此提出了 omni-kernel module &#xff08;OKM&#xff09;&#xff0c;可以有效的学习局部到全局的特征表示。该模块包括&#xff1a;全局、大分支、…

useMemo useCallback 自定义hook

useMemo & useCallback & 自定义hook useMemo 仅当依赖项发生变化的时候&#xff0c;才去重新计算&#xff1b;其他状态变化时则不去做不必要的计算。 useCallback 缓存函数。但是使用注意&#x1f4e2; &#xff0c;useCallback没有特别明显的优化。 *合适的场景——父…

android binder(二)应用层编程实例

一、binder驱动浅析 从上图看出&#xff0c;binder的通讯主要涉及三个步骤。 在 Binder Server 端定义好服务&#xff0c;然后向 ServiceManager 注册服务在 Binder Client 中向 ServiceManager 获取到服务发起远程调用&#xff0c;调用 Binder Server 中定义好的服务 整个流…

GESP2024年3月认证C++二级( 第三部分编程题(2)小杨的日字矩阵)

参考程序&#xff1a; #include <iostream> using namespace std;int main() {int n;cin >> n; // 读入奇数 n// 外层循环控制每一行for (int i 0; i < n; i) {// 内层循环控制每一列for (int j 0; j < n; j) {char ch;// 如果当前列是最左或最右&#x…

BUUCTF[ACTF2020 新生赛]Exec 1题解

BUUCTF[ACTF2020 新生赛]Exec 1题解 分析解题过程总结: 分析 先分析题目&#xff1a;exc()是一个内部调用shell命令的函数&#xff0c;同样的函数还有system(), 创建靶机&#xff0c;打开网址&#xff0c;是一个和PING相关的网页&#xff0c;查看源代码&#xff0c;没有提示&a…

NX869NX874美光固态颗粒NX877NX883

NX869NX874美光固态颗粒NX877NX883 美光固态硬盘颗粒技术解析与市场展望 近年来&#xff0c;固态硬盘&#xff08;SSD&#xff09;市场呈现出蓬勃发展的态势&#xff0c;而作为核心组件的存储颗粒&#xff0c;其技术进展与市场动态自然吸引了众多关注。在众多品牌中&#xff…

CodeTop100 Day20

58、翻转字符串中的数字 class Solution {public String reverseWords(String s) {s s.trim(); int j s.length() - 1, i j;StringBuilder res new StringBuilder();while (i > 0) {while (i > 0 && s.charAt(i) ! ) i--…

重温经典算法——快速排序

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 基本原理 快速排序基于分治思想&#xff0c;通过选取基准元素将数组划分为两个子数组&#xff08;小于基准和大于基准&#xff09;&#xff0c;递归排序子数组。平均时间复…

【机器学习】集成学习与梯度提升决策树

目录 一、引言 二、自举聚合与随机森林 三、集成学习器 四、提升算法 五、Python代码实现集成学习与梯度提升决策树的实验 六、总结 一、引言 在机器学习的广阔领域中,集成学习(Ensemble Learning)犹如一座闪耀的明星,它通过组合多个基本学习器的力量,创造出…