Python使用百度地图API实现地点信息转换及房价指数热力地图
? ? ? ? ?百度地圖開(kāi)發(fā)平臺(tái)提供了各式各樣的API可供開(kāi)發(fā)者調(diào)用,而本文則涉及到了其中的Place API和Geocoding API。?
其中Place API用于查詢(xún)某個(gè)地點(diǎn)信息的經(jīng)緯度坐標(biāo);Geocoding API用于查詢(xún)某個(gè)經(jīng)緯度坐標(biāo)的結(jié)構(gòu)化地址。?
參考文檔如下:?
Place API:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi
GeocodingAPI:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
一? ?問(wèn)題需求?
? ? ? ? 根據(jù)房?jī)r(jià)指數(shù)數(shù)據(jù),進(jìn)行Python編程使用百度地圖API實(shí)現(xiàn)地點(diǎn)信息轉(zhuǎn)換,展示房?jī)r(jià)指數(shù)熱力地圖
二? 解決思路
? ? ? ? 百度地圖api上相關(guān)位置的展現(xiàn)是以經(jīng)緯度為基礎(chǔ)的,如北京,其經(jīng)度(longitude)為:116.395645,緯度(latitude)為:39.929986,在這里需要通過(guò)百度的Geocoding API來(lái)獲取不同城市的經(jīng)緯度坐標(biāo)。
? ? ? ?因此可通過(guò)csv數(shù)據(jù)文件導(dǎo)入python,通過(guò)調(diào)用百度地圖API,批量獲取所有城市的坐標(biāo)信息。
? ? ? ?根據(jù)得到得json數(shù)據(jù)繪制熱力地圖。
三? 地點(diǎn)信息轉(zhuǎn)換
1. 開(kāi)發(fā)第一步:注冊(cè)密鑰
在做所有工作之前,需要注冊(cè)百度地圖api(首先你要用百度的賬號(hào))以獲取免費(fèi)的密鑰,才能完全使用該api。登錄網(wǎng)址:http://lbsyun.baidu.com/? ?首頁(yè)點(diǎn)擊申請(qǐng)密鑰按鈕,經(jīng)過(guò)填寫(xiě)個(gè)人信息、郵箱注冊(cè)等注冊(cè)成功之后在開(kāi)放平臺(tái)上點(diǎn)擊“創(chuàng)建應(yīng)用”,填寫(xiě)相關(guān)信息,填寫(xiě)應(yīng)用的名字,并在IP白名單框里輸入訪問(wèn)白名單,如果不清楚自己的IP地址,可設(shè)置為:0.0.0.0/0,注意:百度提醒它會(huì)有泄露使用的風(fēng)險(xiǎn)。提交后,在你創(chuàng)建應(yīng)用的訪問(wèn)應(yīng)用(AK)那一欄就是你的密鑰。2.? 整理城市房地產(chǎn)數(shù)據(jù)
初始數(shù)據(jù)為2018年3月份70個(gè)大中城市商品住宅銷(xiāo)售價(jià)格變動(dòng)情況,國(guó)家統(tǒng)計(jì)局網(wǎng)站公布的數(shù)據(jù)鏈接為:http://www.stats.gov.cn/tjsj/zxfb/201804/t20180418_1594610.html,數(shù)據(jù)整理為201803house.c's'v,為兩列(城市city、房?jī)r(jià)指數(shù)price),并保存為csv格式。? ??3.? ?信息轉(zhuǎn)換實(shí)現(xiàn)1)編寫(xiě)中文城市地址獲取城市地圖信息函數(shù)getBaidulnglat2)讀201803house.csv,逐個(gè)城市調(diào)用getBaidulnglat3)百度Web服務(wù)API下的Geocoding API接口來(lái)獲取你所需要地址的經(jīng)緯度坐標(biāo)并轉(zhuǎn)化為json結(jié)構(gòu)的數(shù)據(jù)? ? ?import json,csv from urllib.request import urlopen, quotedef getBaidulnglat(address):url = 'http://api.map.baidu.com/geocoder/v2/'output = 'json' # 百度地圖API可以指定JSON或者XML的返回?cái)?shù)據(jù)ak = 'MMMMMMMMMMMs9SG539999999xxxxx'add = quote(address) # 防止中文出現(xiàn)亂碼,先用quote進(jìn)行編碼url = url + '?' + 'address=' + add + '&output=' + output + '&ak=' + akreq = urlopen(url)res = req.read().decode() # 對(duì)返回的response對(duì)象,將其他編碼的字符串解碼成unicodetemp = json.loads(res) # 對(duì)json數(shù)據(jù)進(jìn)行解析return tempfile = open(r'files\\baiduapi_point.json','w') file1 = open(r'files\\baiduapi_citys.json','w') with open(r'files\\201803house.csv', 'r') as csvfile:reader = csv.reader(csvfile)for line in reader:if reader.line_num == 1:continueb = line[0].strip() # 第一列cityc = line[1].strip() getcity = getBaidulnglat(b) # 調(diào)用函數(shù)獲取API返回包lng = getBaidulnglat(b)['result']['location']['lng'] # 調(diào)用函數(shù)獲取經(jīng)度lat = getBaidulnglat(b)['result']['location']['lat'] # 獲取緯度str_temp = '{"lat":' + str(lat) + ',"lng":' + str(lng) + ',"count":' + str(c) +'},'file.write(str_temp) file1.write(str(getcity)) file.close() file1.close() baiduapi_point.json 的輸出內(nèi)容如下:四? 制作熱力地圖
1.? 從百度開(kāi)發(fā)平臺(tái)獲取初始HTML代碼
我們先建立一個(gè)html文件,將http://developer.baidu.com/map/jsdemo.htm#c1_15?網(wǎng)址中源代碼復(fù)制過(guò)來(lái),首先將代碼中的ak換成你自己的密鑰;(注意:這個(gè)密鑰和前面python里面調(diào)用百度API的密鑰不一樣, 需要在剛才創(chuàng)建密鑰的地方重新創(chuàng)建一個(gè),并選擇密鑰類(lèi)型為前端,用來(lái)支持調(diào)用baidu的javascriptAPI)
2.? 更新數(shù)據(jù)。將前面生成的baiduapi_point.json文件里的數(shù)據(jù)復(fù)制出來(lái),替換掉HTML代碼中var points =[ ]里的內(nèi)容
3.? ?設(shè)置熱力地圖中心點(diǎn)和地圖級(jí)別,這里以西安為中心點(diǎn),級(jí)別為5。? ? ?百度地圖JavaScript API熱力圖默認(rèn)的是以天安門(mén)為中心的北京區(qū)域地圖,因此需要對(duì)熱力圖中“設(shè)置中心點(diǎn)坐標(biāo)和地圖級(jí)別”的部分進(jìn)行修改成合適的中心點(diǎn)與地圖級(jí)別。(見(jiàn)下圖),具體設(shè)置可以參考百度創(chuàng)建地圖api中:http://api.map.baidu.com/lbsapi/creatmap/
5.? 效果展示。 運(yùn)行本地HTML文件即可。?
6. 擴(kuò)展說(shuō)明。 這里使用本地頁(yè)面進(jìn)行實(shí)現(xiàn), 動(dòng)態(tài)頁(yè)面類(lèi)似,不贅述。
五? 另一個(gè)例子(地址信息轉(zhuǎn)換)? ? ? ? 另一個(gè)例子,百度地圖API可以指定JSON或者XML的返回?cái)?shù)據(jù),本例子展示不同返回格式的用法,Place API使用的返回格式為JSON,Geocoding API使用的返回格式為XML,兩種格式的處理方法稍有不同。 #encoding=utf-8 '''使用Place API把從文本中提取出的地址轉(zhuǎn)換為對(duì)應(yīng)的經(jīng)緯度坐標(biāo),再使用Geocoding API把經(jīng)緯度坐標(biāo)轉(zhuǎn)換為結(jié)構(gòu)化地址。''' from xml.etree import ElementTree import json import urllib.requestsearch=urllib.parse.quote(u'武漢'.encode('utf-8')) region=urllib.parse.quote(u'西安'.encode('utf-8')) url="http://api.map.baidu.com/place/v2/search?query=%s®ion=%s&city_limit=true&output=json&ak=你的AK"%(search,region)req = urllib.request.urlopen(url)#JSON格式的返回?cái)?shù)據(jù) res = req.read().decode("utf-8") #將其他編碼的字符串解碼成unicode temp = json.loads(res) print (temp) address = temp['results'][0]['address']#地址 location = temp['results'][0]['location'] #經(jīng)緯度坐標(biāo) print (address,location) lat = str(location['lat'])#緯度坐標(biāo) lng = str(location['lng'])#經(jīng)度坐標(biāo) url2 = 'http://api.map.baidu.com/geocoder/v2/?callback=renderReverse&location='+lat+','+lng+'&output=xml&pois=1&ak=你的AK' req2 = urllib.request.urlopen(url2)#XML格式的返回?cái)?shù)據(jù) res2 = req2.read().decode("utf-8")#將其他編碼的字符串解碼成unicoderoot = ElementTree.fromstring(res2)#解析XML時(shí)直接將字符串轉(zhuǎn)換為一個(gè)Element,解析樹(shù)的根節(jié)點(diǎn) node_find = root.find('result/formatted_address')#find()用于查找屬于某個(gè)tag的第一個(gè)element,這里查找結(jié)構(gòu)化地址 print(node_find.text)#輸出結(jié)構(gòu)化的地址
總結(jié)
以上是生活随笔為你收集整理的Python使用百度地图API实现地点信息转换及房价指数热力地图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring——DI
- 下一篇: 华硕服务器 bios 内存 1333 显