目录
简介
配置
Qgis+anaconda
原因分析:
解决方法
QGIS库的介绍与使用
包的简介
示例
python调用QGIS中的算法
示例
算法ID的查询(如上算法native:symmetricaldifference)
算法的参数的查询
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 *
如果没有提示错误,即可以认为配置成功
本人在本地机器上,使用anaconda对python环境进行管理,使用如上步骤进行配置QGIS的python和api环境时,出现了anaconda和spyder无法打开的问题!
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环境和包的位置。
所有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)+'米')
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,和算法的参数
1.通过算法查询所有算法
from qgis.core import QgsApplication
for alg in QgsApplication.processingRegistry().algorithms():
print("{}:{} --> {}".format(alg.provider().name(), alg.name(), alg.displayName()))
2.从QGIS的工具箱内查询ID,如下图所示:
使用QGIS工具箱执行后,可以日志面板查看输入的参数类型和格式