1 简介
QGIS
随着近些年的发展,得益于其开源免费的特点,功能不断被世界各地的贡献者们开发完善,运算速度也非常出色,使得越来越多的Giser
们从臃肿缓慢的Arcgis
等传统平台转向QGIS
。
图1
最重要的是,QGIS
面向Python
的接口PyQgis
不仅可以用来开发QGIS
插件,还可以配合Conda
完美地避开路径配置的过程,直接与Conda
虚拟环境集成在一起,从而随心所欲地在jupyter notebook
之类的编辑器中书写Python
代码调用各种QGIS
中的地理计算功能,进而弥补geopandas
在某些功能上的尚未完善之处。
图2
本文就将为大家展示如何集成QGIS
到Conda
环境里,并基于建好的环境在jupyter lab
中调用QGIS
从而解决实际计算问题。
2 配置环境&功能演示
接下来我们从0开始,完整地展示如何构建QGIS
+Conda
+jupyter lab
的集成。
在已经正确安装和配置anaconda
或miniconda
的机器上,在终端执行conda create -n QGIS python=3.7 -y
来建立一个Python
虚拟环境,这里选择3.7
版本的Python
。
图3
接下来我们执行conda activate QGIS
激活刚刚创建好的环境之后,接着执行conda install -c conda-forge qgis -y
来直接安装QGIS
相关组件。
如果你的下载过程非常缓慢且你没有“特殊”的上网技巧,可以将-c
参数后的源更换为国内的清华大学对应镜像(https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge),因为QGIS
本身有着一定的体积且依赖包众多,这一步耐心等待完成即可。
安装成功后,直接执行qgis
命令就可以打开传统的带界面的QGIS
应用:
图4
但这并不是本文的重点,我们关注的是如何实现在jupyter lab
里写代码调用QGIS
功能,接下来我们来安装jupyter lab
:
conda install nodejs jupyterlab -y
安装完成后我们执行jupyter lab
来启动它:
图5
接着我们创建新的notebook,测试一下QGIS
是否可以正确导入:
图6
如果你可以成功执行上述代码,那么恭喜你已经完成了所有环境配置工作,因为是集成在conda
虚拟环境中的,所以我们免去了所有配置QGIS
相关路径的工作(爽翻了是不是~)。
为了方便下面的功能演示我们顺便把geopandas
也安装了:
conda install -c conda-forge geopandas -y
接下来我们先来查看所有可用的QGIS
中的算法功能:
# 查看可用的所有QGIS功能 from processing.core.Processing import Processing from qgis.analysis import QgsNativeAlgorithms Processing.initialize() QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms()) for alg in QgsApplication.processingRegistry().algorithms(): print(alg.id(), "中的", alg.displayName(), '可用!')
输出的结果内容非常之多,可以说囊括了我们常用的所有QGIS
功能,譬如「渔网创建工具」:
图7
正好geopandas
中没有现成的创建渔网功能,下面我们就以为「重庆市创建渔网为例」。
首先我们导入对应的重庆市域矢量文件,这里的可视化需要matplotlib
和descartes
两个库的支持,请确保已经安装好它们:
import geopandas as gpd # 从矢量文件创建QGIS图层 chongqing = QgsVectorLayer('重庆市.geojson') gpd.read_file('重庆市.geojson').plot();
图8
接着我们就需要使用到前面打印功能列表时看到的Create grid
功能,通过下面的方式可以查看所有在功能列表中出现的算法:
from processing import algorithmHelp # 查看渔网创建工具的说明文档 algorithmHelp("native:creategrid")
图9
如果你使用过QGIS
中的「渔网创建工具」,通过阅读上述的参数说明一定很快就能明白各个参数的意义,下面我们根据自己的需求创建10000x10000米的正方形渔网:
from processing import run chongqing = gpd.read_file('重庆市.geojson') # 获取投影坐标系下的bbox信息 total_bounds = chongqing.to_crs('EPSG:2381').total_bounds params = { 'INPUT': chongqing, 'TYPE': 2, 'EXTENT': f'{total_bounds[0]},{total_bounds[2]},{total_bounds[1]},{total_bounds[3]}', 'HSPACING': 10000, 'VSPACING': 10000, 'HOVERLAY': 0, 'VOVERLAY': 0, 'CRS': 'EPSG:2381', 'OUTPUT': '重庆10000x10000渔网测试.geojson' # 导出到外部GeoJSON文件 } feedback = QgsProcessingFeedback() run("native:creategrid", params, feedback=feedback)
在QGIS
中查看渔网结果:
图10
通过geopandas
查看坐标参考系信息:
图11