本文完整代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

  QGIS随着近些年的发展,得益于其开源免费的特点,功能不断被世界各地的贡献者们开发完善,运算速度也非常出色,使得越来越多的Giser们从臃肿缓慢的Arcgis等传统平台转向QGIS

图1

  最重要的是,QGIS面向Python的接口PyQgis不仅可以用来开发QGIS插件,还可以配合Conda完美地避开路径配置的过程,直接与Conda虚拟环境集成在一起,从而随心所欲地在jupyter notebook之类的编辑器中书写Python代码调用各种QGIS中的地理计算功能,进而弥补geopandas在某些功能上的尚未完善之处。

图2

  本文就将为大家展示如何集成QGISConda环境里,并基于建好的环境在jupyter lab中调用QGIS从而解决实际计算问题。

2 配置QGIS+Conda+jupyter lab

  接下来我们从0开始,完整地展示如何构建QGIS+Conda+jupyter lab的集成。

  在已经正确安装和配置anacondaminiconda的机器上,在终端执行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中没有现成的创建渔网功能,下面我们就以为重庆市创建渔网为例

  首先我们导入对应的重庆市域矢量文件,这里的可视化需要matplotlibdescartes两个库的支持,请确保已经安装好它们:

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

  通过这样的方式,我们就可以实现在外部编辑器中灵活调用QGIS工具的目的。


  以上就是本文的全部内容,欢迎在评论区与我进行讨论~

(数据科学学习手札94)QGIS+Conda+jupyter玩转Python GIS的更多相关文章

  1. (数据科学学习手札81)conda+jupyter玩转数据科学环境搭建

    本文示例yaml文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在使用Python进行数据分析时,很 ...

  2. (数据科学学习手札64)在jupyter notebook中利用kepler.gl进行空间数据可视化

    一.简介 kepler.gl是由Uber开发的进行空间数据可视化的开源工具,是Uber内部进行空间数据可视化的默认工具,通过其面向Python开放的接口包keplergl,我们可以在jupyter n ...

  3. (数据科学学习手札95)elyra——jupyter lab最强插件

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 jupyter lab是我最喜欢的编辑器,在过往 ...

  4. (数据科学学习手札95)elyra——jupyter lab平台最强插件集

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 jupyter lab是我最喜欢的编辑器,在过往 ...

  5. (数据科学学习手札08)系统聚类法的Python源码实现(与Python,R自带方法进行比较)

    聚类分析是数据挖掘方法中应用非常广泛的一项,而聚类分析根据其大体方法的不同又分为系统聚类和快速聚类,其中系统聚类的优点是可以很直观的得到聚类数不同时具体类中包括了哪些样本,而Python和R中都有直接 ...

  6. (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg

    *从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...

  7. (数据科学学习手札72)用pdpipe搭建pandas数据分析流水线

    1 简介 在数据分析任务中,从原始数据读入,到最后分析结果出炉,中间绝大部分时间都是在对数据进行一步又一步的加工规整,以流水线(pipeline)的方式完成此过程更有利于梳理分析脉络,也更有利于查错改 ...

  8. (数据科学学习手札75)基于geopandas的空间数据分析——坐标参考系篇

    本文对应代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一篇文章中我们对geopandas中的数据结 ...

  9. (数据科学学习手札55)利用ggthemr来美化ggplot2图像

    一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...

随机推荐

  1. Python while 中简单的语句组

    Python while 中简单的语句组: 只使用 while: # 简单的语句组 a = 4 b = 8 num = 0 while a < b: print("a 比 b 小&qu ...

  2. filter 函数基本写法

    filter 返回一个符合要求的元素所构成的新列表 filter(函数,可迭代对象)   map 和 filter 混合使用将 lst_num 中为偶数的取出来进行加2 和 乘2 操作   2020- ...

  3. Codeforces Round #649 (Div. 2) E. X-OR 交互 二进制 随机 期望

    LINK:X-OR 本来是应该昨天晚上发的 可是昨天晚上 做这道题 写了一个分治做法 一直wa 然后查错 查不出来 心态崩了 想写对拍 发现交互库自己写不出来. 一系列sb操作 == 我都醉了. 今天 ...

  4. Spring Validation最佳实践及其实现原理,参数校验没那么简单!

    之前也写过一篇关于Spring Validation使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂Spring Validation.本文会详细介绍Spring Validation各种场景下 ...

  5. JQuery插件,轻量级表单模型验证(续 一)

    之前的代码结构,不方便扩展多结构的模型验证 重新结构设计了一下验证模型核心 var validateForm = (function(model) { model.Key = "[data- ...

  6. 6月28日考试 题解(GCD约分+动态规划+树状数组二维偏序)

    前言:考的一般般吧……T3暴力没打上来挺可惜的,到手的75分没了. ---------------------------------- T1 [JZOJ4745]看电影 Description 听说 ...

  7. Android 的Fragment组件(写完放假。。。)

    今天写的有点晚,做个题目有点慢,然后搞其他事搞定就到了0点,总结下就差不多该睡了. 今天学长讲的是Fragment: 一个可以将activity拆分成几个完全独立封装的可重用的组件,每个组件有自己的生 ...

  8. 密码学系列——常见的加密方式(c#代码实操)

    前言 说起加密方式,其实密码学的角度ASCII编码其实本身就是一种加密解密. 由于其公开,现在用于数字与字符的转换. 查看ASCII表可以去官网查查. 转换代码如下: static void Main ...

  9. 用Python玩连连看是什么效果?

    1.前言 Python实现的qq连连看辅助, 仅用于学习, 请在练习模式下使用, 请不要拿去伤害玩家们... 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道 ...

  10. Make Windows 10 Comfortable

    在 StartUp 目录中(在当前用户目录下), 创建.bat, 里面可以写希望登录指定的命令(如使用subst进行映射, 将常用的目录映射为磁盘驱动器) 在 %USERPROFILE%(也就是用户家 ...