百度地图的综合应用
在房产数据分析实验中,我们熟悉了地图的 Map 和 Geo 类,在城市以上层级的绘图上,上述两个类是首选,但是对于县镇、街道等层级的可视化,百度地图是更好的选择,本实验通过出租车、外卖等数据集,对百度地图接口的综合应用做了详细的介绍。
创建百度地图AK
百度地图使用的前提是获得百度授权的 AK,否则地图无法正常可视化。可通过如下方式获得百度 AK :
进入百度控制台,网址 ;
点击我的应用,在弹出的页面点击创建应用;
创建应用的表单中,应用名称可以任意填写,应用类型须填写浏览器端,Referer 表单中填写一个 * , 表示所有网站都可以发起调用,后提交;
提交会自动返回我的应用界面,此时可以发现生成了一条记录,并可以找到刚才申请时填写的应用名称;
鼠标悬停在访问应用(AK)字符串时,字符串右上角会弹出复制,鼠标点击复制,则在剪贴板里获得了百度 AK 的字符串。
如下图所示:
默认地图样式
!pip install pyecharts==1.7.1
默认情况下,通过 BMap 调用的百度地图与我们手机 APP 看到的样式相同。
from pyecharts.charts import BMap
from pyecharts import options as opts
# 输入百度 AK,字符串形式
# 本实验必须输入百度 AK 否则下文均无法运行
BAIDU_MAP_AK =
bmap = BMap()
bmap.add_schema(
baidu_ak=BAIDU_MAP_AK,
center=[110, 35], # 地图中心经纬度
zoom=8, # 缩放等级, 国家级:5,省级:8,市级:10,街道级:12
is_roam=True, # 渲染后可滚动鼠标滚轮进行全图缩放
)
bmap.render_notebook()
上海地铁路线分布图
可以在 .add_schema() 接口中传入 map_style 参数进行地图样式的设置,本例设置了主要地理元素的轮廓和填充,并突出显示了上海市地铁线路图。
import matplotlib.colors as cs
map_style = {
'styleJson': [
{
'featureType': 'all',
'elementType': 'geometry.stroke',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:blue'] # 设置轮廓线为蓝色
}
},
{
'featureType': 'all',
'elementType': 'geometry.fill',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:gray'] # 设置填充色为灰色色
}
},
{
'featureType': 'all',
'elementType': 'labels',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:gray'] # 所有文字标签设置为和背景相同颜色(不显示)
}
},
{
'featureType': 'highway',
'elementType': 'labels',
'stylers': {
'visibility': 'off' # 告诉公路标签不显示
}
},
{
'featureType': 'subway',
'elementType': 'geometry',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:red'] # 地铁线条标注为红色
}
},
{
'featureType': 'subway',
'elementType': 'labels',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:orange'] # 地铁线标签标注为橘色
}
},
]
}
bmap = BMap()
bmap.add_schema(
baidu_ak=BAIDU_MAP_AK,
center=[121.4648, 31.1891], # 上海
zoom=12,
is_roam=True,
map_style=map_style,
)
bmap.set_global_opts(
title_opts=opts.TitleOpts(
title='上海地铁线分布图',
title_textstyle_opts=opts.LabelOpts(font_size=25, color='White')
)
)
bmap.render_notebook()
东方明珠塔附近建筑物分布图
与 Map 和 Geo 相同,可通过 .add_coordinate() 接口可以添加任意点的经纬度和名称进入地图。本例将上海东方明珠塔添加进地图并以散点图的形式显示。在地图样式上,突出显示了建筑物(绿色填充地理块)。
map_style = {
'styleJson': [
{
'featureType': 'water', # 设置河流
'elementType': 'geometry',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:blue']
}
},
{
'featureType': 'building', # 设置建筑物
'elementType': 'geometry.fill',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:green'] # 设置填充色为绿色
}
},
{
'featureType': 'all',
'elementType': 'labels',
'stylers': {
'visibility': 'off'
}
},
]
}
bmap = BMap()
bmap.add_schema(
baidu_ak=BAIDU_MAP_AK,
center=[121.506377, 31.245105], # 上海东方明珠
zoom=16,
is_roam=True,
map_style=map_style,
)
bmap.add_coordinate('tower', 121.506377, 31.245105)
bmap.add(" ",
data_pair=[['tower',1]],
type_="scatter",
symbol_size=30,
color=cs.TABLEAU_COLORS['tab:red'],
label_opts=opts.LabelOpts(is_show=False))
bmap.set_global_opts(
legend_opts=opts.LegendOpts(is_show=False),
title_opts=opts.TitleOpts(
title='东方明珠塔附近建筑物分布图',
pos_right="1%",
pos_top="9%",
title_textstyle_opts=opts.LabelOpts(font_size=25, color='white')
)
)
bmap.render_notebook()
出租车路线图
数据集介绍:
本实验获取了 88 辆上海出租车的行车数据,数据主要由 3 个特征构成:出租车编号,任一时间点的出租车经度、纬度。每辆出租车的轨迹数据均按时间序列依次排列。
import pandas as pd
df=pd.read_csv('https://labfile.oss.aliyuncs.com/courses/3023/taxi.csv')
df.head()
准备数据
import numpy as np
# 以 CSS4_COLORS 色系标记出租车路线颜色
colors=[value for value in cs.CSS4_COLORS.values()]
# 逐次添加出租车轨迹进入 rountines 列表
rountines=[]
for i,taxi in enumerate(np.unique(df['taxi'])):
data=df.loc[df['taxi']==taxi]
taxi_rountines={
'coords':[[long,lat] for long,lat in zip(data['long'],data['lat'])],
'lineStyle':{'normal':{'color':colors[i]}}
}
rountines.append(taxi_rountines)
出租车轨迹图绘制
map_style = {
'styleJson': [
{
'featureType': 'all',
'elementType': 'geometry.fill',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:gray']
}
},
{
'featureType': 'all',
'elementType': 'geometry.stroke',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:blue'] # 设置轮廓线为蓝色
}
},
{
'featureType': 'all',
'elementType': 'labels',
'stylers': {
'visibility': 'off'
}
},
]
}
b = BMap(init_opts=opts.InitOpts(width='600px', height='900px',))
b.add_schema(
baidu_ak=BAIDU_MAP_AK,
center=[121.50, 31.22],
zoom=12,
is_roam=True,
map_style=map_style
)
b.add(
"",
type_="lines",
is_polyline=True,
data_pair=rountines,
linestyle_opts=opts.LineStyleOpts(opacity=0.2, width=3),
)
b.set_global_opts(
legend_opts=opts.LegendOpts(is_show=False),
title_opts=opts.TitleOpts(
title='上海部分出租车路线图',
pos_right="1%",
pos_top="9%",
title_textstyle_opts=opts.LabelOpts(font_size=25, color='white')
)
)
b.render_notebook()
外卖商家评分
数据集介绍:
本数据集来自于数据超市,数据集采集了北京 1000 条商家的外卖相关数据,包括外卖商家,月销售额,评论数,用户平分,外卖商家经纬度坐标等特征。
导入数据并查看前 5 行。
df=pd.read_excel('https://labfile.oss.aliyuncs.com/courses/3023/beijing_waimai.xls')
df.head()
将每个商家的评分数以热力图的形式添加至地图。
b = BMap()
b.add_schema(baidu_ak=BAIDU_MAP_AK,
zoom=14.5, # 放大倍数到街道层级
is_roam=True,
center=[116.327, 39.983] # 大学城附近
)
for name, long, lat in zip(df['name'], df['lng'], df['lat']):
b.add_coordinate(name, long, lat)
b.add(" ",
[[name, score] for name, score in zip(df['name'], df['score'])],
type_="heatmap",
point_size=9)
b.set_global_opts(
title_opts=opts.TitleOpts(
title='北京大学城外卖商家评分分布',
pos_top='5%',
title_textstyle_opts=opts.LabelOpts(font_size=25)
),
visualmap_opts=opts.VisualMapOpts(
min_=3,
max_=5,
range_text=["high", "low"],
range_color=['green','yellow','red'],
)
)
b.render_notebook()
外卖商家价格
同样的方式,可以获得商家平均价格的热力图分布图。
data=df[['name','lng','lat','avg_price']].copy()
b = BMap()
b.add_schema(baidu_ak=BAIDU_MAP_AK,
zoom=14,
is_roam=True,
center=[116.327, 39.983]
)
for name, long, lat in zip(data['name'], data['lng'], data['lat']):
b.add_coordinate(name, long, lat)
b.add(" ",
[[name, avg_price] for name, avg_price in zip(data['name'], data['avg_price'])],
type_="heatmap",
point_size=11)
b.set_global_opts(
title_opts=opts.TitleOpts(
title='北京大学城外卖商家平均价格分布',
pos_top='5%',
title_textstyle_opts=opts.LabelOpts(font_size=25)
),
visualmap_opts=opts.VisualMapOpts(
min_=10,
max_=70,
range_text=["high", "low"],
range_color=['green','yellow','red'],
)
)
b.render_notebook()