在帮助一个金融系的同学做论文时,他提出可以在地图上显示某地区各县市经济和人口数据的对比,想到了调用百度api接口。
一、获取坐标
写一个python小程序获取地区坐标
# -*- coding: utf-8 -*-
"""
Created on Tue May 29 21:53:47 2018
@author: slash
DN: 灯光数据
fin: 财政支出
inc: 收入
number: 人口
"""
import json
from urllib.request import urlopen, quote
import xlrd
# 打开xlsx
book =xlrd.open_workbook("/Users/Macx/Documents/people/heat_map.xlsx")
# 打开sheet1
sh = book.sheet_by_index(0)
# 待拼接的url(不完整的url)
url = 'http://api.map.baidu.com/geocoder/v2/'
ak = 'AAmi3duoYrCIxfPR0Gx51HRfTDaDLIEh'
# 遍历每一行,为什么从1开始呢,因为0是标题行,不需要
for i in range(1, sh.nrows):
# 各个地区前面加上‘上海市’,保证后面检索到的所有经纬度都是上海市的地区,而不是别的省市的
city ='普洱市'+sh.cell_value(i,0)
# 取第二列所有人口
population = sh.cell_value(i,1)
# 取第三列所有GDP
GDP = sh.cell_value(i,2)
# 因为出现中文,所以转换一下格式
add = quote(city)
# 以 json 的格式输出
output = 'json'
# URL 正式拼接,这一句画,下面还会详解解释
uri = url + '?' + 'address=' + add + '&output=' + output + '&ak=' + ak
req = urlopen(uri)
# 传入的字符串,需要解码
res = req.read().decode()
# 写成json 字典的形式
temp = json.loads(res)
# 提取经度
lng = temp['result']['location']['lng']
# 提取纬度
lat = temp['result']['location']['lat']
# 写成新的字典
str_temp = '{"lng":' + str(lng) + ',"lat":' + str(lat) + ',"count":' + str(population) +',"GDP":' + str(GDP) +'},'
print(str_temp)
二、调用百度api 画图
<!DOCTYPE html>
<html lang="en">
<head>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=YizftfScwcArGG1GsDyFpBLH5AuShE0G"></script>
<script type="text/javascript" src="http://api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js"></script>
<title>热力图功能示例</title>
<style type="text/css">
ul,li{list-style: none;margin:0;padding:0;float:left;}
html{height:100%}
body{height:100%;margin:0px;padding:0px;font-family:"微软雅黑";}
#container{height:100%;width:100%;}
#r-result{width:100%;}
</style>
</head>
<body>
<div id="container"></div>
<div id="r-result" style="display:none">
<input type="button" onclick="openHeatmap();" value="显示热力图"/><input type="button" onclick="closeHeatmap();" value="关闭热力图"/>
</div>
</body>
</html>
<script type="text/javascript">
var map = new BMap.Map("container"); // 创建地图实例
var point = new BMap.Point(100.97281,22.831387);
map.centerAndZoom(point, 15); // 初始化地图,设置中心点坐标和地图级别
map.setCurrentCity("普洱"); //设置当前显示城市
map.enableScrollWheelZoom(); // 允许滚轮缩放
var points =[
{"lng":100.98355510297533,"lat":22.79249798435956,"count":3158},
{"lng":101.05244246946019,"lat":23.054590179481025,"count":1935},
{"lng":101.6985835615522,"lat":23.43772577225623,"count":3691},
{"lng":100.83848864452241,"lat":24.451863775494918,"count":3693},
{"lng":100.70945658009512,"lat":23.503204071241473,"count":2998},
{"lng":100.98205355627458,"lat":23.94714236146736,"count":2132},
{"lng":101.86847918429268,"lat":22.59168385943026,"count":1278},
{"lng":99.93858828323933,"lat":22.561831918086543,"count":5009},
{"lng":99.4780679910718,"lat":22.294225262449547,"count":142},
{"lng":99.59662215028884,"lat":22.650656010974465,"count":956},
];//这里面添加经纬度a
if(!isSupportCanvas()){
alert('热力图目前只支持有canvas支持的浏览器,您所使用的浏览器不能使用热力图功能~')
}
//详细的参数,可以查看heatmap.js的文档 https://github.com/pa7/heatmap.js/blob/master/README.md
//参数说明如下:
/* visible 热力图是否显示,默认为true
* opacity 热力的透明度,1-100
* radius 势力图的每个点的半径大小
* gradient {JSON} 热力图的渐变区间 . gradient如下所示
* {
.2:'rgb(0, 255, 255)',
.5:'rgb(0, 110, 255)',
.8:'rgb(100, 0, 255)'
}
其中 key 表示插值的位置, 0~1.
value 为颜色值.
*/
heatmapOverlay = new BMapLib.HeatmapOverlay({"radius":40,"visible":true});
map.addOverlay(heatmapOverlay);
heatmapOverlay.setDataSet({data:points,max:100});
//closeHeatmap();
//判断浏览区是否支持canvas
function isSupportCanvas(){
var elem = document.createElement('canvas');
return !!(elem.getContext && elem.getContext('2d'));
}
function setGradient(){
/*格式如下所示:
{
0:'rgb(102, 255, 0)',
.5:'rgb(255, 170, 0)',
1:'rgb(255, 0, 0)'
}*/
var gradient = {};
var colors = document.querySelectorAll("input[type='color']");
colors = [].slice.call(colors,0);
colors.forEach(function(ele){
gradient[ele.getAttribute("data-key")] = ele.value;
});
heatmapOverlay.setOptions({"gradient":gradient});
}
function openHeatmap(){
heatmapOverlay.show();
}
function closeHeatmap(){
heatmapOverlay.hide();
}
</script>
</body>
</html>
因为数据差异不明显,看起来并不直观。