python安装basemap【在地图上绘制2D数据】

python安装basemap

basemap工具集(https://matplotlib.org/basemap/)使得我们能够用python在地图上绘制2D数据。basemap提供了许多不同的地球投影一级一种将地球上的经纬度坐标投影转换为二维matplotlib图的方式

  1. 打开网址(点这里),下载basemap和pyproj这两个安装包,找到适应自己电脑和python的对应版本
  2. 安装

​ 先执行pip install pyproj-2.6.0-cp36-cp36m-win_amd64.whl

​ 再执行 pip install basemap-1.2.1-cp36-cp36m-win_amd64.whl

  1. 如果看到提示成功,说明安装完成

绘制地图仪截面

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

#绘制地理信息相关的图像,当参数 projection 的值为 'ortho'时,将得到一个地球仪截面
plt.figure(figsize=(8, 8))
m = Basemap(projection='ortho', resolution=None, lat_0=50, lon_0=-100)
m.bluemarble(scale=0.5)
plt.show()

运行结果

在这里插入图片描述

图形化显示海地地震危机数据

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

# 绘制地图:图形化显示海地地震危机数据
path =str(os.getcwd()).replace('\\','/')
filename = path+'/datasets/ch08_data/Haiti.csv'
data = pd.read_csv(filename,engine='python') # 2010年海地地震及其余震期间搜集的数据
# 清除错误位置信息并移除缺失分类信息
data = data[(data.LATITUDE > 18) & (data.LATITUDE <20) & (data.LONGITUDE>-75) & (data.LONGITUDE<-70 ) & data.CATEGORY.notnull()]

# 获取所有分类的列表
def get_all_categories(cat_series):
    cat_sets = [set(to_cat_list(x)) for x in cat_series]
    return sorted(set.union(*cat_sets))

def to_cat_list(catstr):
    stripped = (x.strip() for x in catstr.split(',')) # 某一条数据按逗号拆分开来
    return [x for x in stripped if x]

# 将各个分类信息拆分为编码和英语名称
def get_english(cat):
    code,names = cat.split('.')
    if '|' in names:
        names = names.split('|')[1]
    return code,names.strip()

# 将编码和名称映射起来的字典
all_cats = get_all_categories(data.CATEGORY)
english_mapping = dict(get_english(x) for x in all_cats)

# 构造一个全0的DataFrame
def get_code(seq):
    return [x.split('.')[0] for x in seq if x ]
all_codes = get_code(all_cats)
code_index = pd.Index(np.unique(all_codes))
dummy_frame = pd.DataFrame(np.zeros((len(data),len(code_index))),index = data.index,columns=code_index)

# 将各行中适当的项设置为1,再与data进行连接
for row, cat in zip(data.index,data.CATEGORY):
    codes = get_code(to_cat_list(cat))
    dummy_frame.ix[row,codes]=1
data = data.join(dummy_frame.add_prefix('category_'))

def basic_haiti_map(ax=None,lllat=17.25,urlat=20.25,lllon=-75,urlon=71):
    # 创建极球面投影的Basemap实例
    m = Basemap(ax=ax,projection='stere',
                lon_0=(urlon+lllon)/2,
                lat_0=(urlat+lllat)/2,
                llcrnrlat=lllat,urcrnrlat=urlat,
                llcrnrlon=lllon,urcrnrlon=urlon,
                resolution='f')
    
    # 绘制海岸线,州界,国界以及地图边界
    m.drawcoastlines()
    m.drawstates()
    m.drawcountries()
    return m

# 让返回的basemap对象知道将坐标转换到画布上
fig,axes = plt.subplots(nrows=2,ncols=2,figsize=(12,10))
fig.subplots_adjust(hspace=0.05,wspace=0.05)

to_plot=['2a','1','3c','7a']
lllat=17.25
urlat=20.25
lllon=-75
urlon=-71

for code,ax in zip(to_plot,axes.flat):
    m = basic_haiti_map(ax,lllat=lllat,urlat=urlat,lllon=lllon,urlon=urlon)
    cat_data = data[data['category_%s' % code]==1]
    
    # 计算地图的投影坐标
    x,y = m(cat_data.LONGITUDE.values,cat_data.LATITUDE.values)
    
    m.plot(x,y,'k.',alpha=0.5)
    ax.set_title('%s: %s' % (code,english_mapping[code]))运行

运行结果
在这里插入图片描述

从上图中发现,大部分数据都集中在人口稠密的城市–太子港。basemap还可以叠加来自shapefile的地图数据。首先需要下载一个带有太子港道路的shapefile,然后运行下面脚本即可得到反映事物短缺情况的图片

fig,ax = plt.subplots(nrows=1,ncols=1,figsize=(12,10))
fig.subplots_adjust(hspace=0.05,wspace=0.05)

lllat = 18.43;urlat = 18.69;lllon = -72.57;urlon = -72.08
m = basic_haiti_map(ax,lllat=lllat,urlat=urlat,lllon=lllon,urlon=urlon)

shapefile_path=path+'/datasets/ch08_data/PortAuPrince_Roads/PortAuPrince_Roads'
m.readshapefile(shapefile_path,'road')

code='2a'
cat_data = data[data['category_%s' % code]==1]
# 计算地图的投影坐标
x,y = m(cat_data.LONGITUDE.values,cat_data.LATITUDE.values)
m.plot(x,y,'k.',alpha=0.5)

运行结果
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值