Bootstrap

HTML应用指南:利用POST请求获取接入比亚迪业态的充电桩位置信息

在新能源汽车快速发展的今天,充电桩的分布和可用性成为了影响用户体验的关键因素之一。比亚迪作为全球领先的新能源汽车制造商,不仅在车辆制造方面取得了卓越成就,也在充电基础设施建设上投入了大量资源。为了帮助用户更方便地找到比亚迪充电桩的位置,本篇文章,我们将探究POST请求的实际应用,我们使用Python的requests库通过POST请求,从比亚迪官方获取充电桩位置信息,深入讲解如何构造请求、解析响应数据以及实现数据可视化,通过可视化分析来实现比亚迪的充电桩分布情况,by the way,比亚迪的充电桩通常是由第三方合作品牌运营的,但它们都接入了比亚迪的充电网络,确保用户可以方便地使用这些充电桩进行充电。

比亚迪充电桩分布位置信息:充电站

我们第一步先找到门店数据的存储位置,然后看3个关键部分标头、负载、 预览;

标头:通常包括URL的连接,也就是目标资源的位置;

负载:对于GET请求:负载通常包含了传递的参数,有些网页负载可能为空,或者没有负载,因为所有参数都通过URL传递;

预览:指的是对响应内容的快速查看或摘要显示,可以帮助用户快速了解返回的数据结构或内容片段;

接下来就是数据获取部分,先理解原理,完整的查询方式是通过定位坐标点查询周边5公里左右范围内接入比亚迪的充电桩的位置信息,比亚迪使用的充电桩通常也是与第三方运营商合作的品牌;

先讲一下方法思路,一共三个步骤;

方法思路

  1. 获取原始坐标点并在周边生成新的等距离点,生成层数可自定义;
  2. 基于去重后的新生成点进行查询,并保留查询得到的充电桩信息;
  3. 坐标转换,GCJ-02转WGS84;

第一步:获取原始坐标点并在周边生成新的等距离点;

第二步:基于去重后的新生成点进行查询,并保留查询得到的充电桩信息;

完整代码#运行环境 Python 3.11

import requests
import json
import pandas as pd
import math
import time
import random


def calculate_new_coordinates(lat, lng, distance_km, layers):
    """计算新的经纬度坐标"""
    coordinates = set()  # 使用集合来存储唯一坐标

    # 计算每层的纬度和经度变化
    for layer in range(layers):
        lat_change = (layer + 1) * distance_km / 111.32  # 当前层纬度变化
        lng_change = (layer + 1) * distance_km / (111.32 * math.cos(math.radians(lat)))  # 当前层经度变化

        # 生成当前层的四个基本点(上下左右)
        current_points = [
            (lat + lat_change, lng),  # 北
            (lat - lat_change, lng),  # 南
            (lat, lng + lng_change),  # 东
            (lat, lng - lng_change)  # 西
        ]

        # 将当前层的点添加到集合中
        for point in current_points:
            coordinates.add(point)

        # 对每个新生成的点,再生成四个点(上下左右)
        for point in current_points:
            new_lat, new_lng = point
            coordinates.add((new_lat + lat_change, new_lng))  # 北
            coordinates.add((new_lat - lat_change, new_lng))  # 南
            coordinates.add((new_lat, new_lng + lng_change))  # 东
            coordinates.add((new_lat, new_lng - lng_change))  # 西

    return list(coordinates)  # 转换为列表返回


def search_charge_stations(lat, lng):
    url = "https://site-api.byd.com/domestic-official-api/charge/stations/search"

    # 请求头
    headers = {----------根据你实际的请求头内容进行替换------------}

    # 请求体数据
    payload = {
        "lat": lat,
        "lng": lng,
        "keyword": "",  # 关键词,可以根据需要填写
        "pageNum": 1,  # 页码
        "pageSize": 500  # 每页大小
    }

    # 发送 POST 请求
    response = requests.post(url, headers=headers, data=json.dumps(payload))

    # 检查响应状态
    if response.status_code == 200:
        # 处理成功的响应
        data = response.json()
        print("查询成功,返回数据:", json.dumps(data, indent=4, ensure_ascii=False))

        # 提取充电站信息
        stations = data['data']['rows']
        return stations if stations else []  # 如果没有找到充电站,返回空列表
    else:
        # 处理错误响应
        print(f"请求失败,状态码: {response.status_code}, 响应内容: {response.text}")
        return []  # 确保返回空列表而不是 None


if __name__ == "__main__":
    original_lat = 31.328357  # 原始纬度
    original_lng = 121.498223  # 原始经度
    distance_km = 5  # 查询半径 5 公里
    layers = 3  # 生成点的层数

    # 计算新的坐标
    new_coordinates = calculate_new_coordinates(original_lat, original_lng, distance_km, layers)

    all_stations = []  # 用于存储所有充电站信息

    # 查询每个新坐标的充电站信息
    for lat, lng in new_coordinates:
        stations = search_charge_stations(lat, lng)

        # 如果查询结果不为空,则添加到总列表
        if stations:
            all_stations.extend(stations)  # 将当前坐标的充电站信息添加到总列表
        else:
            print(f"坐标 ({lat}, {lng}) 未找到充电站信息,跳过。")

        # 随机延时,范围在 1 到 3 秒之间
        time.sleep(random.uniform(1, 3))

    # 将所有充电站信息转换为 DataFrame
    df = pd.DataFrame(all_stations)

    # 保存为 CSV 文件
    output_csv_path = 'D:\\data\\charge_stations.csv'  # 输出文件路径
    df.to_csv(output_csv_path, index=False, encoding='utf-8-sig')
    print(f"充电站数据已成功保存为 {output_csv_path}")

这里我们基于上海的一个原始定位点,获取周边一些充电桩位置信息,获取数据标签如下,id(充电站的唯一标识符)、stationName(充电站的名称)、operatorId(运营商的唯一标识符)、operatorName(运营商的名称)、address(充电站的地址)、stationLng(充电站的经度)、stationLat(充电站的纬度)、distance(从查询点到充电站的距离(单位:公里))、currentPeriodElectricityFee(当前时段的电费(单位:元/度))、currentPeriodServiceFee(当前时段的服务费(单位:元))、dcConnectorCount(直流充电接口的数量)、 acConnectorCount(交流充电接口的数量)、dcIdleConnectorCount(当前空闲的直流充电接口数量)、 acIdleConnectorCount(当前空闲的交流充电接口数量) 、electricityFeeStr(电费的详细时间段和费用信息)、serviceFeeStr(服务费的详细时间段和费用信息)、tag(充电站的标签(如“快”表示快充站));

第三步:坐标系转换,由于数据使用的是高德坐标系(GCJ-02),为了在ArcGIS上准确展示而不发生偏移,我们需要将充电桩的坐标从GCJ-02转换为WGS-84坐标系。我们可以利用coord-convert库中的gcj2wgs(lng, lat)函数,对CSV文件中的充电桩坐标列进行转换。完成坐标转换后,再将数据导入ArcGIS进行可视化;

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

;