python_高德地图驾车时长查询

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)}")
相关推荐
镜子AI1 小时前
镜子AI技术实践:用 Python 做 GEO 答案的实体提及抽取与归一化(零依赖两阶段方案)
python·ai
I Am a robert girl1 小时前
从点到面:Superquadric 分解中“几何感知内点精修”的工程拆解
python·ransac·点云处理·三维感知·superquadric·几何基元拟合·内点判定
时间售卖铺1 小时前
MySQL 日志管理
运维·数据库·mysql·云原生
计算机毕业编程指导师1 小时前
计算机毕设推荐:基于深度学习的动物图像识别方法研究(Python+Django+PyTorch)
pytorch·python·深度学习·计算机·毕业设计·课程设计·图像识别
Java后端的Ai之路1 小时前
【AIAgent项目-AI生成PPT-09】灵活排版
前端·vue.js·人工智能·python·powerpoint
秋风点枝1 小时前
数据库 01 · 体系结构与存储引擎
数据库·mysql
~~刘杨1 小时前
用 Python 批量处理商品图:抠图、高清放大与图生视频(同步 API 完整示例)
图像处理·python·aigc
小小张说故事1 小时前
Python 拼字符串为什么别在循环里用 +=?拆开 join 的两遍账:191.8 微秒与 6.8 微秒
python
CodeGL1 小时前
15、Python 访问数据库
数据库·python