1. 程式人生 > >(資料科學學習手札94)QGIS+Conda+jupyter玩轉Python GIS

(資料科學學習手札94)QGIS+Conda+jupyter玩轉Python GIS

> 本文完整程式碼及資料已上傳至我的`Github`倉庫[https://github.com/CNFeffery/DataScienceStudyNotes](https://github.com/CNFeffery/DataScienceStudyNotes) # 1 簡介   `QGIS`隨著近些年的發展,得益於其開源免費的特點,功能不斷被世界各地的貢獻者們開發完善,運算速度也非常出色,使得越來越多的`Giser`們從臃腫緩慢的`Arcgis`等傳統平臺轉向`QGIS`。
圖1
  最重要的是,`QGIS`面向`Python`的介面`PyQgis`不僅可以用來開發`QGIS`外掛,還可以配合`Conda`完美地避開路徑配置的過程,直接與`Conda`虛擬環境整合在一起,從而隨心所欲地在`jupyter notebook`之類的編輯器中書寫`Python`程式碼呼叫各種`QGIS`中的地理計算功能,進而彌補`geopandas`在某些功能上的尚未完善之處。
圖2
  本文就將為大家展示如何整合`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`。
圖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`也安裝了: ```bash conda install -c conda-forge geopandas -y ```   接下來我們先來檢視所有可用的`QGIS`中的演算法功能: ```Python # 檢視可用的所有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`兩個庫的支援,請確保已經安裝好它們: ```Python import geopandas as gpd # 從向量檔案建立QGIS圖層 chongqing = QgsVectorLayer('重慶市.geojson') gpd.read_file('重慶市.geojson').plot(); ```
圖8
  接著我們就需要使用到前面列印功能列表時看到的`Create grid`功能,通過下面的方式可以檢視所有在功能列表中出現的演算法: ```Python from processing import algorithmHelp # 檢視漁網建立工具的說明文件 algorithmHelp("native:creategrid") ```
圖9
  如果你使用過`QGIS`中的**漁網建立工具**,通過閱讀上述的引數說明一定很快就能明白各個引數的意義,下面我們根據自己的需求建立10000x10000米的正方形漁網: ```Python 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`工具的目的。 ---   以上就是本文的全部內容,歡迎在評論區與我進