这个Python程序旨在从高德地图API获取路径规划数据,解析这些数据,并最终将其保存到JSON和CSV文件中。下面,我将详细讲解每个部分的功能和实现方式。
1. 导入所需的模块
import requests
import json
import time
import csv
- requests: 用于发送HTTP请求并接收响应。
- json: 用于处理JSON格式的数据。
- time: 用于在请求之间添加延迟,避免频繁请求。
- csv: 用于将解析后的数据保存到CSV文件中。
2. 获取路径规划数据
def get_route_planning(start_point, end_point, api_key):
base_url = 'https://restapi.amap.com/v5/direction/transit/integrated'
parameters = {
'origin': start_point,
'destination': end_point,
'key': api_key,
'city1': '0871',
'city2': '0871',
'show_fields':'cost'
}
response = requests.get(base_url, params=parameters)
if response.status_code == 200:
result = response.json()
return result
else:
print(f"Error: {response.status_code}")
return None
- get_route_planning 函数用于根据起点和终点的经纬度,通过高德地图API获取路径规划数据。
- base_url 是API的基础URL,
v5/direction/transit/integrated
代表公交换乘路径规划服务。 - parameters 包含请求的参数,包括起点 (
origin
)、终点 (destination
)、API Key (key
)、城市代码 (city1
和city2
),以及需要返回的字段 (show_fields
)。 - 通过
requests.get
发送HTTP请求并获取响应。如果响应状态码为200,则返回解析后的JSON数据;否则输出错误信息。
3. 批量处理多个路径规划
def batch_process(locations, api_key):
route_data_all = []
for start, end in locations:
route_data = get_route_planning(start, end, api_key)
if route_data:
route_data_all.append(route_data)
time.sleep(0.1) # 控制请求速率,避免频繁请求被限制
return route_data_all
- batch_process 函数用于批量处理多个路径规划请求。
- locations 是一个包含多个起点和终点元组的列表。
- 函数会依次调用
get_route_planning
函数,并将每次获取的数据添加到route_data_all
列表中。 time.sleep(0.1)
添加了0.1秒的延迟,用于避免请求过于频繁,防止IP被API服务暂时封禁。
4. 保存数据到文件
def save_to_file(data, filename='route_data.json'):
with open(filename, 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=2)
- save_to_file 函数用于将收集到的路径规划数据保存到JSON文件中。
- 使用
json.dump
将Python对象转换为JSON格式并写入文件。
5. 主程序入口
def main():
your_api_key = "替换为自己的key"
locations = [
("102.860168,24.870209", "102.618095,24.984176"), # 昆明南站——西山公园
("102.842417,24.835941", "102.720305,25.056113"), # 大学城站——火车北站
("102.719665,25.038080", "102.699926,25.032055"), # 东风广场——弥勒寺站
]
route_data_all = batch_process(locations, your_api_key)
if route_data_all:
save_to_file(route_data_all, 'batch_route_data.json')
print("路径规划数据已保存到 batch_route_data.json 文件中")
注意:your_api_key = "替换为自己的key"处需要将自己申请的key粘贴到此处,替换“替换为自己的key”,申请方法详见:http://t.csdnimg.cn/xeUj9http://t.csdnimg.cn/xeUj9
- main 函数是程序的入口。
- 这里你可以替换
your_api_key
为你自己的高德地图API Key。 - locations 是包含多个起点和终点经纬度的列表。
- 程序会批量处理这些路径规划,并将结果保存到
batch_route_data.json
文件中。
6. 查看和解析JSON数据
with open('batch_route_data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
print(data) # 输出读取到的数据
- 这段代码用于读取
batch_route_data.json
文件中的数据并打印到控制台上。
7. 解析并输出JSON数据
for item in data:
status = item['status']
info = item['info']
infocode = item['infocode']
route = item['route']
origin = route['origin']
destination = route['destination']
distance = route['distance']
cost_info = route['cost']
taxi_fee = cost_info.get('taxi_fee')
for transit in route['transits']:
transit_cost = transit['cost']
transit_duration = transit_cost['duration']
transit_transit_fee = transit_cost.get('transit_fee')
transit_distance = transit['distance']
walking_distance = transit['walking_distance']
for segment in transit['segments']:
if 'bus' in segment:
bus_info = segment['bus']
bus_name = bus_info['buslines'][0]['name']
bus_distance = bus_info['buslines'][0]['distance']
print(f"Bus Name: {bus_name}")
print(f"Bus Distance: {bus_distance}")
if 'walking' in segment:
walking_info = segment['walking']
walking_distance = walking_info['distance']
print(f"Walking Distance: {walking_distance}")
print("-----")
print("==========")
- 这部分代码详细解析了JSON数据,提取了路径的基本信息、花费、距离、换乘信息等,并逐段输出每个公交和步行信息。
8. 保存解析后的数据到CSV文件
csv_filename = 'transit_routes.csv'
fieldnames = ['Status', 'Info', 'Infocode', 'Origin', 'Destination', 'Distance',
'Taxi Fee', 'Transit Duration', 'Transit Fee', 'Transit Distance',
'Walking Distance', 'Bus Names', 'Bus Distances', 'Walking Distances']
with open(csv_filename, mode='w', newline='', encoding='utf-8') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for item in data:
status = item['status']
info = item['info']
infocode = item['infocode']
route = item['route']
origin = route['origin']
destination = route['destination']
distance = route['distance']
cost_info = route['cost']
taxi_fee = cost_info.get('taxi_fee')
for transit in route['transits']:
transit_cost = transit['cost']
transit_duration = transit_cost['duration']
transit_transit_fee = transit_cost.get('transit_fee')
transit_distance = transit['distance']
walking_distance = transit['walking_distance']
transit_segments = transit['segments']
bus_names = []
bus_distances = []
walking_distances = []
for segment in transit_segments:
if 'bus' in segment:
bus_info = segment['bus']
bus_name = bus_info['buslines'][0]['name']
bus_distance = bus_info['buslines'][0]['distance']
bus_names.append(bus_name)
bus_distances.append(bus_distance)
elif 'walking' in segment:
walking_info = segment['walking']
walking_distance = walking_info['distance']
walking_distances.append(walking_distance)
row_data = {
'Status': status,
'Info': info,
'Infocode': infocode,
'Origin': origin,
'Destination': destination,
'Distance': distance,
'Taxi Fee': taxi_fee,
'Transit Duration': transit_duration,
'Transit Fee': transit_transit_fee,
'Transit Distance': transit_distance,
'Walking Distance': walking_distance,
'Bus Names': ' / '.join(bus_names),
'Bus Distances': ' / '.join(bus_distances),
'Walking Distances': ' / '.join(walking_distances)
}
writer.writerow(row_data)
print(f'CSV 文件 "{csv_filename}" 已创建并成功写入。')
- 最后,解析后的数据被组织成字典,并写入到
transit_routes.csv
文件中。 fieldnames
定义了CSV文件的列名。- 通过
csv.DictWriter
,程序将每个换乘方案的详细信息写入CSV文件的一行。
总结
这个程序涵盖了从API获取数据、批量处理、数据解析、JSON和CSV文件存储等一系列功能。你可以使用这个程序来获取特定地点之间的公交换乘方案,并将详细信息保存以供后续分析和使用。