在新能源汽车快速发展的今天,充电桩的分布和可用性成为了影响用户体验的关键因素之一。比亚迪作为全球领先的新能源汽车制造商,不仅在车辆制造方面取得了卓越成就,也在充电基础设施建设上投入了大量资源。为了帮助用户更方便地找到比亚迪充电桩的位置,本篇文章,我们将探究POST请求的实际应用,我们使用Python的requests库通过POST请求,从比亚迪官方获取充电桩位置信息,深入讲解如何构造请求、解析响应数据以及实现数据可视化,通过可视化分析来实现比亚迪的充电桩分布情况,by the way,比亚迪的充电桩通常是由第三方合作品牌运营的,但它们都接入了比亚迪的充电网络,确保用户可以方便地使用这些充电桩进行充电。
比亚迪充电桩分布位置信息:充电站
我们第一步先找到门店数据的存储位置,然后看3个关键部分标头、负载、 预览;
标头:通常包括URL的连接,也就是目标资源的位置;
负载:对于GET请求:负载通常包含了传递的参数,有些网页负载可能为空,或者没有负载,因为所有参数都通过URL传递;
预览:指的是对响应内容的快速查看或摘要显示,可以帮助用户快速了解返回的数据结构或内容片段;
接下来就是数据获取部分,先理解原理,完整的查询方式是通过定位坐标点查询周边5公里左右范围内接入比亚迪的充电桩的位置信息,比亚迪使用的充电桩通常也是与第三方运营商合作的品牌;
先讲一下方法思路,一共三个步骤;
方法思路
- 获取原始坐标点并在周边生成新的等距离点,生成层数可自定义;
- 基于去重后的新生成点进行查询,并保留查询得到的充电桩信息;
- 坐标转换,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进行可视化;
文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。