基于地圖的數(shù)據(jù)可視化應(yīng)用愈來愈廣泛谆棱,目前,有很多方法來實(shí)現(xiàn)地圖可視化,包括excel的power map包、各種數(shù)據(jù)分析軟件的地圖庫以及在線交互地圖可視化操作工具,如Echarts缺虐、Tableau Public、polyMaps等等礁凡。另外還有一種手段就是通過軟件調(diào)用百度高氮、google或者其他地圖的api,自己DIY可視化地圖顷牌,但是這種辦法需要操作者本身既要對(duì)相關(guān)軟件的編程熟悉剪芍,又要熟悉不同地圖api的具體用法。本文就是用這種手段韧掩,以一個(gè)簡單的表格文件出發(fā)紊浩,在不知道相關(guān)地點(diǎn)經(jīng)緯度的情況下,通過python調(diào)用百度地圖API實(shí)現(xiàn)熱力地圖疗锐,這其中需要申請密鑰坊谁、批量經(jīng)緯度換算、轉(zhuǎn)換成js數(shù)據(jù)滑臊、百度熱力地圖api相關(guān)參數(shù)的調(diào)整等等口芍。
(1)初始數(shù)據(jù):csv格式的數(shù)據(jù)表格
初始數(shù)據(jù)為2017年1月70個(gè)大中城市新建住宅價(jià)格指數(shù)同比值,直接從國家統(tǒng)計(jì)局網(wǎng)站公布的數(shù)據(jù)copy過來(下圖)雇卷,數(shù)據(jù)已整理好鬓椭,為兩列(城市city、房價(jià)指數(shù)price)关划,并保存為csv格式小染。在實(shí)際中,我們常常通過爬取網(wǎng)站上萬條地區(qū)數(shù)據(jù)并存為csv格式來分析贮折,在這里為簡化流程裤翩,初始數(shù)據(jù)來源直接copy已有數(shù)據(jù)。
(2)城市轉(zhuǎn)換成經(jīng)緯度第一步:注冊密鑰
在百度地圖api上相關(guān)位置的展現(xiàn)是以經(jīng)緯度為基礎(chǔ)的(這里暫不介紹百度地圖坐標(biāo)體系與其他地圖的區(qū)別)调榄,如北京踊赠,其經(jīng)度(longitude)為:116.395645今穿,緯度(latitude)為:39.929986伦籍,在這里既需要通過百度的Geocoding API來獲取不同城市的經(jīng)緯度坐標(biāo),又要求將csv數(shù)據(jù)文件導(dǎo)入python,批量獲取這70個(gè)城市的坐標(biāo)信息。在做這些之前,需要注冊百度地圖api(首先你要用百度的賬號(hào))以獲取免費(fèi)的密鑰口注,才能完全使用該api。登錄網(wǎng)址:http://lbsyun.baidu.com/
首頁點(diǎn)擊申請密鑰按鈕,經(jīng)過填寫個(gè)人信息乐导、郵箱注冊等,成功之后在開放平臺(tái)上點(diǎn)擊“創(chuàng)建應(yīng)用”,填寫相關(guān)信息仪媒,在這里特別說明的是蒲牧,在IP白名單框里,如果不清楚自己的IP地址,最好設(shè)置為:0.0.0.0/0遵倦,雖然百度提醒它會(huì)有泄露使用的風(fēng)險(xiǎn)傲绣,但是有時(shí)候你把你自己的IP地址輸進(jìn)去可能也不行续搀。提交后毅往,在你創(chuàng)建應(yīng)用的訪問應(yīng)用(AK)那一欄就是你的密鑰霜大。
(3)城市轉(zhuǎn)換成經(jīng)緯度第二步:構(gòu)造經(jīng)緯度獲取函數(shù)
注冊密鑰后就可以在百度Web服務(wù)API下的Geocoding API接口來獲取你所需要地址的經(jīng)緯度坐標(biāo)并轉(zhuǎn)化為json結(jié)構(gòu)的數(shù)據(jù)途茫,其網(wǎng)址為:
http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
網(wǎng)頁中有相關(guān)說明,根據(jù)示例URL,采用python3軟件刃麸,寫出如下函數(shù):
import json
from urllib.request import urlopen, quote
import requests,csv
import pandas as pd #導(dǎo)入這些庫后邊都要用到
def getlnglat(address):
url = 'http://api.map.baidu.com/geocoder/v2/'
output = 'json'
ak = '你申請的密鑰***'
add = quote(address) #由于本文城市變量為中文吁伺,為防止亂碼,先用quote進(jìn)行編碼
uri = url + '?' + 'address=' + add + '&output=' + output + '&ak=' + ak
req = urlopen(uri)
res = req.read().decode() #將其他編碼的字符串解碼成unicode
temp = json.loads(res) #對(duì)json數(shù)據(jù)進(jìn)行解析
return temp
(4)城市轉(zhuǎn)換成經(jīng)緯度第三步:批量獲取城市經(jīng)緯度坐標(biāo)
在構(gòu)造完獲取坐標(biāo)函數(shù)后割去,我們就需要用python讀取csv文件的數(shù)據(jù)宦搬,并將city列單獨(dú)讀出來劫拗,批量獲取經(jīng)度矾克、緯度坐標(biāo),并生成json的數(shù)據(jù)文件弓候,其代碼如下:
file = open(r'E:\\爬蟲數(shù)據(jù)分析\調(diào)用百度地圖api\point.json','w') #建立json數(shù)據(jù)文件
with open(r'E:\\爬蟲數(shù)據(jù)分析\調(diào)用百度地圖api\各區(qū)域房價(jià).csv', 'r') as csvfile: #打開csv
reader = csv.reader(csvfile)
for line in reader: #讀取csv里的數(shù)據(jù)
# 忽略第一行
if reader.line_num == 1: #由于第一行為變量名稱,故忽略掉
continue
# line是個(gè)list,取得所有需要的值
b = line[0].strip() #將第一列city讀取出來并清除不需要字符
c= line[1].strip()#將第二列price讀取出來并清除不需要字符
lng = getlnglat(b)['result']['location']['lng'] #采用構(gòu)造的函數(shù)來獲取經(jīng)度
lat = getlnglat(b)['result']['location']['lat'] #獲取緯度
str_temp = '{"lat":' + str(lat) + ',"lng":' + str(lng) + ',"count":' + str(c) +'},'
#print(str_temp) #也可以通過打印出來姐扮,把數(shù)據(jù)copy到百度熱力地圖api的相應(yīng)位置上
file.write(str_temp) #寫入文檔
file.close() #保存
在這里特別要注意str_temp = '{"lat":' + str(lat) + ',"lng":' + str(lng) + ',"count":' + str(c) +'},'絮供,這一行的命令,這是參照百度地圖JavaScript API熱力圖制作的相應(yīng)格式而生成的睡榆,生成的json數(shù)據(jù)格式為:{"lat":39.92998577808024,"lng":116.39564503787867,"count":124.7},如下圖所示萍肆,來自于網(wǎng)址:http://developer.baidu.com/map/jsdemo.htm#c1_15。
(5)生成熱力地圖
接下來就比較簡單胀屿,我們先建立一個(gè)html文件塘揣,將http://developer.baidu.com/map/jsdemo.htm#c1_15
網(wǎng)址中源代碼復(fù)制過來,首先將代碼中的ak換成你自己的密鑰宿崭;
然后將生成的point.json文件里的數(shù)據(jù)復(fù)制出來亲铡,在替換掉var points =[ ]里的內(nèi)容,即可葡兑。這里要注意的是奖蔓,由于百度地圖JavaScript API熱力圖默認(rèn)的是以天安門為中心的北京區(qū)域地圖,而我們的數(shù)據(jù)是全國性的讹堤,所以這里還需要對(duì)熱力圖中“設(shè)置中心點(diǎn)坐標(biāo)和地圖級(jí)別”的部分進(jìn)行修改(見下圖)吆鹤,具體設(shè)置可以參考百度創(chuàng)建地圖api中:
http://api.map.baidu.com/lbsapi/creatmap/
自己可以去調(diào)試出合適的中心點(diǎn)與地圖級(jí)別。
最后洲守,由于我們的大部分price數(shù)據(jù)(也就是points里的count)都超過了100(默認(rèn)最大為100)疑务,還需要對(duì)熱點(diǎn)圖代碼中的點(diǎn)最大值進(jìn)行設(shè)定(這里設(shè)為140)。
保存后梗醇,用瀏覽器打開知允,即得到了2017年1月70個(gè)大中城市新建住宅價(jià)格指數(shù)同比的熱力地圖
圖形可以看出,2017年1月房價(jià)上漲的熱點(diǎn)地區(qū)主要是合肥叙谨、南京温鸽、杭州一帶,福州手负、廈門一帶以及廣州一帶涤垫。