【python資料探勘課程】二十二.Basemap地圖包安裝入門及基礎知識講解

Eastmount發表於2018-01-29
這是《Python資料探勘課程》系列文章,也是我上課內容及書籍中的一個案例。本文主要講述Matplotlib子包,負責地圖繪製,即Basemap擴充套件包。在做資料探勘或視覺化分析時,常常需要將資料顯示到地圖上,比如城市人口、空氣環境、GDP分佈、資源銷售、全球熱圖等。本文主要講解安裝入門以及官網介紹的基礎知識,後面文章將結合例項深入講解。內容包括:
    1.Basemap安裝過程
    2.地圖繪製官方簡單案例
    3.Basemap繪製地圖

本篇文章為基礎性文章,希望對你有所幫助,提供些思路,如果文章中存在錯誤或不足之處,還請海涵。同時,推薦大家閱讀我以前的文章瞭解基礎知識。

前文參考:
【Python資料探勘課程】一.安裝Python及爬蟲入門介紹
【Python資料探勘課程】二.Kmeans聚類資料分析及Anaconda介紹
【Python資料探勘課程】三.Kmeans聚類程式碼實現、作業及優化
【Python資料探勘課程】四.決策樹DTC資料分析及鳶尾資料集分析
【Python資料探勘課程】五.線性迴歸知識及預測糖尿病例項
【Python資料探勘課程】六.Numpy、Pandas和Matplotlib包基礎知識
【Python資料探勘課程】七.PCA降維操作及subplot子圖繪製
【Python資料探勘課程】八.關聯規則挖掘及Apriori實現購物推薦
【Python資料探勘課程】九.迴歸模型LinearRegression簡單分析氧化物資料
【python資料探勘課程】十.Pandas、Matplotlib、PCA繪圖實用程式碼補充
【python資料探勘課程】十一.Pandas、Matplotlib結合SQL語句視覺化分析
【python資料探勘課程】十二.Pandas、Matplotlib結合SQL語句對比圖分析
【python資料探勘課程】十三.WordCloud詞雲配置過程及詞頻分析
【python資料探勘課程】十四.Scipy呼叫curve_fit實現曲線擬合
【python資料探勘課程】十五.Matplotlib呼叫imshow()函式繪製熱圖
【python資料探勘課程】十六.邏輯迴歸LogisticRegression分析鳶尾花資料
【python資料探勘課程】十七.社交網路Networkx庫分析人物關係(初識篇)

【python資料探勘課程】十八.線性迴歸及多項式迴歸分析四個案例分享

【python資料探勘課程】十九.鳶尾花資料集視覺化、線性迴歸、決策樹花樣分析

【python資料探勘課程】二十.KNN最近鄰分類演算法分析詳解及平衡秤TXT資料集讀取

【python資料探勘課程】二十一.樸素貝葉斯分類器詳解及中文文字輿情分析



安裝包及程式碼CSDN下載地址:http://download.csdn.net/download/eastmount/10230303
為何現在不能上傳免費資源了,可惜啦!




一. Basemap安裝過程


安裝方法作者強推這篇文章: 
神農嘗百草---Windows環境下為Python3.X安裝basemap

這裡作者只做簡單介紹,我們從非官網網站下載下面兩個擴充套件包,cp27表示Python2.7版本,Windows下64位環境,你需要找到適合自己環境的檔案。下載地址為:https://www.lfd.uci.edu/~gohlke/pythonlibs/

  • basemap‑1.1.0‑cp27‑cp27m‑win_amd64.wh
  • pyproj‑1.9.5.1‑cp27‑cp27m‑win_amd64.whl



接下來使用PIP命令去到whl檔案所在目錄,然後分別進行安裝。
先安裝Pyproj,再安裝Basemap擴充套件包,命令如下:
cd C:\Software\Program Software\Python\Scripts\basemap
pip install pyproj-1.9.5.1-cp27-cp27m-win_amd64.whl
pip install basemap-1.1.0-cp27-cp27m-win_amd64.whl
安裝如下圖所示,顯示"Successfully installed basemap-1.1.0"表示安裝成功。



接下來呼叫該擴充套件包,不再報錯即表示安裝成功。







二. 地圖繪製官方簡單案例


首先作者給出官方文件的介紹以及簡單案例,讓讀者體會下Basemap的魅力。
官方網址:
https://matplotlib.org/basema


介紹
Basemap工具包是Matplotlib包的子包,一個用於在Python繪製2D資料至地圖的庫,它提供了將座標轉化為25中不同地圖投影的功能,然後呼叫Matplotlib擴充套件包繪製輪廓、影象和座標點等。該擴充套件包提供了海岸線、河流、政治邊界資料集以及繪製方法。其中GEOS庫在內部用於將海岸線和邊界特徵剪下到所需的地圖投影區域。

示例
下面給出官網的翻譯示例,源地址:https://matplotlib.org/basemap/users/geography.html

Basemap包括GSSH(現在是GSHHG)海岸線資料集以及GMT格式的河流、州和國家邊界的資料集。這些資料集可以用來以不同的解析度繪製海岸線、河流和政治邊界地圖。相關方法如下:
    drawcoastlines(): 繪製海岸線。
    fillcontinents(): 通過填充海岸線多邊形為地圖著色。
    drawcountries(): 繪製國家邊界。
    drawstates(): 在北美繪製狀態邊界。
    drawrivers(): 繪製河流。


此外,可以將影象用作地圖背景,而不是繪製海岸線和政治邊界。Basemap提供了以下幾個選項:
    drawlsmask(): 繪製高解析度的海陸影象,指定陸地和海洋的顏色,資料來源於GSHHS海岸線。
    bluemarble(): 繪製NASA藍色大理石影象作為地圖背景。
    shadedrelief(): 繪製陰影浮雕影象作為地圖背景。
    etopo(): 繪製一張etopo浮雕影象作為地圖背景。
    warpimage():  使用abitrary影象作為地圖背景,必須是全球新的,從國際日東線向東和南極以北覆蓋世界。


1.繪製海岸線、填充海洋和陸地區域
程式碼

# -*- coding: utf-8 -*-
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

# 設定basemap-Lambert Conformal 
m = Basemap(width=12000000,height=9000000,projection='lcc',
            resolution='c',lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.)

# 繪製海岸線
m.drawcoastlines()
# 在地圖周圍繪製邊界並填充背景aqua(這個背景最終成為海洋的顏色)
# 將大洲繪製在最上面
m.drawmapboundary(fill_color='aqua')

# 填充大陸coral顏色,並設定湖泊顏色為blue
m.fillcontinents(color='coral',lake_color='blue')
plt.show()
繪製圖形如下所示:



2.繪製一幅海陸罩(land-sea mask)影象
程式碼
# -*- coding: utf-8 -*-
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

# 設定basemap Lambert-Conformal 
# 設定解析度引數resolution=None 跳過處理邊界資料集
m = Basemap(width=12000000,height=9000000,projection='lcc',
            resolution=None,lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.)

# 為地圖背景繪製海陸罩
# lakes=True 意味著內陸湖和海洋顏色一致
m.drawlsmask(land_color='coral',ocean_color='aqua',lakes=True)
plt.show()
繪製如下圖所示:



3.繪製美國宇航局藍色大理石影象(the NASA Blue Marble)
程式碼

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

m = Basemap(width=12000000,height=9000000,projection='lcc',
            resolution=None,lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.)
m.bluemarble()
plt.show()
繪製如下圖所示:



4.繪製帶陰影的浮雕影象
程式碼

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

m = Basemap(width=12000000,height=9000000,projection='lcc',
            resolution=None,lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.)
m.shadedrelief()
plt.show()
繪製如下圖所示:



5.繪製etopo浮雕影象
程式碼

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

m = Basemap(width=12000000,height=9000000,projection='lcc',
            resolution=None,lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.)
m.etopo()
plt.show()
繪製如下圖所示:







三. Basemap繪製地圖


可能讀者已經發現了,Basemap擴充套件包是繪製地圖最重要的一個庫,所以作者先講解該庫函式。同時,由於作者沒有找到系統的引數介紹,只能摸著石頭過河學習,也希望對您有點幫助。

為方便呈現,需要將三維球座標系轉換為二維笛卡爾座標系,利用地圖投影(Map Projection)實現。
官網給出的25種對映方式如下:https://matplotlib.org/basemap/users/mapsetup.html



m = Basemap(width=12000000,height=9000000,projection='lcc',
                       resolution=None,lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.)

引數介紹如下:
    width:寬度。
    height:高度。
    projection='lcc':表示規定的投影方法,改變投影方法繪製的結果也將不同,25種方式。
    resolution=None:表示跳過處理邊界資料集。
    lat_0=50: 維度設定為50(Latitude,值為-90到90)。
    lon_0=-107:經度設定為-107(Longitude,值為-180到180)。
示例參考:https://matplotlib.org/basemap/users/aeqd.html

# -*- coding: cp936 -*-
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt

width = 28000000; lon_0 = -105; lat_0 = 40
m = Basemap(width=width,height=width,projection='aeqd',
            lat_0=lat_0,lon_0=lon_0)

# 填充背景
m.drawmapboundary(fill_color='aqua')
# 繪製海岸線並填充大陸
m.drawcoastlines(linewidth=0.5)
m.fillcontinents(color='coral',lake_color='aqua')
# 20度經緯度,範圍-80到81 -180到180
m.drawparallels(np.arange(-80,81,20))
m.drawmeridians(np.arange(-180,180,20))
# 在中心繪製一個黑點
xpt, ypt = m(lon_0, lat_0)
m.plot([xpt],[ypt],'ko')
# 繪製標題
plt.title('Azimuthal Equidistant Projection')
plt.show()
繪製圖形如下圖所示:




m = Basemap(projection='merc',llcrnrlat=-80,urcrnrlat=80,
                       llcrnrlon=-180,urcrnrlon=180)

引數介紹如下:
    projection=merc':表示規定的投影方法,墨卡託投影(Mercator Projection),廣泛應用谷歌地圖。
    llcrnrlat=-80:所需地圖域左下角的緯度(度)Latitude
    urcrnrlat=80:所需地圖域的右上角的緯度(度)Latitude。
    llcrnrlon=-180:所需地圖域左下角的經度(度)Longitude。
    urcrnrlon=180:所需地圖域(度)的右上角的經度Longitude。
示例:

# -*- coding: utf-8 -*-
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

m = Basemap(projection='merc', llcrnrlat=-80, urcrnrlat=80,
            llcrnrlon=-180, urcrnrlon=180)
m.drawcoastlines()
plt.show()
繪製圖形如下所示:



同時,繪製一個城市點程式碼的常見兩種方式如下:

# 上海經緯度 (31.23N,121.47E)
x = 31.23
y = 121.47
xpt, ypt = m(x,y)
m.scatter(xpt,ypt,s=2)

x = 31.23
y = 121.47
xpt, ypt = m(x,y)
m.plot([xpt],[ypt],'ko')


最後給出比較好的參考資料,供自己和大家後面學習。希望文章對大家有所幫助,該篇文章主要是個安裝引入,後面還將結合專案及管網深入介紹,如果存在錯誤或不足之處,還請海涵。
    python利用basemap疊加地圖 - 瑜之姬
    地理資訊視覺化:Python之matplotlib Basemap簡介 - dushenzhi
    BASEMAP使用筆記 - KalariKong
    Basemap視覺化地圖資訊 - zm(強推)

    [經驗總結] 一點總結:Ubuntu+anaconda+Python+basemap(+WRF) - 氣象家園
    繪圖: matplotlib Basemap簡介 - Vamei
    Creating a Choropleth Map of the World in Python using Basemap
    Basemap繪製中國地圖 - 落葉小唱
    用Python畫一箇中國地圖 - 張京(強推)


 

 




(By:Eastmount 2018-01-29 晚上7點  http://blog.csdn.net/eastmount/ )



相關文章