PythonGIS可视化—Matplot basemap工具箱
生活随笔
收集整理的這篇文章主要介紹了
PythonGIS可视化—Matplot basemap工具箱
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
原文鏈接:http://www.douban.com/group/topic/32821988/
原文鏈接:http://www.cnblogs.com/vamei/archive/2012/09/16/2687954.html
在數(shù)據(jù)可視化過(guò)程中,我們常常需要將數(shù)據(jù)根據(jù)其采集的地理位置在地圖上顯示出來(lái)。比如說(shuō)我們會(huì)想要在地圖上畫出城市,飛機(jī)的航線,乃至于軍事基地等等。通常來(lái)說(shuō),一個(gè)地理信息系統(tǒng)都會(huì)帶有這樣的功能。今天我們討論如何在Python上實(shí)現(xiàn),并且使用免費(fèi)的工具包。
Matplot是python上常用的一個(gè)數(shù)據(jù)繪制包。它基于numpy(numpy是python用于數(shù)組運(yùn)算的一個(gè)包)。Matplot具有強(qiáng)大的數(shù)據(jù)繪制功能,可以輕易地畫出各種統(tǒng)計(jì)圖形,比如散點(diǎn)圖,條行圖,餅圖等等。而Matplot中的basemap則允許我們繪制出地圖,并在地圖上繼續(xù)畫出數(shù)據(jù)。( Matplot經(jīng)常與numpy和scipy相配合,用于科學(xué)研究。他們是Matlab的強(qiáng)勁對(duì)手,這相當(dāng)可以理解,因?yàn)镸atlab一套需要好幾千塊,而python工具則是免費(fèi)的。)
我們今天的目標(biāo)是用上述工具畫出亞洲主要城市的人口。如下圖所示,人口的多少以橙色小圓圈的大小表示:
數(shù)據(jù)如下(我從wikipedia上整理的,你可以隨意使用),我將數(shù)據(jù)保存在文件major_city:
復(fù)制代碼
Shanghai 23019148 31.23N 121.47E China
Mumbai 12478447 18.96N 72.82E India
Karachi 13050000 24.86N 67.01E Pakistan
Delhi 16314838 28.67N 77.21E India
Manila 11855975 14.62N 120.97E Philippines
Seoul 23616000 37.56N 126.99E Korea(South)
Jakarta 28019545 6.18S 106.83E Indonesia
Tokyo 35682460 35.67N 139.77E Japan
Peking 19612368 39.91N 116.39E China
復(fù)制代碼
第一列是城市名,第二列是人口,第三第四列為緯度和經(jīng)度,最后一列為所在國(guó)家。
下面是我的Python代碼:
復(fù)制代碼
# Written by Vamei, http://www.cnblogs.com/vamei/
# Feel free to use or modify this script.
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
#============================================# read data
names = []
pops = []
lats = []
lons = []
countries = []
for line in file("../data/major_city"):
info = line.split()
names.append(info[0])
pops.append(float(info[1]))
lat = float(info[2][:-1])
if info[2][-1] == 'S': lat = -lat
lats.append(lat)
lon = float(info[3][:-1])
if info[3][-1] == 'W': lon = -lon + 360.0
lons.append(lon)
country = info[4]
countries.append(country)
#============================================
# set up map projection with
# use low resolution coastlines.
map = Basemap(projection='ortho',lat_0=35,lon_0=120,resolution='l')
# draw coastlines, country boundaries, fill continents.
map.drawcoastlines(linewidth=0.25)
map.drawcountries(linewidth=0.25)
# draw the edge of the map projection region (the projection limb)
map.drawmapboundary(fill_color='#689CD2')
# draw lat/lon grid lines every 30 degrees.
map.drawmeridians(np.arange(0,360,30))
map.drawparallels(np.arange(-90,90,30))
# Fill continent wit a different color
map.fillcontinents(color='#BF9E30',lake_color='#689CD2',zorder=0)
# compute native map projection coordinates of lat/lon grid.
x, y = map(lons, lats)
max_pop = max(pops)
# Plot each city in a loop.
# Set some parameters
size_factor = 80.0
y_offset = 15.0
rotation = 30
for i,j,k,name in zip(x,y,pops,names):
size = size_factor*k/max_pop
cs = map.scatter(i,j,s=size,marker='o',color='#FF5600')
plt.text(i,j+y_offset,name,rotation=rotation,fontsize=10)
plt.title('Major Cities in Asia & Population')
plt.show()
復(fù)制代碼
程序分為兩個(gè)部分,第一部分為從文件讀取數(shù)據(jù)并處理,第二部分是用basemap繪圖。
map = Basemap(projection='ortho',lat_0=35,lon_0=120,resolution='l')
設(shè)置了地圖投影的方法。從球形的地球表面投影到平面地圖有許多方法可以選擇,得到的結(jié)果也非常不同。
我們的經(jīng)緯度通過(guò)
x, y = map(lons, lats)
語(yǔ)句轉(zhuǎn)換為圖像上的位置,并通過(guò)
cs = map.scatter(i,j,s=size,marker='o',color='#FF5600')
畫散點(diǎn)圖的方法在地圖上畫出來(lái)。
文中的需要的軟件包包括
numpy, matplot, mpl_toolkits
你可以google并找到它們。
另外,如果是也可以下載epd python。它整合了python以及所有的軟件包。(epd python是商業(yè)版,但對(duì)于學(xué)術(shù)用戶免費(fèi)。)
總結(jié)
以上是生活随笔為你收集整理的PythonGIS可视化—Matplot basemap工具箱的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SciPy和Numpy处理能力
- 下一篇: PythonOpenCV--Rtrees