1. 程式人生 > >解決Anaconda下安裝basemap的問題

解決Anaconda下安裝basemap的問題

前言

本來早就想寫Anaconda下安裝basemap的問題,但是最近真的太忙了,這裡記錄如下。

1. 搜尋並安裝basemap

1.1 方法一:在Anaconda Navigator中下載

開啟Navigator,在Environments中的not installed 對應的右邊搜尋框搜尋 basemap,選中搜索結果中第一個(即basemap),點選Apply即可下載。
在這裡插入圖片描述

1.2 方法二:在Anaconda Prompt中下載

1)可以在navigator中開啟prompt,也可以在電腦左下角搜尋欄中搜索Anaconda Prompt開啟。

2)先輸入:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/


換成清華源。

再輸入:
conda install basemap

中間會讓你確認是否安裝,輸入y,按下Enter鍵,即可安裝。

2. 開啟spyder驗證安裝是否成功

在navigator中啟動spyder,或者在prompt中輸入spyder 啟動spyder,
輸入:
from mpl_toolkits.basemap import Basemap
執行,如果沒有報錯說明安裝成功了。

3. 設定環境變數 【問題解決】

然而!!!
最坑的是,一旦不在navigator或者prompt中啟動spyder,而是直接(在桌面快捷方式,或者左下角搜尋spyder)點開spyder的時候,你會發現執行from mpl_toolkits.basemap import Basemap

會報錯!!!

報錯資訊如下:
在這裡插入圖片描述

錯誤原因:
直接原因是:系統找不到這個叫做PROJ_LIB的環境變數,所以報錯了。
根本原因:呼叫basemap模組的時候會呼叫basemap所依賴的proj4模組,所以當時在anaconda上安裝basemap模組的時候細心的鐵汁可以看到相應的也安裝了proj4這個模組。但是最坑的是,anaconda root下安裝proj4的時候不會主動給你設定proj4模組的環境變數,所以就導致的現在這樣的錯誤。

方案2):先將Anaconda安裝目錄下找到proj4的安裝路徑,我的是在:D:\software\Anaconda\pkgs\proj4-4.9.3-hfa6e2cd_8

,然後開啟這個資料夾,進入Library -> share 資料夾,將裡面的檔案全選並複製,貼上到 D:\software\Anaconda\share\proj 這個資料夾下(如果Anaconda根目錄下沒有這個proj資料夾,就建立一個)。

在這裡插入圖片描述

複製檔案

在這裡插入圖片描述

貼上檔案到指定位置

然後,設定環境變數,即在使用者變數下新建一個就ok:

在這裡插入圖片描述

可以重啟電腦,使環境變數生效。
這樣的話再次開啟spyder 就不會出現這樣的錯誤了。

中間“碰壁”過程記錄

1)一開始瘋狂報KeyError 'PROJ_LIB'的錯,我找了好幾個網站:[1-4]

可惜,這些都沒有解決方案。

2)後來又看了幾個關於如何在anaconda下安裝basemap的網站[5-6]

3)我大概知道是proj4 的問題,我以為是proj4的版本問題,所以我在anaconda navigator下對proj4進行了版本回退,結果可能是網速或者電腦的原因,中間回退過程卡住了。

我一時手癢,強制退出了anaconda navigator,結果等我再次進入的時候,已經人是而物非,我的proj4不知道回沒回退了(忘了),但是!,我的anaconda root版本竟然從3.7版本回退到了3.6!

震驚。沒想到一個模組的版本回退會造成這樣的後果。

4)放棄了root環境下basemap的安裝,決定在之前新建的anaconda python 3.6 版本的環境中安裝basemap試試,然而,我順利安裝了basemap,但是卻無法開啟spyder。

搜尋後發現原因應該是basemap需要Qt依賴,所以新的Qt模組的安裝與spyder產生衝突,導致spyder無法開啟。

總結

最後在spyder上執行basemap模組的效果:

程式碼:

from mpl_toolkits.basemap import Basemap

import matplotlib.pyplot as plt

plt.figure(figsize=(16,8))
m = Basemap()
m.drawcoastlines()
plt.show()

在這裡插入圖片描述

輸出的世界地圖

參考文獻