python_高德地图驾车时长查询
bash
# 使用此指令前,请确保安装必要的Python库,例如使用以下命令安装:
# pip install requests
import requests
from typing import *
try:
from xbot.app.logging import trace as print
except:
from xbot import print
def gaode_driving_duration(origin_name, destination_name, api_key):
"""
title: 高德地图驾车时长查询V2.0
description: 根据起点地址 %origin_name% 和终点地址 %destination_name%,调用高德地图API %api_key% 获取预计驾车时长(分钟)。
inputs:
- origin_name (str): 起点地址名称,eg: "北京天安门"
- destination_name (str): 终点地址名称,eg: "北京朝阳站"
- api_key (str): 高德地图Web服务API Key,eg: "XXX"
outputs:
- duration_info (dict): 包含预计时长的字典,eg: {"时长(分钟)": 25.5}
"""
def _geocode(address, key):
"""将地址解析为经纬度坐标"""
url = "https://restapi.amap.com/v3/geocode/geo"
params = {
"key": key,
"address": address,
"output": "json"
}
try:
response = requests.get(url, params=params, timeout=10)
response.raise_for_status()
res_data = response.json()
if res_data.get("status") == "1" and res_data.get("geocodes"):
return res_data["geocodes"][0]["location"]
else:
raise ValueError(f"地址解析失败: {address}, 错误信息: {res_data.get('info')}")
except Exception as e:
raise RuntimeError(f"请求高德地理编码接口出错: {str(e)}")
# 1. 获取起点和终点的经纬度
origin_coords = _geocode(origin_name, api_key)
destination_coords = _geocode(destination_name, api_key)
# 2. 调用驾车路线规划 2.0 接口
url = "https://restapi.amap.com/v5/direction/driving"
params = {
"key": api_key,
"origin": origin_coords,
"destination": destination_coords,
"show_fields": "cost",
"output": "json"
}
try:
resp = requests.get(url, params=params, timeout=10)
resp.raise_for_status()
data = resp.json()
if data.get("status") != "1":
raise ValueError(f"路线规划失败: {data.get('info')}")
paths = data.get("route", {}).get("paths", [])
if not paths:
raise ValueError("未找到合适的驾车路线")
# 3. 计算时长(取所有路径中cost对应duration的平均值)
total_duration = sum(int(path["cost"]["duration"]) for path in paths)
average_duration_seconds = total_duration / len(paths)
# 4. 转换为分钟并保留一位小数
duration_minutes = round(average_duration_seconds / 60, 1)
return {
"时长(分钟)": duration_minutes
}
except Exception as e:
raise RuntimeError(f"请求高德路径规划接口出错: {str(e)}")