百度地圖的綜合應(yīng)用
在房產(chǎn)數(shù)據(jù)分析實驗中,我們熟悉了地圖的 Map 和 Geo 類,在城市以上層級的繪圖上,上述兩個類是首選,但是對于縣鎮(zhèn)、街道等層級的可視化,百度地圖是更好的選擇,本實驗通過出租車、外賣等數(shù)據(jù)集,對百度地圖接口的綜合應(yīng)用做了詳細(xì)的介紹。
創(chuàng)建百度地圖AK
百度地圖使用的前提是獲得百度授權(quán)的 AK,否則地圖無法正??梢暬?。可通過如下方式獲得百度 AK :
進入百度控制臺,網(wǎng)址 ;
點擊我的應(yīng)用,在彈出的頁面點擊創(chuàng)建應(yīng)用;
創(chuàng)建應(yīng)用的表單中,應(yīng)用名稱可以任意填寫,應(yīng)用類型須填寫瀏覽器端,Referer 表單中填寫一個 * , 表示所有網(wǎng)站都可以發(fā)起調(diào)用,后提交;
提交會自動返回我的應(yīng)用界面,此時可以發(fā)現(xiàn)生成了一條記錄,并可以找到剛才申請時填寫的應(yīng)用名稱;
鼠標(biāo)懸停在訪問應(yīng)用(AK)字符串時,字符串右上角會彈出復(fù)制,鼠標(biāo)點擊復(fù)制,則在剪貼板里獲得了百度 AK 的字符串。
如下圖所示:

默認(rèn)地圖樣式
!pip install pyecharts==1.7.1
默認(rèn)情況下,通過 BMap 調(diào)用的百度地圖與我們手機 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], # 地圖中心經(jīng)緯度
zoom=8, # 縮放等級, 國家級:5,省級:8,市級:10,街道級:12
is_roam=True, # 渲染后可滾動鼠標(biāo)滾輪進行全圖縮放
)
bmap.render_notebook()
上海地鐵路線分布圖
可以在 .add_schema() 接口中傳入 map_style 參數(shù)進行地圖樣式的設(shè)置,本例設(shè)置了主要地理元素的輪廓和填充,并突出顯示了上海市地鐵線路圖。
import matplotlib.colors as cs
map_style = {
'styleJson': [
{
'featureType': 'all',
'elementType': 'geometry.stroke',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:blue'] # 設(shè)置輪廓線為藍(lán)色
}
},
{
'featureType': 'all',
'elementType': 'geometry.fill',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:gray'] # 設(shè)置填充色為灰色色
}
},
{
'featureType': 'all',
'elementType': 'labels',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:gray'] # 所有文字標(biāo)簽設(shè)置為和背景相同顏色(不顯示)
}
},
{
'featureType': 'highway',
'elementType': 'labels',
'stylers': {
'visibility': 'off' # 告訴公路標(biāo)簽不顯示
}
},
{
'featureType': 'subway',
'elementType': 'geometry',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:red'] # 地鐵線條標(biāo)注為紅色
}
},
{
'featureType': 'subway',
'elementType': 'labels',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:orange'] # 地鐵線標(biāo)簽標(biāo)注為橘色
}
},
]
}
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() 接口可以添加任意點的經(jīng)緯度和名稱進入地圖。本例將上海東方明珠塔添加進地圖并以散點圖的形式顯示。在地圖樣式上,突出顯示了建筑物(綠色填充地理塊)。
map_style = {
'styleJson': [
{
'featureType': 'water', # 設(shè)置河流
'elementType': 'geometry',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:blue']
}
},
{
'featureType': 'building', # 設(shè)置建筑物
'elementType': 'geometry.fill',
'stylers': {
'color': cs.TABLEAU_COLORS['tab:green'] # 設(shè)置填充色為綠色
}
},
{
'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()
出租車路線圖
數(shù)據(jù)集介紹:
本實驗獲取了 88 輛上海出租車的行車數(shù)據(jù),數(shù)據(jù)主要由 3 個特征構(gòu)成:出租車編號,任一時間點的出租車經(jīng)度、緯度。每輛出租車的軌跡數(shù)據(jù)均按時間序列依次排列。
import pandas as pd
df=pd.read_csv('https://labfile.oss.aliyuncs.com/courses/3023/taxi.csv')
df.head()
準(zhǔn)備數(shù)據(jù)
import numpy as np
# 以 CSS4_COLORS 色系標(biāo)記出租車路線顏色
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'] # 設(shè)置輪廓線為藍(lán)色
}
},
{
'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()
外賣商家評分
數(shù)據(jù)集介紹:
本數(shù)據(jù)集來自于數(shù)據(jù)超市,數(shù)據(jù)集采集了北京 1000 條商家的外賣相關(guān)數(shù)據(jù),包括外賣商家,月銷售額,評論數(shù),用戶平分,外賣商家經(jīng)緯度坐標(biāo)等特征。
導(dǎo)入數(shù)據(jù)并查看前 5 行。
df=pd.read_excel('https://labfile.oss.aliyuncs.com/courses/3023/beijing_waimai.xls')
df.head()
將每個商家的評分?jǐn)?shù)以熱力圖的形式添加至地圖。
b = BMap()
b.add_schema(baidu_ak=BAIDU_MAP_AK,
zoom=14.5, # 放大倍數(shù)到街道層級
is_roam=True,
center=[116.327, 39.983] # 大學(xué)城附近
)
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='北京大學(xué)城外賣商家評分分布',
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='北京大學(xué)城外賣商家平均價格分布',
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()