当前位置: 代码迷 >> 综合 >> Qgis+python开发环境配置和简单教程
  详细解决方案

Qgis+python开发环境配置和简单教程

热度:90   发布时间:2024-02-09 00:24:51.0

简介

       QGIS 是开源桌面地理信息系统,基于C++语言进行开发,支持进行二次开发,开发方式有两种,一种插件形式添加个性化的工具,一种是调用QGIS的api进行外部应用开发。

       QGIS系统本身是用C ++编写的,它有自己的API集,也是用C ++编写的。Python API实现为围绕这些C ++ API的包装器。例如,有一个名为QgisInterface的Python类,它充当同名C ++类的包装器。由C ++版本的QgisInterface实现的所有方法,类变量等都可以通过Python包装器获得。

        要想使用QGIS的API进行开发,需要配置QGIS的python,以便能够正常调用其API。

配置

1.先设置系统变量path,要把qgis下的py37目录也放进去(切记要放到最前面,防止被其他地方安装的python覆盖),如:

C:\software\QGIS\apps\Python37;
C:\software\QGIS\bin;
C:\software\QGIS\apps\qgis-ltr\bin;

配置完可以再命令框内输入where python,查看python编译器路径;

 

2.PYTHONPATH变量设置:

PYTHONPATH:

C:\software\QGIS\apps\qgis-ltr\python;
C:\software\QGIS\apps\qgis-ltr\bin;
C:\software\QGIS\apps\qgis-ltr\python\qgis;
C:\software\QGIS\apps\Python37\Lib;
C:\software\QGIS\apps\Python37\Lib\site-packages;
C:\software\QGIS\apps\Python37\DLLs;
C:\software\QGIS\apps\Python37\Scripts;

 

3.PYTHONHOME设置如下,注意那个路径要设置到python37下,而不是qgis的bin下:(本机测试后发现即使不用也不影响运行)

PYTHONHOME:

C:\software\QGIS\apps\Python37\

 

4.检查配置是否成功的方法:

命令框输入python进行python编译器

执行from qgis.core  import *

如果没有提示错误,即可以认为配置成功

 

Qgis+anaconda

本人在本地机器上,使用anaconda对python环境进行管理,使用如上步骤进行配置QGIS的python和api环境时,出现了anacondaspyder无法打开的问题!

原因分析:

QGIS里面自带了python, 还有一些lib,比如qgis, numpy。这可能和一些集成开发环境,比如现在比较流行的anaconda有冲突

anaconda启动的时候,会先执行一个cw.py文件,该python文件主要工作配置anaconda的依赖python环境,文件地址:C:\software\anaconda

这个说明anaconda启动时需要配置其依赖的,当你配置了pythonpath的python环境时,导致anaconda无法顺利执行启动。删除pythonpath的环境变量后,anaconda可以正常启动。

 

解决方法

1.在anaconda中下载qgis相关包;

如果是基于anaconda下载qgis相关的库文件,而不是直接配置QGIS地址的话,能够基于anaconda的环境使用Qgis的包;

由于anaconda没有自带的qgis包,所以需要从其他渠道下载:

使用下面语句之一,从conda-forge通道下载qgis

conda install -c conda-forge qgis
conda install -c conda-forge/label/broken qgis
conda install -c conda-forge/label/cf201901 qgis
conda install -c conda-forge/label/cf202003 qgis

 

2.为QGIS单独弄一个纯粹的文本编辑器

比如,可以下载pycharm或spyder的独立版本,配置后qgis的python环境和包的位置。

 

QGIS库的介绍的使用

包的简介

所有PyQGIS库都在一个名为qgis的包下组织。但是,您通常不会直接导入qgis,因为所有有趣的库都是此主程序包中的子包; 以下是构成PyQGIS库的五个包:

PyQGIS库的五个包

qgis.core  这样可以访问整个QGIS中使用的核心GIS功能。
qgis.gui   这定义了一系列GUI小部件,您可以在自己的程序中包含这些小部件。
qgis.analysis    这提供了空间分析工具来分析矢量和栅格格式数据。
qgis.networkanalysis  这提供了构建和分析拓扑的工具。
qgis.utils  这实现了各种功能,允许您使用Python使用QGIS应用程序。

本文不对各包进行详细的介绍,具体可以查看官方文档和其他博客,推荐连接:

https://qgis.org/pyqgis/master/core/index.html

https://blog.csdn.net/fgh1991/article/details/90273203?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-1-90273203.nonecase#%E7%BB%84%E7%BB%87QGIS%20Python%E5%BA%93

示例

下面举个例子简单介绍,计算图层中所有线要素的长度:

#QGIS内置的python console可以不用导入以下两库
from qgis.core import *
import qgis.utils#获取指定名称图层(当QGIS项目打开时,可以使用下面语句读取图层)
layer = QgsProject.instance().mapLayersByName("topo_centerroad")[0]
"""
#读取shp文件获取图层
lines_shp = os.path.join(TEST_DATA_DIR, 'lines.shp')
layer = QgsVectorLayer(lines_shp, 'Lines', 'ogr')
"""
#定义坐标转换
transf = QgsCoordinateTransform(QgsCoordinateReferenceSystem("EPSG:4326"),QgsCoordinateReferenceSystem("EPSG:3395"), QgsProject.instance())#计算图层要素长度
for feature in layer.getFeatures():#获取图层要素属性id=str(feature.attribute('objectid'))#获取图层要素几何geom=feature.geometry()#图层几何坐标转换geom.transform(transf)#要素长度计算length=geom.length()print("道路ID "+id+":"+str(length)+'米')

python调用QGIS中的算法

QGIS除了基础的计算函数(例如计算几何长度)外,还存在一些更加高级的算法,存在于QGIS的工具箱当中,例如最短路径算法。这些算法在QGIS中不是直接用一个函数的继续封装,需要基于另外一套方法进行调用。

首先从QGIS中导入QgsNativeAlgorithms和processing包,值得注意的是processing是在python插件目录下,不是QGIS中的那个。

from qgis.analysis import QgsNativeAlgorithms 
#相对路径 
gis_path = sys.executable process_path = qgis_path.split('apps')[0] + 'apps\qgis\python\plugins' 
sys.path.append(process_path)#绝对路径 
#sys.path.append(r'E:\software\QGIS\apps\qgis\python\plugins') 
# processing是插件!! 
import processing from processing.core.Processing import Processing

然后是初始化、调用和关闭:

qgs = QgsApplication([], False) 
qgs.initQgis() Processing.initialize() QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms()) processing.run("native:symmetricaldifference", {'INPUT': input[i], 'OVERLAY': over[i], 'OUTPUT': output[i]}) qgs.exitQgis()

核心是processing.run,输入参数包括算法ID,和算法的参数

 

算法ID的查询(如上算法native:symmetricaldifference)

1.通过算法查询所有算法

from qgis.core import QgsApplicationfor alg in QgsApplication.processingRegistry().algorithms():print("{}:{} --> {}".format(alg.provider().name(), alg.name(), alg.displayName()))

2.从QGIS的工具箱内查询ID,如下图所示:

uploading.4e448015.gif正在上传…重新上传取消

uploading.4e448015.gif正在上传…重新上传取消转存失败重新上传取消uploading.4e448015.gif转存失败重新上传取消uploading.4e448015.gif正在上传…重新上传取消uploading.4e448015.gif转存失败重新上传取消

 

算法的参数的查询

使用QGIS工具箱执行后,可以日志面板查看输入的参数类型和格式

uploading.4e448015.gif正在上传…重新上传取消uploading.4e448015.gif转存失败重新上传取消uploading.4e448015.gif转存失败重新上传取消uploading.4e448015.gif正在上传…重新上传取消uploading.4e448015.gif转存失败重新上传取消