基于PyQgis的图层 + 渲染窗口示例

这篇博客介绍了如何利用Python的PyQt5库和QGIS API创建一个地图界面,包括图层管理和地图操作功能。通过设置CanvasCRS、加载栅格图层、实现缩放和平移等工具,以及使用QgsLayerTreeView来展示图层树,展示了构建地理信息系统(GIS)应用的基本步骤。
摘要由CSDN通过智能技术生成

1. 界面效果

在这里插入图片描述

2. Python代码(.py)


from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from qgis.core import *
from qgis.gui import *
from qgis.PyQt.QtGui import *
import sys
import os

from ui_demo import Ui_MainWindow


class MyWnd(QMainWindow, Ui_MainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        # 图层及图布的初始化
        self.setupUi(self)

        self.project = QgsProject.instance()
        self.canvas = QgsMapCanvas(self.canvasFrame)
        self.canvas.setCanvasColor(Qt.white)
        self.vl_canvasFrame.addWidget(self.canvas)

        self.layer_tree_view = QgsLayerTreeView(self)
        self.vl_layerDock.addWidget(self.layer_tree_view)

        self.layer_tree_root = self.project.layerTreeRoot()
        self.layer_tree_model = QgsLayerTreeModel(self.layer_tree_root)
        self.layer_tree_model.setFlag(QgsLayerTreeModel.AllowNodeRename)
        self.layer_tree_model.setFlag(QgsLayerTreeModel.AllowNodeReorder)
        self.layer_tree_model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility)
        self.layer_tree_model.setFlag(QgsLayerTreeModel.ShowLegendAsTree)
        self.layer_tree_model.setAutoCollapseLegendNodes(10)
        self.layer_tree_view.setModel(self.layer_tree_model)

        self.layer_tree_bridge = QgsLayerTreeMapCanvasBridge(self.layer_tree_root, self.canvas)

        # 设置Canvas CRS
        crs = QgsCoordinateReferenceSystem("EPSG:4326")
        self.canvas.setDestinationCrs(crs)

        # 添加栅格图层
        path_to_tif = r"path/to/tif"
        self.rlayer = QgsRasterLayer(path_to_tif, "LAYER NAME")
        self.project.addMapLayer(self.rlayer)
        self.canvas.setCurrentLayer(self.rlayer)
        self.canvas.setExtent(self.rlayer.extent())

        # 初始化Renderer
        self.single_band_pseudo_color_renderer_widget = QgsSingleBandPseudoColorRendererWidget(
            self.canvas.currentLayer()
        )
        self.vl_attributeDock.addWidget(self.single_band_pseudo_color_renderer_widget)
        # 监测Renderer事件
        self.single_band_pseudo_color_renderer_widget.widgetChanged.connect(self.update_renderer_widget)

        # 添加菜单按钮
        self.actionZoomIn  = QAction("Zoom in", self)
        self.actionZoomOut = QAction("Zoom out", self)
        self.actionPan     = QAction("Pan", self)

        self.actionZoomIn.setCheckable(True)
        self.actionZoomOut.setCheckable(True)
        self.actionPan.setCheckable(True)

        self.actionZoomIn.triggered.connect(self.zoomIn)
        self.actionZoomOut.triggered.connect(self.zoomOut)
        self.actionPan.triggered.connect(self.pan)

        # 在toolbar中添加按钮
        self.toolbar = self.addToolBar("Canvas actions")
        self.toolbar.addAction(self.actionZoomIn)
        self.toolbar.addAction(self.actionZoomOut)
        self.toolbar.addAction(self.actionPan)

        # create the map tools
        self.toolPan = QgsMapToolPan(self.canvas)
        self.toolPan.setAction(self.actionPan)
        self.toolZoomIn = QgsMapToolZoom(self.canvas, False)  # false = in
        self.toolZoomIn.setAction(self.actionZoomIn)
        self.toolZoomOut = QgsMapToolZoom(self.canvas, True)  # true = out
        self.toolZoomOut.setAction(self.actionZoomOut)

        self.pan()
    def update_renderer_widget(self):
        print('Update Renderer ... ')
        self.single_band_pseudo_color_renderer_widget.doComputations()
        self.rlayer.setRenderer(self.single_band_pseudo_color_renderer_widget.renderer())
        self.rlayer.triggerRepaint()
    def zoomIn(self):
        self.canvas.setMapTool(self.toolZoomIn)
    def zoomOut(self):
        self.canvas.setMapTool(self.toolZoomOut)
    def pan(self):
        self.canvas.setMapTool(self.toolPan)

if __name__ == '__main__':
    qgs = QgsApplication([], True)
    qgs.setPrefixPath('qgis', True)
    qgs.initQgis()

    window = MyWnd()
    window.show()

    exit_code = qgs.exec_()
    qgs.exitQgis()
    sys.exit(exit_code)

3. 演示Ui代码(.py)


from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from qgis.gui import *

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(1001, 755)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.gridLayout = QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName(u"gridLayout")

        self.layerDockWidget = QgsDockWidget(self.centralwidget)
        self.layerDockWidget.setObjectName(u"layerDockWidget")
        self.dockWidgetContents = QWidget()
        self.dockWidgetContents.setObjectName(u"dockWidgetContents")
        self.layerDockWidget.setWidget(self.dockWidgetContents)
        self.vl_layerDock = QVBoxLayout(self.dockWidgetContents)
        self.canvasFrame = QFrame(self.centralwidget)
        self.canvasFrame.setObjectName(u"canvasFrame")
        self.canvasFrame.setFrameShape(QFrame.StyledPanel)
        self.canvasFrame.setFrameShadow(QFrame.Raised)
        self.vl_canvasFrame = QVBoxLayout(self.canvasFrame)
        self.attributeDockWidget = QgsDockWidget(self.centralwidget)
        self.attributeDockWidget.setObjectName(u"attributeDockWidget")
        self.dockWidgetContents_2 = QWidget()
        self.dockWidgetContents_2.setObjectName(u"dockWidgetContents_2")
        self.attributeDockWidget.setWidget(self.dockWidgetContents_2)
        self.vl_attributeDock = QVBoxLayout(self.dockWidgetContents_2)

        self.gridLayout.addWidget(self.canvasFrame, 0, 0, 2, 1)
        self.gridLayout.addWidget(self.layerDockWidget, 0, 1, 1, 1)
        self.gridLayout.addWidget(self.attributeDockWidget, 1, 1, 1, 1)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 1001, 26))

        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName(u"statusbar")

        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
    # retranslateUi


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值