Python应用指南:高德交通态势数据

news2025/1/6 13:10:54

在现代城市的脉络中,交通流量如同流动的血液,交通流量的动态变化对出行规划和城市管理提出了更高的要求。为了应对这一挑战,高德地图推出了交通态势查询API,旨在为开发者提供一个强大的工具,用于实时获取指定区域或道路的交通状况。通过集成此API,应用和服务可以及时响应交通拥堵、事故等突发事件,从而帮助用户优化行程安排,提高出行效率,并为智能交通系统的构建贡献力量。本文聚焦于利用高德交通态势查询API中的矩形区域查询功能,探索如何高效地获取矩形范围内的路况信息和拥堵程度。

我们先来看一下官方的说明文档和参数配置:交通态势查询-高级 API 文档-开发指南-Web服务 API | 高德地图API

我们可以看到其中可以配置的参数有道路等级和矩形的左上右下的对角线坐标,这里的坐标使用的需要是GCJ-02,另外对角线距离不能超过10公里,矩形区域内交通态势查询:可选:JSON、XML,本文选择了JSON格式,方便后面导出为shp格式,道路等级一般选择6,这样获取的路况信息是最全的,有其他需求也可以自行调整;

roads可返回的所有可选道路信息;

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

方法思路

  1. 通过python写一个根据中心点和半径生成左上右下的对角线坐标的脚本;
  2. 获取对角线坐标;
  3. 写入对角线坐标,并通过交通态势查询 API查询数据保存到shp文件中;

第一步:根据配置中心点坐标和半径来生成矩形,并打印左上右下的对角线坐标;

这个需要使用高德的坐标拾取器工具在地图上选择目标区域的中心点坐标,通过配置一下中心坐标和半径距离,工具将自动生成左下和右上的对角线坐标;

完整代码#运行环境 Python 3.11

from math import cos, radians

def generate_rectangle(center_point, radius_km):
    """
    通过中心点和半径生成矩形范围

    参数:
    center_point: 中心点坐标 (格式: "经度,纬度")
    radius_km: 半径(单位:公里)

    返回:
    rectangle: 矩形范围字符串 (格式: "左下角经度,左下角纬度;右上角经度,右上角纬度")
    """
    try:
        # 解析中心点坐标
        center_lon, center_lat = map(float, center_point.split(','))

        # 经度1度约等于111公里,纬度1度约等于111*cos(纬度)公里
        # 将半径转换为度数
        lat_diff = radius_km / 111.0
        lon_diff = radius_km / (111.0 * cos(radians(center_lat)))

        # 计算矩形四个角的坐标
        min_lon = center_lon - lon_diff  # 左下角经度
        min_lat = center_lat - lat_diff  # 左下角纬度
        max_lon = center_lon + lon_diff  # 右上角经度
        max_lat = center_lat + lat_diff  # 右上角纬度

        # 格式化为字符串,保留6位小数
        rectangle = f"{min_lon:.6f},{min_lat:.6f};{max_lon:.6f},{max_lat:.6f}"

        return rectangle

    except Exception as e:
        print(f"生成矩形范围时出错: {str(e)}")
        return None


if __name__ == "__main__":
    # 示例:上海某点坐标和1公里半径
    center_point = "121.446433,31.22321"  # 中心点坐标
    radius = 2.0  # 半径2公里

    # 生成矩形范围
    rectangle = generate_rectangle(center_point, radius)
    if rectangle:
        print(f"中心点: {center_point}")
        print(f"半径: {radius}公里")
        print(f"矩形范围: {rectangle}")

将生成的左上和右下对角线坐标应用于下一个脚本中进行运行就可以得到shp文件,因为数据获取限制,获取半径最好不要超过5公里;

第二步:输入坐标点参数后,通过高德地图的交通态势查询API获取结果并导出为JSON格式,并由JSON数据将被转换为SHP文件导出,由于高德地图使用的是GCJ-02坐标系,因此在导出前脚本已自动将坐标转换为WGS84坐标系;

完整代码#运行环境 Python 3.11

import requests
import geopandas as gpd
from shapely.geometry import LineString
from datetime import datetime
import os
import math
import numpy as np
from shapely.ops import transform
from functools import partial

# 坐标转换参数
x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626  # π
a = 6378245.0  # 长半轴
ee = 0.00669342162296594323  # 扁率


def gcj02towgs84(lng, lat):
    """
    GCJ02(火星坐标系)转GPS84
    :param lng:火星坐标系的经度
    :param lat:火星坐标系纬度
    :return:
    """
    if out_of_china(lng, lat):
        return lng, lat
    dlat = transformlat(lng - 105.0, lat - 35.0)
    dlng = transformlng(lng - 105.0, lat - 35.0)
    radlat = lat / 180.0 * pi
    magic = math.sin(radlat)
    magic = 1 - ee * magic * magic
    sqrtmagic = math.sqrt(magic)
    dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
    dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
    mglat = lat + dlat
    mglng = lng + dlng
    return [lng * 2 - mglng, lat * 2 - mglat]


def transformlat(lng, lat):
    ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))
    ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0
    ret += (20.0 * math.sin(lat * pi) + 40.0 * math.sin(lat / 3.0 * pi)) * 2.0 / 3.0
    ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 * math.sin(lat * pi / 30.0)) * 2.0 / 3.0
    return ret


def transformlng(lng, lat):
    ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))
    ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0
    ret += (20.0 * math.sin(lng * pi) + 40.0 * math.sin(lng / 3.0 * pi)) * 2.0 / 3.0
    ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 * math.sin(lng / 30.0 * pi)) * 2.0 / 3.0
    return ret


def out_of_china(lng, lat):
    """
    判断是否在国内,不在国内不做偏移
    """
    if lng < 72.004 or lng > 137.8347:
        return True
    if lat < 0.8293 or lat > 55.8271:
        return True
    return False


def transform_geometry(geom):
    """转换几何对象的坐标"""

    def transform_coords(x, y, z=None):
        wgs_x, wgs_y = gcj02towgs84(x, y)
        return wgs_x, wgs_y

    return transform(transform_coords, geom)


def get_and_save_traffic_status(rectangle, key='你的key', output_dir='output'):
    try:
        # 初始化数据字典
        data = {
            'name': [],
            'status': [],  # 路况状态码 (将转换为double)
            'direction': [],
            'angle': [],
            'speed': [],
            'geometry': []
        }

        # 构建API请求URL
        url = f'https://restapi.amap.com/v3/traffic/status/rectangle?rectangle={rectangle}&output=json&extensions=all&key={key}&level=6'

        # 发送请求并获取JSON响应
        res = requests.get(url, timeout=10).json()

        # 遍历每条道路数据
        for road in res['trafficinfo']['roads']:
            try:
                polylines = [(float(y[0]), float(y[1])) for y in
                             [x.split(',') for x in road['polyline'].split(';')]]

                # 创建线几何对象
                line = LineString(polylines)

                # 转换为WGS84坐标系
                wgs84_line = transform_geometry(line)

                data['geometry'].append(wgs84_line)
                data['name'].append(road.get('name', ''))
                # 将status转换为float类型
                data['status'].append(float(road.get('status', '0')))
                data['direction'].append(road.get('direction', ''))
                data['angle'].append(float(road.get('angle', 0)))
                data['speed'].append(int(road.get('speed', 0)))
            except:
                continue

        # 创建GeoDataFrame对象
        gdf = gpd.GeoDataFrame(data, geometry='geometry', crs='EPSG:4326')

        # 确保status列为float64类型
        gdf['status'] = gdf['status'].astype(np.float64)

        # 创建输出目录
        os.makedirs(output_dir, exist_ok=True)

        # 生成文件名
        filename = f'traffic_status_{datetime.now().strftime("%Y%m%d%H%M%S")}_wgs84.shp'

        # 保存为shapefile
        output_path = os.path.join(output_dir, filename)
        gdf.to_file(output_path, encoding='utf-8')
        print(f"已保存WGS84坐标系数据到: {output_path}")


    except Exception as e:
        print(f"处理出错: {str(e)}")


if __name__ == "__main__":
    rectangle = '121.425363,31.205192;121.467503,31.241228' # 替换生成的坐标
    get_and_save_traffic_status(rectangle)

这里结果会保存在脚本所在目录的output/traffic_status_2025xxxxxx_wgs84.shp,直接把导出结果在arcgis加载即可,其中的status字段是路况字段,在可视化的过程中,符号系统字段选择status字段,这样我们就可以在图上直观的看出拥堵的位置区域;

status

路况

0:未知;1:畅通;2:缓行;3:拥堵

数据更新频率参考高德的拥堵延时指数应该是5分钟自动刷新,可以通过增加脚本定时自动运行的逻辑来实现全时段监测;

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2270812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构与算法Python版 图的应用与广度优先搜索

文章目录 一、图的应用-词梯问题二、图的广度优先搜索 一、图的应用-词梯问题 词梯问题 Word Ladder 从一个单词演变到另一个单词&#xff0c;其中的过程可以经过多个中间单词。要求是相邻两个单词之间差异只能是1个字母如FOOL变SAGE&#xff1a;FOOL >> POOL >>…

服务器数据恢复—服务器硬盘亮黄灯的数据恢复案例

服务器硬盘指示灯闪烁黄灯是一种警示&#xff0c;意味着服务器硬盘出现故障即将下线。发现这种情况建议及时更换硬盘。 一旦服务器上有大量数据频繁读写&#xff0c;硬盘指示灯会快速闪烁。服务器上某个硬盘的指示灯只有黄灯亮着&#xff0c;而其他颜色的灯没有亮的话&#xff…

Java SpringBoot使用EasyExcel导入导出Excel文件

点击下载《Java SpringBoot使用EasyExcel导入导出Excel文件(源代码)》 在 Java Spring Boot 项目中&#xff0c;导入&#xff08;读取&#xff09;和导出&#xff08;写入&#xff09; Excel 文件是一项常见的需求。EasyExcel 是阿里巴巴开源的一个用于简化 Java 环境下 Excel…

Deduction(演绎法)和Reduction(还原法)-关于中西方思维的差异

Deduction(演绎法)和Reduction(还原法)-关于中西方思维的差异 最近看到中国新一代战机上天的消息,感慨万千;忽然想起来两年多前一次爬山的时候,一个友人跟我大概说过,Deduction和Reduction分别对应了中国古代和西方古代以来的思考自然和技术发明的思想.于是又在这方面琢磨了一番…

unity学习6:unity的3D项目的基本操作

目录 1 unity界面的基本认识 1.1 file 文件 1.2 edit 编辑/操作 1.3 Assets 1.4 gameobject 游戏对象 1.5 组件 1.6 windows 2 这些部分之间的关系 2.1 关联1&#xff1a; Assets & Project 2.2 关联2&#xff1a;gameobject & component 2.3 关联3&#xff…

【银河麒麟高级服务器操作系统实例】tcp半链接数溢出分析及处理全过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://document.kylinos.cn 服务器环境以及配置 系统环境 物理机/虚拟机/云…

k8s基础(2)—Kubernetes-Namespace

一、Namespace概述 名字空间 在 Kubernetes 中&#xff0c;名字空间&#xff08;Namespace&#xff09; 提供一种机制&#xff0c;将同一集群中的资源划分为相互隔离的组。 同一名字空间内的资源名称要唯一&#xff0c;但跨名字空间时没有这个要求。 名字空间作用域仅针对带有…

.NET框架用C#实现PDF转HTML

HTML作为一种开放标准的网页标记语言&#xff0c;具有跨平台、易于浏览和搜索引擎友好的特性&#xff0c;使得内容能够在多种设备上轻松访问并优化了在线分享与互动。通过将PDF文件转换为HTML格式&#xff0c;我们可以更方便地在浏览器中展示PDF文档内容&#xff0c;同时也更容…

医学图像分析工具01:FreeSurfer || Recon -all 全流程MRI皮质表面重建

FreeSurfer是什么 FreeSurfer 是一个功能强大的神经影像学分析软件包&#xff0c;广泛用于处理和可视化大脑的横断面和纵向研究数据。该软件由马萨诸塞州总医院的Martinos生物医学成像中心的计算神经影像实验室开发&#xff0c;旨在为神经科学研究人员提供一个高效、精确的数据…

JavaScript 基础2

js的运算符 算数运算符 相加求和&#xff0c;如果用在字符串则是拼接 -相减求差 *相乘求积 /相除求商 %模除求余 具体用法如下 let num 154 let num2 15 document.write(numnum2) document.write(<br>) document.write(num-num2) document.write(<br>) do…

Leecode刷题C语言之我的日程安排表②

执行结果:通过 执行用时和内存消耗如下&#xff1a; typedef struct {int start;int end; }BOOKING;#define MAX_BOOK_NUM (1000) typedef struct MyCalendar_ {BOOKING book[MAX_BOOK_NUM];int bnum;BOOKING *sorted[MAX_BOOK_NUM];int num;int conflict[MAX_BOOK_NUM];int c…

【C语言的小角落】--- 深度理解取余/取模运算

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; C语言的小角落 本篇博客我们来深度理解取余/取模&#xff0c;以及它们在不同语言中出现不同现象的原因。 &#x1f3e0; 关于取整 &#x1f3b5; 向0取整…

网关的主要类型和它们的特点

网关&#xff0c;作为网络通信的关键节点&#xff0c;根据其应用场景和功能特点&#xff0c;可以分为多种类型。 1.协议网关 特点&#xff1a; • 协议转换&#xff1a;协议网关的核心功能是转换不同网络之间的通信协议。例如&#xff0c;它可以将IPv4协议的数据包转换为IPv6协…

聆听音乐 1.5.9 | 畅听全网音乐,支持无损音质下载

聆听音乐手机版是面向广大音乐爱好者的移动应用程序&#xff0c;用户可以随时随地通过手机享受丰富的音乐资源。它提供了多种魅力功能&#xff0c;让用户在手机上畅享更舒适的音乐体验&#xff0c;每位用户都能享受精彩纷呈的收听体验。此外&#xff0c;软件还支持无损音质音乐…

实现一个通用的树形结构构建工具

文章目录 1. 前言2. 树结构3. 具体实现逻辑3.1 TreeNode3.2 TreeUtils3.3 例子 4. 小结 1. 前言 树结构的生成在项目中应该都比较常见&#xff0c;比如部门结构树的生成&#xff0c;目录结构树的生成&#xff0c;但是大家有没有想过&#xff0c;如果在一个项目中有多个树结构&…

“善弈者”也需妙手,Oclean欧可林:差异化不是说说而已

作者 | 曾响铃 文 | 响铃说 俗话说&#xff0c;“牙痛不是病&#xff0c;痛起来要人命”。这话意思大家都知道&#xff0c;牙痛虽不是什么大病&#xff0c;可一旦发作却是极难忍受。 前几日&#xff0c;Oclean欧可林举办了一场AirPump A10氧气啵啵冲牙器新品品鉴会&#xff…

汇编语言与接口技术--跑马灯

一、 实验要求 在单片机开发板的LED灯D1~D8上实现跑马灯。LED与单片机引脚连线电路如下图: 单片机芯片选择AT89C51&#xff0c;晶振频率设为12MHz&#xff0c;操作参考单片机开发板使用说明。跑马灯点亮的时间间隔约为1秒。分别用定时器的模式1和模式2实现。&#xff08;用P83…

基于数据融合的智能家居环境监测系统研究与设计(论文+源码)

1总体方案设计 本次基于数据融合的智能家居环境监测系统的设计&#xff0c;其系统总体架构如图2.1所示&#xff0c;整个系统在器件上包括了主控制器STM32F103单片机&#xff0c;MQ可燃气体传感器&#xff0c;光照传感器&#xff0c;DHT11温湿度传感器&#xff0c;风扇&#xff…

Mac中配置Node.js前端vscode环境(第二期)

核心组件&#xff1a;vscode、谷歌浏览器、Node.js&#xff08;重点&#xff09;、git 一、Node.js安装&#xff08;nvm安装&#xff09; 点击macos中的终端&#xff0c;保持bash&#xff0c;而不是zsh 若为zsh&#xff0c;则可在终端中使用下面命令变成bash chsh -s /bin/…

基于SpringBoot和Thymeleaf的仿小米电商系统源码下载与安装指南-幽络源

项目概述 这是一个基于 Spring Boot 2.X 和 Thymeleaf 技术栈的仿小米电商系统。该项目包括了前台商城系统和后台管理系统&#xff0c;经幽络源测试具备完整的电商功能&#xff0c;适合用作学习、参考或作为开发电商系统的基础。 前台商城系统&#xff1a; 包括首页登录、商品…