PYQGIS——图层管理器

界面设计

在这里插入图片描述

写代码

程序入口

if __name__ == '__main__':
    # 应用入口,使用GUI
    qgs = QgsApplication([], True)
    # 设置,qgis安装路径,这里写相对路径,如果是源码运行,这行可不写
    qgs.setPrefixPath('qgis', True)
    # 初始化
    qgs.initQgis()

    window = Window()
    window.show()

    exit_code = qgs.exec_()
    # 退出
    qgs.exitQgis()

建立桥梁

model = QgsLayerTreeModel(QgsProject.instance().layerTreeRoot(), self)
model.setFlag(QgsLayerTreeModel.AllowNodeRename)
model.setFlag(QgsLayerTreeModel.AllowNodeReorder)
model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility)
model.setFlag(QgsLayerTreeModel.ShowLegendAsTree)
model.setAutoCollapseLegendNodes(10)
self.layer_tree_view.setModel(model)
# 注意self.layer_tree_bridge必须有
self.layer_tree_bridge = QgsLayerTreeMapCanvasBridge(QgsProject.instance().layerTreeRoot(), self.map_canvas)

加载图层

data_file, ext = QFileDialog.getOpenFileName(self, '打开', '', '*.shp')
	if data_file:
        basename = os.path.splitext(os.path.basename(data_file))[0]
		layer = QgsVectorLayer(data_file, basename, "ogr")
		QgsProject.instance().addMapLayer(layer)
		self.layer_list.append(layer)
		self.map_canvas.setExtent(layer.extent())
		self.map_canvas.setLayers(self.layer_list)
		self.map_canvas.refresh()
		self.layer_tree_view.setCurrentLayer(layer)

运行效果

在这里插入图片描述

源码

UI文件下载

import os

from PyQt5.QtWidgets import QMainWindow, QFileDialog, QVBoxLayout, QHBoxLayout
from qgis.gui import QgsLayerTreeMapCanvasBridge, QgsLayerTreeView, QgsMapCanvas
from qgis.core import QgsVectorLayer, QgsProject, QgsLayerTreeModel, QgsApplication

from main_ui import Ui_MainWindow


class Window(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.setupUi(self)

        self.layers = []

        # ---------初始化图层和画布----------
        self.vl = QVBoxLayout(self.dockWidgetContents)
        self.layer_tree_view = QgsLayerTreeView(self)
        self.vl.addWidget(self.layer_tree_view)
        self.hl = QHBoxLayout(self.frame)
        self.map_canvas = QgsMapCanvas(self.frame)
        self.hl.addWidget(self.map_canvas)
        # ---------初始化图层和画布----------

        self.action_open.triggered.connect(self.action_open_triggered)

        # 建立桥梁
        self.model = QgsLayerTreeModel(QgsProject.instance().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)
        self.layer_tree_view.setModel(self.model)
        # 注意self.layer_tree_bridge必须有
        self.layer_tree_bridge = QgsLayerTreeMapCanvasBridge(QgsProject.instance().layerTreeRoot(), self.map_canvas)

    def action_open_triggered(self):
        data_file, ext = QFileDialog.getOpenFileName(self, '打开', '', '所有文件(*)')
        if data_file:
            if data_file.endswith('.shp'):
                basename = os.path.splitext(os.path.basename(data_file))[0]
                layer = QgsVectorLayer(data_file, basename, "ogr")
                QgsProject.instance().addMapLayer(layer)
                self.layers.append(layer)
                self.map_canvas.setExtent(layer.extent())
                self.map_canvas.setLayers(self.layers)
                self.map_canvas.refresh()
                self.layer_tree_view.setCurrentLayer(layer)
            elif data_file.endswith('.qgz') or data_file.endswith('.qgs'):
                QgsProject.instance().read(data_file)
            else:
                print('error')


if __name__ == '__main__':
    # 应用入口,使用GUI
    qgs = QgsApplication([], True)
    # 设置,qgis安装路径,这里写相对路径,如果是源码运行,这行可不写
    qgs.setPrefixPath('qgis', True)
    # 初始化
    qgs.initQgis()

    window = Window()
    window.show()

    exit_code = qgs.exec_()
    # 退出
    qgs.exitQgis()

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐