qgis 3.30 python二次开发环境搭建,一遍过教程

1.使用mamba加速conda下载qgis

在base环境下输入以下命令:

conda install -c conda-forge -n base mamba

2.创建qgis虚拟环境

conda create -n qgis python=3.11
conda activate qgis
mamba install -c conda-forge qgis=3.30.0

经过测试,上面的python和qgis版本,与rasterio、geopandas兼容。附上安装命令,需要rasterio、geopandas的可以使用。

mamba install -c conda-forge rasterio
mamba install -c conda-forge geopandas

3.设置环境变量

上面安装的qgis还不能直接使用,假如使用的话,会是这样:

(qgis) PS C:\Users\anita> python

>>> import qgis
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'qgis'

这时在conda的qgis虚拟环境下,输入qgis,稍等片刻会打开qgis 3.30.0软件

(base) C:\Users\123>conda activate qgis
(qgis) C:\Users\123>qgis

点击qgis软件菜单栏的插件>python控制台,打开python控制台,输入以下命令:

import sys
sys.path

在这里插入图片描述
复制输出的结果数组,在base环境下输入以下命令,这样环境就配置好了。

conda activate base
mamba install conda-build -c conda-forge
conda develop [你复制的数组] -n qgis

在这里插入图片描述

4.测试代码

效果如下:
在这里插入图片描述
代码如下:

from qgis.core import *
from qgis.gui import *
from qgis.PyQt.QtWidgets import *
from qgis.PyQt.QtGui import *
from qgis.PyQt.QtCore import *

from os.path import *
import sys

class MyWnd(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.resize(1200, 800)
        self.setWindowTitle("GIS软件")
        self.canvas = QgsMapCanvas()
        self.canvas.setCanvasColor(Qt.white)
        self.canvas.setVisible(True)
        self.canvas.xyCoordinates.connect(self.showXY)

        self.actionZoomIn = QAction("放大工具", self)
        self.actionZoomOut = QAction("缩小工具", self)
        self.actionPan = QAction("平移工具", self)
        self.actionOpenRas = QAction("打开影像", 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)
        self.actionOpenRas.triggered.connect(self.openDialogRas)

        self.toolbar = QToolBar("Canvas actions")
        self.addToolBar(self.toolbar)
        self.toolbar.addAction(self.actionZoomIn)
        self.toolbar.addAction(self.actionZoomOut)
        self.toolbar.addAction(self.actionPan)
        self.toolbar.addAction(self.actionOpenRas)

        self.root = QgsProject.instance().layerTreeRoot()
        self.model = QgsLayerTreeModel(self.root,self)
        self.model.setFlag(QgsLayerTreeModel.AllowNodeReorder)
        self.model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility)
        self.tocView = QgsLayerTreeView()
        self.tocView.setModel(self.model)
        self.tocView.setFixedWidth(200)
        self.bridge = QgsLayerTreeMapCanvasBridge(self.root, self.canvas,self)

        # 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)

        centralWidget = QWidget()
        hLayout = QHBoxLayout()
        hLayout.addWidget(self.canvas)
        hLayout.addWidget(self.tocView)
        centralWidget.setLayout(hLayout)
        self.setCentralWidget(centralWidget)

        self.pan()

    def zoomIn(self):
        self.canvas.setMapTool(self.toolZoomIn)

    def zoomOut(self):
        self.canvas.setMapTool(self.toolZoomOut)

    def pan(self):
        self.canvas.setMapTool(self.toolPan)

    def openDialogRas(self):
        path_to_tif = QFileDialog.getOpenFileName()[0]
        if  path_to_tif=="":
            return
        self.addRaster(path_to_tif)
    
    def openDialogVec(self):
        path_to_vec = QFileDialog.getOpenFileName()[0]
        if  path_to_vec=="":
            return
        self.addVector(path_to_vec)

    def addRaster(self, path):
        layer = QgsRasterLayer(path,basename(path))
        if not layer.isValid():
            QMessageBox.information(self, '提示', '文件打开失败', QMessageBox.Ok)
            return
        layer.dataProvider().setNoDataValue(1,0)
        QgsProject.instance().addMapLayers([layer])
        self.canvas.setLayers([layer])
        self.canvas.setExtent(layer.extent())
        self.canvas.refresh()

    def showXY(self,point):
        m_statusBar=self.statusBar()
        m_statusBar.showMessage("Coordinate:"+str(point.x())+","+str(point.y()))

if __name__ == "__main__":
    QgsApplication.setPrefixPath("./qgis_init", True)
    qgs = QgsApplication([], False)
    qgs.initQgis()

    w = MyWnd()
    w.show()
    sys.exit(qgs.exec_())

    qgs.exitQgis()

5.qgis库代码提示

把 anaconda主环境\pkgs\qgis-3.30.0\Library\python\qgis 这个文件夹复制到​anaconda\envs\qgis\Lib\site-pacakages\qgis里面,然后就有代码提示了。

6.参考链接和推荐链接

参考链接:
https://blog.csdn.net/weixin_43226768/article/details/120270364
https://github.com/anitagraser/QGIS-resources/blob/master/qgis3/notebooks/hello-world.ipynb

推荐链接:
pyqgis官方指南
pyqgis api查询文档
pyqt api查询文档

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值