地理信息可视化——Python之matplotlib Basemap简介

 

在数据可视化过程中,我们常常需要将数据根据其采集的地理位置在地图上显示出来。比如说我们会想要在地图上画出城市,飞机的航线,乃至于军事基地等等。通常来说,一个地理信息系统都会带有这样的功能。今天我们讨论如何在Python上实现,并且使用免费的工具包。

 

matplotlib是python上常用的一个数据绘制包。它基于numpy(numpy是python用于数组运算的一个包)。matplotlib具有强大的数据绘制功能,可以轻易地画出各种统计图形,比如散点图,条行图,饼图等等。而Matplot中的basemap则允许我们绘制出地图,并在地图上继续画出数据。

( matplotlib经常与numpy和scipy相配合,用于科学研究。他们是Matlab的强劲对手,这相当可以理解,因为Matlab一套需要好几千块,而python工具则是免费的。)

我们今天的目标是用上述工具画出亚洲主要城市的人口。如下图所示,人口的多少以橙色小圆圈的大小表示:

数据如下(我从Wikipedia上整理的,你可以随意使用),我将数据保存在文件major_city:


[python]   view plain copy
  1. Shanghai 23019148  31.23N  121.47E  China  
  2. Mumbai   12478447  18.96N  72.82E   India  
  3. Karachi  13050000  24.86N  67.01E   Pakistan  
  4. Delhi    16314838  28.67N  77.21E   India  
  5. Manila   11855975  14.62N  120.97E  Philippines  
  6. Seoul    23616000  37.56N  126.99E  Korea(South)  
  7. Jakarta  28019545   6.18S  106.83E  Indonesia  
  8. Tokyo    35682460  35.67N  139.77E  Japan  
  9. Peking   19612368  39.91N  116.39E  China  
第一列是城市名,第二列是人口,第三第四列为纬度和经度,最后一列为所在国家。


下面是我的Python代码:

[python]   view plain copy
  1. # Written by Vamei, http://www.cnblogs.com/vamei/  
  2. # Feel free to use or modify this script.  
  3.   
  4. from mpl_toolkits.basemap import Basemap  
  5. import matplotlib.pyplot as plt  
  6. import numpy as np  
  7.   
  8. #============================================# read data  
  9. names = []  
  10. pops  = []  
  11. lats  = []  
  12. lons  = []  
  13. countries = []  
  14. for line in file("../data/major_city"):  
  15.     info = line.split()  
  16.     names.append(info[0])  
  17.     pops.append(float(info[1]))  
  18.     lat  = float(info[2][:-1])  
  19.     if info[2][-1] == 'S': lat = -lat  
  20.     lats.append(lat)  
  21.     lon  = float(info[3][:-1])  
  22.     if info[3][-1] == 'W': lon = -lon + 360.0  
  23.     lons.append(lon)  
  24.     country = info[4]  
  25.     countries.append(country)  
  26.   
  27. #============================================  
  28. # set up map projection with  
  29. # use low resolution coastlines.  
  30. map = Basemap(projection='ortho',lat_0=35,lon_0=120,resolution='l')  
  31. # draw coastlines, country boundaries, fill continents.  
  32. map.drawcoastlines(linewidth=0.25)  
  33. map.drawcountries(linewidth=0.25)  
  34. # draw the edge of the map projection region (the projection limb)  
  35. map.drawmapboundary(fill_color='#689CD2')  
  36. # draw lat/lon grid lines every 30 degrees.  
  37. map.drawmeridians(np.arange(0,360,30))  
  38. map.drawparallels(np.arange(-90,90,30))  
  39. # Fill continent wit a different color  
  40. map.fillcontinents(color='#BF9E30',lake_color='#689CD2',zorder=0)  
  41. # compute native map projection coordinates of lat/lon grid.  
  42. x, y = map(lons, lats)  
  43. max_pop = max(pops)  
  44. # Plot each city in a loop.  
  45. # Set some parameters  
  46. size_factor = 80.0  
  47. y_offset    = 15.0  
  48. rotation    = 30  
  49. for i,j,k,name in zip(x,y,pops,names):  
  50.     size = size_factor*k/max_pop  
  51.     cs = map.scatter(i,j,s=size,marker='o',color='#FF5600')  
  52.     plt.text(i,j+y_offset,name,rotation=rotation,fontsize=10)  
  53.   
  54. plt.title('Major Cities in Asia & Population')  
  55. plt.show()  

程序分为两个部分,第一部分为从文件读取数据并处理,第二部分是用basemap绘图。

map = Basemap(projection='ortho',lat_0=35,lon_0=120,resolution='l')

设置了地图投影的方法。从球形的地球表面投影到平面地图有许多方法可以选择,得到的结果也非常不同。

我们的经纬度通过

x, y = map(lons, lats)

语句转换为图像上的位置,并通过

cs= map.scatter(i,j,s=size,marker='o',color='#FF5600')

画散点图的方法在地图上画出来。

 

文中的需要的软件包包括:

numpy, matplotlib, mpl_toolkits

你可以google并找到相关文档。

 

你可以使用pip来下载安装各个包。

在Ubuntu的repository中,你可以找到python-matplotlib包。

参考 Python小技巧

 

 

另外,如果是也可以下载epd python。它整合了python以及所有的软件包。(epd python是商业版,但对于学术用户免费。)


作者:Vamei    原文出处链接:http://www.cnblogs.com/vamei

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种广泛应用于地理空间数据可视化的编程语言。Python提供了众多强大的库和工具,使地理空间数据的可视化变得简单和高效。 首先,Python的地理空间数据可视化库包括例如GeoPandas、Folium、Basemap和Cartopy等。GeoPandas是一个基于Pandas的地理数据管理和分析库,可以处理地理数据、绘制地理空间图和进行地理数据分析。Folium是一个用于创建交互式地图的库,可以轻松地添加指向地理位置的标记、多边形区域和各种图层。Basemap是一个用于绘制地理地图的库,可以绘制各种地理特征,如陆地、湖泊、河流和国界等。Cartopy是一个专注于地图绘制的库,可以生成各种类型的地图,包括等值线图、等高线图和等距投影图等。 其次,Python还支持与其他工具和库的集成,例如Matplotlib、Seaborn和Plotly等。Matplotlib是一个广泛使用的绘图库,可以创建各种类型的图表,包括散图、柱状图和饼图等。Seaborn是一个基于Matplotlib的高级数据可视化库,提供了更多的统计图表和数据可视化的样式。Plotly是一个交互式图表库,可以创建漂亮的地理空间可视化图,并支持与Web应用程序的集成。 最后,Python的地理空间数据可视化能力也得益于其丰富的社区支持和资源。用户可以利用在线教程、文档和示例代码来学习和掌握地理空间数据可视化的技术和方法。 总之,通过Python,我们可以利用其强大的地理空间数据可视化库和工具,轻松地处理、分析和可视化地理空间数据,帮助我们更好地理解和展示地理信息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值