當前時點的晝夜地理區域分佈圖

import datetime
import matplotlib.pyplot as plt
import numpy as np

from mpl_toolkits.basemap import Basemap

# setup miller projection
basemap = Basemap(projection="mill",
                  resolution="h",
                  area_thresh=0.1,
                  llcrnrlon=-180,
                  llcrnrlat=-90,
                  urcrnrlon=180,
                  urcrnrlat=90)

# draw coastlines
basemap.drawcoastlines(linewidth=0.6,zorder=2)
# draw mapboundary
basemap.drawmapboundary(fill_color="aqua")
# fill continents with color "coral", and lake "aqua"
basemap.fillcontinents(color="coral",lake_color="aqua",zorder=1)
# draw meridians and parallels
basemap.drawmeridians(np.arange(-120,150,60),linewidth=0.6,labels=[0,0,0,1])
basemap.drawparallels(np.arange(-60,80,30),linewidth=0.6,labels=[1,0,0,0])

# shade the night areas, and use current time in UTC
date = datetime.datetime.utcnow()
basemap.nightshade(date)

# format title with date and time
content = "Shade dark regions of the map %s (UTC)"
dtFormat = "%d %b %Y %H:%M:%S"
stringTime = date.strftime(dtFormat)
plt.title(content % stringTime,fontsize=15)

plt.show()

我們可以使用類 Basemap 的實例方法 nightshade()繪製當前時點的白天和黑夜的地理區域分佈圖。這樣,就可以觀察任何我們關注的地理區域的晝夜分佈情況。前面介紹過澳大利亞的首都和各個首府城市的人口情況,現在我們具體考察一下南半球的晝夜分佈情況,同時也看看同樣處在南半球的澳大利亞的晝夜分佈情況。下面,以Python代碼的形式,具體講解繪製當前時點的晝夜地理區域分佈圖的實現方法。

2.代碼精講
從效果圖(請讀者根據以上代碼自行生成效果圖)中可以看到,澳大利亞已經有部分地理區域和城市進入黑夜,例如,布里斯班和悉尼已經進入黑夜了,但是大部分的地理區域和城市還處在白天。
接下來,我們就詳細講解“代碼實現”部分的關鍵語句和實現細節。
導入內置模塊datetime和類Basemap,這是繪製晝夜地理區域分佈圖的關鍵操作步驟。
調用類 Basemap 的構造函數生成實例 basemap,其中,地圖投影模式是“Miller Cylindrical”,也就是說,參數 projection 的取值是“mill”。其他參數的含義和取值在前面已經詳細介紹過了,這裏就不再詳細解釋。
類似地,我們同樣繪製海岸線和地圖邊界,填充大陸和湖泊顏色,繪製經度線和緯度線。
調用內置模塊datetime裏的類datetime的方法utcnow(),返回當前的世界協調時間(Universal Time Coordinated,UTC)形式的類datetime的實例,存儲在變量date中。
調用類Basemap的實例basemap的實例方法nightshade(),繪製當前時點是黑夜的地理區域,這些地理區域的填充顏色是透明度爲0.5的黑色。也就是說,實例方法nightshade()的參數color的默認取值是黑色,參數alpha的默認取值是0.5。
調用內置模塊datetime裏的類date的實例方法strftime()。由於類datetime是類date的子類,所以變量date也可以調用方法strftime(),按照指定日期和時間的格式“%d%b%Y%H:%M:%S”,轉換成定製風格的字符串,使用變量stringTime存儲“date.strftime(dtFormat)”語句的返回值。
調用模塊pyplot的API,具體來講,就是調用函數title(),展示當前時點說明地圖內容的文本。
這樣,我們就完成了繪製當前時點的晝夜地理區域分佈圖的可視化任務。

3.內容補充
由於matplotlib 3.0.1與basemap 1.1.x及以上版本(例如,basemap 1.2.0)不兼容,因此,讀者需要使用不同的matplotlib版本(例如,matplotlib 2.2.3),或者使用basemap 1.1.x 以下的版本(例如,basemap 1.0.7)。這樣,matplotlib 2.2.3搭配basemap 1.2.0,或者matplotlib 3.0.1搭配basemap 1.0.7,或者matplotlib 3.0.2搭配basemap 1.2.0,都是可以考慮的組合方式。在Python 3.5及以上版本的環境下,纔可以安裝matplotlib 3.0.x。也就是說,matplotlib 3.0.x僅僅支持Python 3.5及以上版本。
如果運行結果出現提示信息,這是由於 matplotlib 版本的不同所導致的,使用 matplotlib 2.0.0及以上版本,提示信息就不會出現了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章