主页 > 苹果商城可以直接下载imtoken吗 > Python调用百度地图API实现经纬度转换和热力图全流程引导

Python调用百度地图API实现经纬度转换和热力图全流程引导

基于地图的数据可视化应用越来越广泛。目前实现地图可视化的方法有很多,包括excel的power map包、各种数据分析软件的地图库,以及在线交互式地图可视化操作工具,如Echarts、Tableau Public、polyMaps等。另一种方法是通过软件调用百度、谷歌或其他地图的API,自己DIY可视化地图,但是这种方法需要操作者熟悉相关软件的编程以及不同地图API的具体使用方法本文采用这种方法,从一个简单的表格文件开始,在不知道相关位置的经纬度的情况下,通过python调用百度地图API实现热力图,需要申请一个key,将经纬度转换成批量,并将其转换为js数据,百度热图API相关参数调整等。

(1)初始数据:csv格式的数据表

初始数据为2017年1月70个大中城市新建住宅价格指数同比值,直接来自国家统计局网站公布的数据(下图) ), 数据已经分类成两列(城市城市、房价指数价格)并以csv格式保存。在实践中,我们经常会爬取网站上上万个区域的数据,以csv格式存储起来进行分析。为了简化流程,原始数据源直接复制已有数据。

(2)城市转换第一步形成经纬度:注册码

百度地图api上相关位置的显示是基于经纬度的(百度地图坐标系与其他地图的区别这里不再介绍),比如北京,其经度(经度)为:116.395645,其纬度(纬度)为:39.929986。这里需要通过百度的Geocoding API获取不同城市的经纬度坐标,还需要将csv数据文件导入python,批量获取这70个城市的坐标信息。在此之前,您需要先注册百度地图api(必须先使用百度账号)获取免费密钥,才能完全使用该api。

登录网址:百度地图开放平台 |百度地图API SDK |地图开发,在首页点击Apply Key按钮,填写个人信息,邮箱注册等,成功后在开放平台点击“创建申请”,填写相关信息,这里特别说明,在IP白名单框,如果不知道自己的IP地址,最好设置为:0.0.0.0/0,虽然百度提醒有泄露风险使用,但有时您可能无法输入自己的 IP 地址。提交后,在您创建的应用程序的访问应用程序(AK)列中就是您的密钥。

(3)城市转化为经纬度第二步:构造经纬度获取函数

注册key后,可以从百度Web服务API下的GeocodingAPI接口获取你需要的地址,将经纬度坐标转换成json结构数据。网址是:

百度在线朗读器_百度在线换算器_百度在线截歌器

webapi/guide/webservice-geocoding - Wiki,网页上有相关说明,根据示例网址,使用python3软件,编写如下函数:

import json
from urllib.request import urlopen, quote
import requests,csv
import pandas as pd #导入这些库后边都要用到
def getlnglat(address):
    url = 'http://api.map.baidu.com/geocoder/v2/'
    output = 'json'
    ak = '你申请的密钥***'
    add = quote(address) #由于本文城市变量为中文,为防止乱码,先用quote进行编码
    uri = url + '?' + 'address=' + add  + '&output=' + output + '&ak=' + ak
    req = urlopen(uri)
    res = req.read().decode() #将其他编码的字符串解码成unicode
    temp = json.loads(res) #对json数据进行解析
    return temp 
 

(4)城市转换为经纬度步骤3:批量获取城市的经纬度坐标

构建后获取坐标函数后,我们需要使用python读取csv文件数据,并分别读出city列,批量获取经纬度坐标,生成json数据文件百度在线换算器,代码为如下:

file = open(r'E:\\爬虫数据分析\调用百度地图api\point.json','w') #建立json数据文件
with open(r'E:\\爬虫数据分析\调用百度地图api\各区域房价.csv', 'r') as csvfile: #打开csv
    reader = csv.reader(csvfile)
    for line in reader: #读取csv里的数据
        # 忽略第一行
        if reader.line_num == 1: #由于第一行为变量名称,故忽略掉
            continue
            # line是个list,取得所有需要的值
        b = line[0].strip() #将第一列city读取出来并清除不需要字符
        c= line[1].strip()#将第二列price读取出来并清除不需要字符
        lng = getlnglat(b)['result']['location']['lng'] #采用构造的函数来获取经度
        lat = getlnglat(b)['result']['location']['lat'] #获取纬度
        str_temp = '{"lat":' + str(lat) + ',"lng":' + str(lng) + ',"count":' + str(c) +'},'
        #print(str_temp) #也可以通过打印出来,把数据copy到百度热力地图api的相应位置上
        file.write(str_temp) #写入文档
file.close() #保存

这里特别注意str_temp ='{"lat":' + str(lat) + ',"lng":' + str(lng) +',"count":' + str(c) +'} ,',行命令,参考百度地图JavaScriptAPI热图制作的对应格式生成,生成的json数据格式为:{"lat":39.92998577808024,"lng":116.39564503787867 ,"count":124.7}百度在线换算器,如下图,来自URL:Map API Example。

(5)生成热图

百度在线换算器_百度在线截歌器_百度在线朗读器

接下来就比较简单了,我们先创建一个html文件来映射API示例URL中的源代码,先把代码中的ak替换成自己的key;

然后将生成的point.json文件拷贝进去,把数据拷贝进去,替换掉var points =[]里面的内容。这里需要注意的是,由于百度地图JavaScript API热图默认是以天安门为中心的北京地区地图,而我们的数据是全国性的,所以需要修改热图的部分“设置中心点坐标”和地图级别”(见下图)。具体设置请参考百度创建地图API:创建地图-百度地图生成器,可自行调试合适的中心点和地图层级。

最后,由于我们大部分的价格数据(即点数)都超过100(默认最大值为100),那么热图代码中的最大点值也需要为设置(这里设置为 140).

@ >

保存后用浏览器打开,2017年1月70个大中城市新建住宅价格指数同比热图:

从图中可以看出,2017年1月房价上涨的热点主要是合肥、南京、杭州、福州、厦门和广州。