本文完整代碼及數據已上傳至我的Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes
❞1 簡介QGIS隨著近些年的發展,得益於其開源免費的特點,功能不斷被世界各地的貢獻者們開發完善,運算速度也非常出色,使得越來越多的Giser們從臃腫緩慢的Arcgis等傳統平臺轉向QGIS。
圖1最重要的是,QGIS面向Python的接口PyQgis不僅可以用來開發QGIS插件,還可以配合Conda完美地避開路徑配置的過程,直接與Conda虛擬環境集成在一起,從而隨心所欲地在jupyter notebook之類的編輯器中書寫Python代碼調用各種QGIS中的地理計算功能,進而彌補geopandas在某些功能上的尚未完善之處。
本文就將為大家展示如何集成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。
接下來我們執行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應用:
但這並不是本文的重點,我們關注的是如何實現在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通過這樣的方式,我們就可以實現在外部編輯器中靈活調用QGIS工具的目的。
以上就是本文的全部內容,歡迎在評論區與我進行討論~