欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【python】python利用百度地图API:获取经纬度、地图撒点

程序员文章站 2022-07-03 19:55:19
...

本文目的:

python通过百度地图API,获取所给地址的经纬度,并且在百度地图上进行撒点。
【python】python利用百度地图API:获取经纬度、地图撒点
另:百度地图API功能强大,如:
GPS功能(单个点沿线运动)、
信息窗口示例(添加纯文字的信息窗口)、
JavaScript API GL v.10(轨迹视角动画)
这些后续都能够用到。
【python】python利用百度地图API:获取经纬度、地图撒点

进入正题

项目整体思路:

成功后
申请AK
放入代码中,获得经纬度
生成HTML适配的格式
写入本地csv文件 官方demo中复制代码 更改ak和其他配置

第一步:申请百度地图AK

地址:http://lbsyun.baidu.com/apiconsole/key
如图:
【python】python利用百度地图API:获取经纬度、地图撒点

第二步:获取经纬度等

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
如图:
【python】python利用百度地图API:获取经纬度、地图撒点
将官网的demo复制下来,然后修改配置,如下修改了两处:

  1. ak;
  2. 将第二步csv文件中的内容复制到points中
    【python】python利用百度地图API:获取经纬度、地图撒点
    详细代码:
<!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>

后记:
根据需求有三点需要改进:

  1. 地图上画饼图;
  2. 地图上的“标注”的颜色、格式、多重格式并存;
  3. 点击“标注”显示详细信息。
相关标签: python 可视化