【python】python利用百度地图API:获取经纬度、地图撒点
程序员文章站
2022-07-03 19:55:19
...
本文目的:
python通过百度地图API,获取所给地址的经纬度,并且在百度地图上进行撒点。
另:百度地图API功能强大,如:
GPS功能(单个点沿线运动)、
信息窗口示例(添加纯文字的信息窗口)、
JavaScript API GL v.10(轨迹视角动画)
这些后续都能够用到。
进入正题
项目整体思路:
第一步:申请百度地图AK
地址:http://lbsyun.baidu.com/apiconsole/key
如图:
第二步:获取经纬度等
import pandas as pd
import json
import requests
#获取经纬度
def getlnglat(address): #从本地的xlsx文件中获取商圈名称,作为此函数的实参
output = 'json'
ak = '您的秘钥' # 百度地图**ak,“控制台”-“应用管理”-“我的应用”-“创建应用”-“命名、*”提交后会生成AK
url = 'http://api.map.baidu.com/geocoding/v3/?address={0}&output={1}&ak={2}'.format(address,output,ak)
print(url)
html = requests.get(url=url)
html = html.text
temp = json.loads(html, strict=False)
lat = temp['result']['location']['lat']
lng = temp['result']['location']['lng']
return lat, lng #纬度 latitude,经度 longitude
def re_html(data): #生成HTML适配的格式
data_html = pd.DataFrame(columns=['content']) #建立一个列名为content的dataframe对象
for indexs in data.index: #重新整理成html里适配的格式
data_html.loc[indexs, 'content'] = '{' + \
'"lat":' + str(data.loc[indexs, '纬度']) + ',' + \
'"lng":' + str(data.loc[indexs, '经度']) + ',' + \
'"address":' + '"' + str(data.loc[indexs, 'MC']) + '"' + \
'}' + ','
data_html.to_csv("data_html.csv", encoding="gbk") #相对路径,生成了该csv文件
if __name__ == '__main__':
data = pd.read_excel('address.xlsx')
for index in data.index: #index为data的序号,从0开始
get_location = getlnglat(data.loc[index, 'MC']) #通过序号进行索引,获得MC列下对应的地址名称
lat = get_location[0]
lng = get_location[1]
data.loc[index, '纬度'] = lat
data.loc[index, '经度'] = lng
print(data)
re_html(data)
第三步:找到“加载海量点”
地址:http://lbsyun.baidu.com/jsdemo.htm#c1_19
如图:
将官网的demo复制下来,然后修改配置,如下修改了两处:
- ak;
- 将第二步csv文件中的内容复制到points中
详细代码:
<!DOCTYPE HTML>
<html>
<head>
<title>加载海量点</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
<style type="text/css">
html,body{
margin:0;
width:100%;
height:100%;
background:#ffffff;
}
#map{
width:100%;
height:100%;
}
#panel {
position: absolute;
top:30px;
left:10px;
z-index: 999;
color: #fff;
}
#login{
position:absolute;
width:300px;
height:40px;
left:50%;
top:50%;
margin:-40px 0 0 -150px;
}
#login input[type=password]{
width:200px;
height:30px;
padding:3px;
line-height:30px;
border:1px solid #000;
}
#login input[type=submit]{
width:80px;
height:38px;
display:inline-block;
line-height:38px;
}
</style>
<script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak=您的**"></script>
<script type="text/javascript" src="/jsdemo/data/points-sample-data.js"></script>
</head>
<body>
<div id="map"></div>
<script type="text/javascript">
var map = new BMap.Map("map", {}); // 创建Map实例
map.centerAndZoom(new BMap.Point(120.725285, 31.303446), 10); // 初始化地图,设置中心点坐标和地图级别【中心点的值设置为苏州。地图级别值设置越大,地图就放大】
map.enableScrollWheelZoom(); //启用滚轮放大缩小
if (document.createElement('canvas').getContext) { // 判断当前浏览器是否支持绘制海量点
var points = [
{"lat":31.322265852172226,"lng":120.68438002906036,"address":"苏州中心"},
{"lat":31.323270951670413,"lng":120.66351733274388,"address":"苏州市工业园区印象城"},
{"lat":23.072928527383194,"lng":113.28558235115376,"address":"美罗百货(观前店)"},
{"lat":31.326145447116968,"lng":120.72068765133209,"address":"苏州市工业园区圆融时代广场"},
{"lat":31.303446751329332,"lng":120.7252852687627,"address":"苏州市工业园区邻瑞广场"},
{"lat":31.63212125680224,"lng":120.74279593806872,"address":"诚品生活苏州"},
{"lat":31.296203055436283,"lng":120.63059731038081,"address":"苏州市泰华商城"},
{"lat":31.288771019970895,"lng":120.67844016353672,"address":"苏州市工业园区双湖广场"},
{"lat":31.324684997959398,"lng":120.72068459709335,"address":"苏州市工业园区圆融星座"},
{"lat":31.310377509583137,"lng":120.65955077493402,"address":"苏州市万科美好广场"},
{"lat":31.32171806722683,"lng":120.67155581959992,"address":"苏州市工业园区天虹(金鸡湖店)"}
]; // 添加海量点数据
<!--for (var i = 0; i < data.data.length; i++) {-->
<!--points.push(new BMap.Point(data.data[i][0], data.data[i][1]));-->
<!--}-->
var options = {
size: BMAP_POINT_SIZE_SMALL,
shape: BMAP_POINT_SHAPE_STAR,
color: '#d340c3'
}
var pointCollection = new BMap.PointCollection(points, options); // 初始化PointCollection
pointCollection.addEventListener('click', function (e) {
alert('单击点的坐标为:' + e.point.lng + ',' + e.point.lat); // 监听点击事件
});
map.addOverlay(pointCollection); // 添加Overlay
} else {
alert('请在chrome、safari、IE8+以上浏览器查看本示例');
}
</script>
</body>
</html>
后记:
根据需求有三点需要改进:
- 地图上画饼图;
- 地图上的“标注”的颜色、格式、多重格式并存;
- 点击“标注”显示详细信息。