PyQGIS开发 3 基础功能开发

PyQGIS开发 3 基础功能开发

1 添加图层树与地图视图

1.1 添加控件

1.2 Python代码

from PyQt5.QtCore import QMimeData
from qgis.PyQt.QtWidgets import QMainWindow
from qgis._core import QgsMapLayer, QgsRasterLayer, QgsVectorLayer
from qgis.core import QgsProject, QgsLayerTreeModel
from qgis.gui import QgsLayerTreeView, QgsMapCanvas, QgsLayerTreeMapCanvasBridge
import os.path as osp
from ui.mainWindow import Ui_MainWindow
from PyQt5.QtWidgets import QVBoxLayout, QHBoxLayout, QFileDialog, QMessageBoxPROJECT = QgsProject.instance()class MainWindow(QMainWindow, Ui_MainWindow):def __init__(self):"""MainWindow 类的初始化函数。该函数初始化 MainWindow 类的实例,设置窗口标题、初始化图层树、地图画布、图层树视图模型、建立图层树与地图画布的桥接,并注册界面事件功能。"""super(MainWindow, self).__init__()self.setupUi(self)# 1 修改标题self.setWindowTitle("QGIS自定义界面")# 2 初始化图层树vl = QVBoxLayout(self.dockWidgetContents)self.layerTreeView = QgsLayerTreeView(self)vl.addWidget(self.layerTreeView)# 3 初始化地图画布self.mapCanvas = QgsMapCanvas(self)hl = QHBoxLayout(self.frame)hl.setContentsMargins(0, 0, 0, 0)  # 设置周围间距hl.addWidget(self.mapCanvas)# 4 设置图层树风格self.model = QgsLayerTreeModel(PROJECT.layerTreeRoot(), self)self.model.setFlag(QgsLayerTreeModel.AllowNodeRename)  # 允许图层节点重命名self.model.setFlag(QgsLayerTreeModel.AllowNodeReorder)  # 允许图层拖拽排序self.model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility)  # 允许改变图层节点可视性self.model.setFlag(QgsLayerTreeModel.ShowLegendAsTree)  # 展示图例self.model.setAutoCollapseLegendNodes(10)  # 当节点数大于等于10时自动折叠self.layerTreeView.setModel(self.model)# 4 建立图层树与地图画布的桥接self.layerTreeBridge = QgsLayerTreeMapCanvasBridge(PROJECT.layerTreeRoot(), self.mapCanvas, self)# 注册界面事件功能self.registerFunc()# 5 初始加载影像self.firstAdd = True# 6 允许拖拽文件self.setAcceptDrops(True)def registerFunc(self):"""注册动作的触发函数该函数将动作与对应的触发函数连接起来,使得当用户点击动作时,相应的函数会被触发"""self.actionOpenRaster.triggered.connect(self.actionOpenRasterTriggered)self.actionOpenVector.triggered.connect(self.actionOpenVectorTriggered)def actionOpenRasterTriggered(self):"""处理打开栅格文件的触发事件此方法通过 QFileDialog 弹出文件选择对话框,获取用户选择的栅格文件路径。如果用户选择了文件,将调用 addRasterLayer 方法添加该文件对应的栅格图层到窗口中。参数:None返回值:无异常: 如果文件选择对话框取消或出错,不会添加任何图层。"""data_file, ext = QFileDialog.getOpenFileName(self,'打开','','GeoTiff(*.tif;*tiff;*TIF;*TIFF);;All Files(*);;JPEG(*.jpg;*.jpeg;*.JPG;*.JPEG);;*.png;;*.pdf')if data_file:self.addRasterLayer(data_file)def actionOpenVectorTriggered(self):"""处理打开矢量文件的触发事件此方法通过 QFileDialog 弹出文件选择对话框,获取用户选择的矢量文件路径。如果用户选择了文件,将调用 addVectorLayer 方法添加该文件对应的矢量图层到窗口中。参数:None返回值:无异常: 如果文件选择对话框取消或出错,不会添加任何图层。"""data_file, ext = QFileDialog.getOpenFileName(self, '打开', '',"ShapeFile(*.shp);;All Files(*);;Other(*.gpkg;*.geojson;*.kml)")if data_file:self.addVectorLayer(data_file)def addRasterLayer(self, rasterFilePath):"""将栅格图层添加到地图画布中。此方法用于将栅格文件加载为栅格图层,并将其添加到地图画布中显示。如果是第一次添加图层,它会作为基础图层添加,并设置为可编辑状态。否则,它会作为普通图层添加。参数:rasterFilePath (str): 要添加的栅格文件的路径。返回:无注意:如果文件路径无效或文件无法加载为栅格图层,则不会添加任何图层。"""# 读取栅格文件并创建栅格图层raster_layer = self.readRasterFile(rasterFilePath)# 如果是首次添加图层,则将其作为基础图层添加到地图画布,并设置为可编辑if self.firstAdd:self.addMapLayer(raster_layer, self.mapCanvas, True)self.firstAdd = False# 否则,将其作为普通图层添加到地图画布else:self.addMapLayer(raster_layer, self.mapCanvas)def addVectorLayer(self, vectorFilePath):"""向当前QGIS项目中添加一个新的矢量图层,并显示在地图画布上。参数:vectorFilePath (str): 要添加的矢量文件的路径。返回:None"""vector_layer = self.readVectorFile(vectorFilePath)if self.firstAdd:self.addMapLayer(vector_layer, self.mapCanvas, True)self.firstAdd = Falseelse:self.addMapLayer(vector_layer, self.mapCanvas)def addMapLayer(self, layer: QgsMapLayer, mapCanvas: QgsMapCanvas, firstAddLayer=False):"""将地图层添加到 QGIS 项目和地图画布中。参数:layer (QgsMapLayer):要添加的地图层。mapCanvas (QgsMapCanvas):地图画布,用于显示地图层。firstAddLayer (bool):是否是第一次添加图层。如果是,将设置画布的 CRS 和范围。返回:无注意:如果图层已经存在,它将重命名以避免冲突。如果图层无效,它将不会被添加。"""# 检查图层是否有效if layer.isValid():# 如果是第一次添加图层,设置画布的 CRS 和范围if firstAddLayer:mapCanvas.setDestinationCrs(layer.crs())mapCanvas.setExtent(layer.extent())# 确保图层名称唯一while PROJECT.mapLayersByName(layer.name()):layer.setName(layer.name() + "_1")# 将图层添加到项目中PROJECT.addMapLayer(layer)# 更新画布的图层列表并刷新layers = [layer] + [PROJECT.mapLayer(i) for i in PROJECT.mapLayers()]mapCanvas.setLayers(layers)mapCanvas.refresh()def readRasterFile(self, rasterFilePath: str) -> QgsRasterLayer:"""从给定的文件路径中读取栅格文件,并返回相应的 QgsRasterLayer 对象。参数:rasterFilePath (str):要读取的栅格文件的完整路径。返回:QgsRasterLayer:如果成功读取文件,则返回相应的 QgsRasterLayer 对象;否则返回 None。"""raster_layer = QgsRasterLayer(rasterFilePath, osp.basename(rasterFilePath))return raster_layerdef readVectorFile(self, vectorFilePath):"""从给定的文件路径中读取矢量文件,并返回相应的 QgsVectorLayer 对象。参数:vectorFilePath (str): 要读取的矢量文件的完整路径。返回:QgsVectorLayer: 如果成功读取文件,则返回相应的 QgsVectorLayer 对象;否则返回 None。"""vector_layer = QgsVectorLayer(vectorFilePath, osp.basename(vectorFilePath), "ogr")return vector_layerdef dragEnterEvent(self, fileData):"""处理拖放文件进入窗口的事件。如果拖放的文件是URL类型,则接受事件;否则,忽略事件。参数:fileData - 拖放事件的数据。返回:None"""if fileData.mimeData().hasUrls():fileData.accept()else:fileData.ignore()def dropEvent(self, fileData):"""处理拖放事件,根据文件类型添加对应的图层到QGIS中参数:fileData (QDragEnterEvent): 拖放事件对象返回:None"""mimeData: QMimeData = fileData.mimeData()filePathList = [u.path()[1:] for u in mimeData.urls()]for filePath in filePathList:filePath: str = filePath.replace("/", "//")if filePath.split(".")[-1] in ["tif", "TIF", "tiff", "TIFF", "GTIFF", "png", "jpg", "pdf"]:self.addRasterLayer(filePath)elif filePath.split(".")[-1] in ["shp", "SHP", "gpkg", "geojson", "kml"]:self.addVectorLayer(filePath)elif filePath == "":passelse:QMessageBox.about(self, '警告', f'{filePath}为不支持的文件类型,目前支持栅格影像和shp矢量')def getRasterLayerAttrs(self, rasterLayer: QgsRasterLayer):print("name: ", rasterLayer.name())  # 图层名print("type: ", rasterLayer.type())  # 栅格还是矢量图层print("height - width: ", rasterLayer.height(), rasterLayer.width())  # 尺寸print("bands: ", rasterLayer.bandCount())  # 波段数print("extent", rasterLayer.extent())  # 外接矩形范围print("source", rasterLayer.source())  # 图层的源文件地址print("crs", rasterLayer.crs())  # 图层的坐标系统def getVectorLayerAttrs(self, vectorLayer: QgsVectorLayer):print("name: ", vectorLayer.name())  # 图层名print("type: ", vectorLayer.type())  # 栅格还是矢量图层print("extent", vectorLayer.extent())  # 外接矩形范围print("source", vectorLayer.source())  # 图层的源文件地址print("crs", vectorLayer.crs())  # 图层的坐标系统

1.3 实现效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/144742.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

美联储降息引爆股市,标普500指数逼近历史新高

在美联储宣布大幅降息后,股市迎来了强劲反弹。投资者信心大增,此前他们就预期美联储会降息0.5个百分点。周四的股市涨幅让标普500指数接近历史收盘最高点。 周四,标普500指数有望刷新历史纪录,此前美联储的大幅降息为市场注入了活…

基于STM32的智能门禁系统(指纹、蓝牙、刷卡、OLED、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32单片机,六个按键,分别代表指纹、蓝牙、刷卡的正确进门与错误进门; 比如第一个按键按下,表示指纹正确,OLED显示指纹正确&#x…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核启动】

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核(LiteOS-M) 轻量系统内核&#…

faiss安装 (CPU版本)

faiss版本 faiss-v1.7.4 cd faiss-v1.7.4cmake -B build . -DBUILD_TESTINGOFF -DFAISS_ENABLE_GPUOFF -DFAISS_ENABLE_PYTHONOFFmake -C build -j faiss; 默认安装路径如下 -- Installing: /usr/local/lib64/libfaiss.a -- Installing: /usr/local/include/faiss…

跨境平台通用测评技巧:解锁Temu、亚马逊等平台的销量密码

在当今竞争激烈的跨境电商行业,测评补单虽被视为“公开的秘密”,但无论是消费者还是平台方对此普遍持有反感态度。对于新手店铺而言,若缺乏价格和运营等方面的绝对优势,要在市场中生存下去尤为困难。因此,合理使用测评…

深入探讨IDSIPS:信息安全的未来趋势与应用

引言 在信息技术飞速发展的今天,网络安全问题愈发突出。随着数据泄露、网络攻击等事件频发,企业和个人对信息安全的重视程度不断提高。IDSIPS(Intrusion Detection System and Intrusion Prevention System)作为信息安全领域的重…

PowerShell install 一键部署Oracle12c

Oracle12c前言 Oracle 12c是甲骨文公司推出的一款关系数据库管理系统,它引入了多项创新特性,如多租户架构、大数据处理和云部署,适用于企业级应用。以下是Oracle 12c的详细介绍: Oracle 12c的主要特点 高性能:通过多线程处理、自动优化等技术,提高了数据库的查询和处理…

非标工业模型评审不再难,3D一览通助力高效协同

在当今工业领域,非标设备设计正成为满足特定客户需求的关键。这类设计服务涉及为特定应用场景量身定制的设备或机器,它们通常不是市场上现成的标准化产品,而是根据客户的独特需求进行个性化设计和制造。 这种定制化过程要求设计团队与客户进…

Abp vNext(五)集成MQTTnet,可收发消息

一 前言 MQTT的相关理论内容这里不做过多介绍,请看下面两篇文章: Introduction MQTT协议中文版 MQTT协议-CSDN博客 这篇文章只做代码实现,文章中使用MQTTnet作为MQTT开发的组件。 MQTT分为服务端和客户端,一个服务端对应多个…

Python和C++及R相关系数数学统计学可视化和神经模型及评估指标

🎯要点 较少统计样本显著性评估和变量关系梳理功能磁共振成像一致性分析检测非单调关联性结构随机变量动力学相关性热图和矩阵图基因疫苗非线性变量相关性 Python相关矩阵 相关矩阵 n n n 个随机变量 X 1 , … , X n X_1, \ldots, X_n X1​,…,Xn​ 的相关矩阵…

视频去噪技术分享

视频去噪是一种视频处理技术,旨在从视频帧中移除噪声和干扰,提高视频质量。噪声可能由多种因素引起,包括低光照条件、高ISO设置、传感器缺陷等。视频去噪对于提升视频内容的可视性和可用性至关重要,特别是在安全监控、医疗成像和视…

迅为3A6000_7A2000开发板龙芯全国产处理器LoongArch架构核心主板

龙芯 3A6000 处理器完全自主设计、性能优异,代表了我国自主桌面 CPU 设计领域的最新里程碑成果。龙芯 3A6000 处理器的推出,说明国产 CPU 在自主可控程度和产品性能上已双双达到新高度,也证明了国内有能力在自研 CPU 架构上做出一流的产品。 …

聊聊AUTOSAR:基于Vector MICROSAR的TC8测试开发方案

技术背景 车载以太网技术作为汽车智能化和网联化的重要组成部分,正逐步成为现代汽车网络架构的核心,已广泛应用于汽车诊断(如OBD)、ECU软件更新、智能座舱系统、高清摄像头环视泊车系统等多个领域。 在这个过程中,ET…

SpringCloud 基于 web 的只会养老平台

摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计…

Django SQL注入-漏洞分析

1.进入项目界面 图1 项目主界面 2.访问任意不存在的目录路径报错,提示存在demo接口 图2 提示存在接口 3.访问/demo/,提示有一个name参数 图3 发现隐藏参数 4.对接口参数进行fuzz(实战思路),vulfocus已经给出了/demo?…

Cypress安装与启动(开始学习记录)

一 Cypress安装 使用npm安装 1.查看node.js npm的版本,输入 npm --version 和 node --version,node.js没安装的可以去中文网下载最新稳定版安装,npm不建议升级到最新版本,会导致安装Cypress时Error: Cannot find module ansi-st…

一篇文章解决ComfyUI常见的故障报错!

前言 学习和使用ComfyUI最痛苦的是什么?就是这满屏的红色方框和和[报错信息] “报错信息”),处理完一批又一批,很多人玩了一两个流程就搞不下去了,很多初学者因此就放弃了。 有道是:配置流程大半天,跑通出…

C++速通LeetCode中等第9题-合并区间

排序后迭代&#xff0c;遇到符合条件的就删除前一项&#xff0c;合并到后一项。 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {int left 0,right 0;sort(intervals.begin(), intervals.end());vector&…

YOLOv5模型部署教程

一、介绍 YOLOv5模型是一种以实时物体检测闻名的计算机视觉模型&#xff0c;由Ultralytics开发&#xff0c;并于2020年年中发布。它是YOLO系列的升级版&#xff0c;继承了YOLO系列以实时物体检测能力而著称的特点。 二、基础环境 系统&#xff1a;Ubuntu系统&#xff0c;显卡…

妙笔生花,扩散模型技术探索与分享

一、引言 扩散模型因其强大的图像生成能力引发了巨大的关注,一度达到取代人类插画师的地步。在这个创意无界、视觉为王的时代,扩散模型正悄然带来一场前所未有的视觉盛宴,受到业界广泛关注。OpenAI轰动一时的“Sora”、淘宝AI制图工具“绘蛙”、京东内容创作平台“京点点”…