本文完整程式碼及資料已上傳至我的
Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotes
1 簡介
QGIS
隨著近些年的發展,得益於其開源免費的特點,功能不斷被世界各地的貢獻者們開發完善,運算速度也非常出色,使得越來越多的Giser
們從臃腫緩慢的Arcgis
等傳統平臺轉向QGIS
。
![(資料科學學習手札94)QGIS+Conda+jupyter玩轉Python GIS](https://i.iter01.com/images/cb8ff45557c0927761834c6b8b40f208285e3590f935ea0a7fe44652f2ab1411.png)
最重要的是,QGIS
面向Python
的介面PyQgis
不僅可以用來開發QGIS
外掛,還可以配合Conda
完美地避開路徑配置的過程,直接與Conda
虛擬環境整合在一起,從而隨心所欲地在jupyter notebook
之類的編輯器中書寫Python
程式碼呼叫各種QGIS
中的地理計算功能,進而彌補geopandas
在某些功能上的尚未完善之處。
![(資料科學學習手札94)QGIS+Conda+jupyter玩轉Python GIS](https://i.iter01.com/images/64a06a27084832b56d9624255e178623e6b0dce49d9903fa71a4bb080af9d2e5.png)
本文就將為大家展示如何整合QGIS
到Conda
環境裡,並基於建好的環境在jupyter lab
中呼叫QGIS
從而解決實際計算問題。
2 配置QGIS+Conda+jupyter lab
接下來我們從0開始,完整地展示如何構建QGIS
+Conda
+jupyter lab
的整合。
在已經正確安裝和配置anaconda
或miniconda
的機器上,在終端執行conda create -n QGIS python=3.7 -y
來建立一個Python
虛擬環境,這裡選擇3.7
版本的Python
。
![(資料科學學習手札94)QGIS+Conda+jupyter玩轉Python GIS](https://i.iter01.com/images/fc975bae676ae1eed507949565ba0fbb789752082abc009997b5657e4ae9b94d.png)
接下來我們執行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
應用:
![(資料科學學習手札94)QGIS+Conda+jupyter玩轉Python GIS](https://i.iter01.com/images/bee9c9f249bd7237351a08aada0909c45dfd5916c5460d6ba171191d99a0b908.png)
但這並不是本文的重點,我們關注的是如何實現在jupyter lab
裡寫程式碼呼叫QGIS
功能,接下來我們來安裝jupyter lab
:
conda install nodejs jupyterlab -y
安裝完成後我們執行jupyter lab
來啟動它:
![(資料科學學習手札94)QGIS+Conda+jupyter玩轉Python GIS](https://i.iter01.com/images/d1dcd2f20eeac3c67aff8e06631c55a819e94000afee821e42f0f8c91f322f2e.png)
接著我們建立新的notebook,測試一下QGIS
是否可以正確匯入:
![(資料科學學習手札94)QGIS+Conda+jupyter玩轉Python GIS](https://i.iter01.com/images/297f821cd28b0f9914dd23d90b065b7f858ab6d0283dc8a2cea726100604ec23.png)
如果你可以成功執行上述程式碼,那麼恭喜你已經完成了所有環境配置工作,因為是整合在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
功能,譬如漁網建立工具:
![(資料科學學習手札94)QGIS+Conda+jupyter玩轉Python GIS](https://i.iter01.com/images/b8b0b79257c2c88158977545299c858529086fe2099fe6b079ba48026aa1f3fd.png)
正好geopandas
中沒有現成的建立漁網功能,下面我們就以為重慶市建立漁網為例。
首先我們匯入對應的重慶市域向量檔案,這裡的視覺化需要matplotlib
和descartes
兩個庫的支援,請確保已經安裝好它們:
import geopandas as gpd
# 從向量檔案建立QGIS圖層
chongqing = QgsVectorLayer('重慶市.geojson')
gpd.read_file('重慶市.geojson').plot();
![(資料科學學習手札94)QGIS+Conda+jupyter玩轉Python GIS](https://i.iter01.com/images/8008e98e1c2164133e2dffbd7b6eb65049f7d53359121ab0b026e9894aca9952.png)
接著我們就需要使用到前面列印功能列表時看到的Create grid
功能,通過下面的方式可以檢視所有在功能列表中出現的演算法:
from processing import algorithmHelp
# 檢視漁網建立工具的說明文件
algorithmHelp("native:creategrid")
![(資料科學學習手札94)QGIS+Conda+jupyter玩轉Python GIS](https://i.iter01.com/images/7df35cfde0cf44d54ae45b77a739a4c6b392b2c4bdea4a7eaa55c0a5929d0c35.png)
如果你使用過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
中檢視漁網結果:
![(資料科學學習手札94)QGIS+Conda+jupyter玩轉Python GIS](https://i.iter01.com/images/8e1795d271fb46a584a9d1970db0bc0783e2409e02b77077518783aa4887d87a.png)
通過geopandas
檢視座標參考系資訊:
![(資料科學學習手札94)QGIS+Conda+jupyter玩轉Python GIS](https://i.iter01.com/images/bc613cff06aad2617eccd43e3948a4e059662a26b4de754b8039d31bf79b52ac.png)
通過這樣的方式,我們就可以實現在外部編輯器中靈活呼叫QGIS
工具的目的。
以上就是本文的全部內容,歡迎在評論區與我進行討論~