4. 通过API获取数据
API(Application Programming Interface)指应用程序编程接口,服务器端通过API可以提供服务、发布数据,客户端通过调用API可以实现功能调用、查询信息等。API的使用无处不在,比如酒店预订、天气/股票查询等。如今,越来越多的Web应用面向开发者也开放了API,如人脸识别、语音合成等,API已然成为数字平台的支柱。

Python内置的urllib模块提供给了基本的获取网络资源处理功能,其中的urllib.request子模块主要用于从客户端向服务器发起访问请求。
本案例中,我们主要将用到urllib.request.urlopen( )函数向服务器发起一个HTTP请求,得到一个JSON格式的经纬度坐标数据,urlopen( )的原型如下:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None,capath=None, cadefault=False, context=None)
5.API查询城市经纬度
创建湖南省人口分布地图时候,需要指定各地州市在地图上的经纬度,pyecharts允许用户使用自创建的坐标文件,也可以使用pyecharts自带的(坐标文件是一个名为city_coordinates.json的json格式文件),这对一些坐标标注不全或不准确的场景下非常有用。天地图查询行政区域的经纬度API地址形如:
http://api.tianditu.gov.cn/v2/administrative?keyword=长沙市&childLevel=0&&tk=您的密钥
程序流程图,以及通过HTTP Request发送API调用请求及服务器返回的JSON数据格式如下图所示:
6.创建城市人口分布GEO地图
1)获取湖南省14个地州市的人口数
读取数据的过程与读取全国人口数相似,Excel文件转存为csv时,可以删除掉“全省”统计汇总行数据。这里,也只需要前两列数据,对应的字典key名称为:city和population,如下图所示:
获取湖南省14个地州市的人口数的核心代码如下:
2)zip函数组合列表
本任务中要将城市名称和对应的人口数组合成一对“X-Y”坐标的值。前面的学习已经知道:字典的视图对象dict.keys( )、dict.values( )提供了单独从key和单独从value的角度看字典值的视角,如果我们又需要将分列的key和value两个序列组合到一起呢?
使用zip( )函数是不二选择。zip(*iterables)用于创建一个聚合了来自多个可迭代对象中的元素的迭代器,它会将可迭代对象按从左至右的顺序求值,返回一个多元素的元组,其中的第i个元组包含来自每个可迭代对象的第i个元素。
zip( )函数就像是我们衣服的拉链,把左右两边两个相关联的数据序列进行一一匹配组合,但zip( )函数返回的是一个zip对象,并不是一个列表,可以用list( )、tuple( )函数把这个对象转成列表或者元组。
3)创建人口分布GEO地图
所需数据准备好后就可以根据需要创建人口数据GEO地图了,详细代码如下:
pyecharts所有方法均支持链式调用,通过一系列的方法对Geo( )对象进行配置和初始化。
首先,通过init_opts进行GEO地图的初始化,使用本地JS文件③;
其次,通过链式调用add_schema( )方法设置地图为一张湖南省地图⑤,通过add_coordinate_json( )方法将我们自己创建的地理坐标经纬度文件添加到GEO地图⑦,通过add( )方法将准备好的嵌套列表数据data_pair配置为地图数据系列⑧;
然后,通过set_series_opts( )设置系列配置⑯,对标签文字进行格式化设置,在地图上显示城市的名字;
最后,通过set_global_opts( )设置全局配置⑲,包括标题/副标题名称、以及通过opts.VisualMapOpts配置了视觉映射/调节该滑块,可以控制在地图上显示的最大值和最小值区间内的城市人口信息。
所有配置完成后,就可以调用geo对象的render( )㉙方法,生成一个本地HTML文件,打开该文件将会显示创建好的人口分布地图。