2014年12月19日 星期五

畫張Map存起來

Python 繪圖庫Matplotlib 搭配Basemap,可以輕易地畫出地圖並且儲存。例如NASA衛星圖片。


Matplotlib裡面提供簡單的方法,然後可以實作出大量的科學計算,並且能夠客製化製作2D圖表。

最常被應用的應該是製作地圖方面,搭配Basemap,可以輕易地畫出地圖並且儲存。例如NASA衛星圖片。


撰寫步驟:
1. 先設計一個basemap物件,用來表示地圖物件
2. 設置地圖的屬性
3. 讀取外部資訊
4. 儲存或顯示地圖


一、設計basemap

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

def practice(request):
     map = Basemap(projection='merc' , 
                              resolution='i' , fix_aspect=True,
                              llcrnrlon=119.0 , llcrnlat=21.8,
                              urcrnlon=122.05 , urcrnrlat=25.4,
                              lat_ts =20)
參數說明
1. resolution = i 表示簡單畫出海岸線 / c 表示粗線畫出海岸線
2. projection = merc 麥卡拖投影(矩形平面) / ortho 正投影(圓滾滾的地球)
3. llcrnrlat,llcrnrlon 經緯度的最低值(lower lat/lon),這裡設定台灣的經緯度
4. urcrnrlat,urcrnrlon 經緯度的最高值(upper lat/lon),這裡設定台灣的經緯度
5. lat_ts 最大緯度(我目前不知道這作用)




二、設置地圖屬性

#海岸線的寬度
map.drawcoastlines(linewidth=1)

#儲存map , dpi=100表示存成800*600
plt.savefig('practice_map' , dpi=100)

plt.show()
跑出來的圖


#畫緯度線23.5和25,labels標示出座標度數,fontsize文字大小
map.drawparallels(np.arange(23.5 , 25) , labels=[1,0,0,0] , fontsize=10)

#畫經度線120和122,labels標示出座標度數,fontsize文字大小
map.drawmeridians(np.arange(120,122),labels=[0,0,0,1],fontsize=10)

#map 底色backgroubd-color
map.drawmapboundary(fill_color='aqua')

#取一個title
plt.title('Practice')

#設定XY說明label , xy範圍0~1(預設是中間0.5)
plt.xlabel('lon' , fontsize=12 , x=1)
plt.ylabel('lat' , fontsize=12 , y=1)

三、讀取外部資訊

因為basemap提供的地圖資訊,似乎沒有到更細的資料,因此你必須透過讀取外部資訊,顯示更多的地圖資訊(縣市或鄉政),這個檔案叫做shapefile(.shp)


import shapefile

def practice(request):
     map = Basemap(projection='merc' , 
                              resolution='i' , fix_aspect=True,
                              llcrnrlon=119.0 , llcrnlat=21.8,
                              urcrnlon=122.05 , urcrnrlat=25.4,
                              lat_ts =20)

    #中間地圖屬性設定略過...

    #讀取shapefile
     map.readshapefile(shape_path , linewidth=0.25 , drawbounds=True)
這裡提供免費的shapefile




#可以畫出NASA衛星照片等等的效果
map.bluemarble()

4 則留言:

  1. 請問一下,我測式結果卡住了,可否提供台灣的shapefile 以及 shapefile.py

    回覆刪除
    回覆
    1. 這個是台灣交通部開放的shapefile檔案
      https://gist-map.motc.gov.tw/Complex/MapTopic

      用readshapefile指定正確路徑,應該就可以畫出shapefile中的資訊

      刪除
  2. 謝謝你 這是我剛好需要的Idea 感恩!

    回覆刪除