You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python gpxpy库识别GPX轨迹暂停时段及地址查询

基于gpxpy识别轨迹暂停时段并查询地址

一、识别轨迹暂停时段

暂停判定的核心是连续轨迹点间的时间间隔超过设定阈值,且位置移动距离极小(排除GPS漂移误判),以下是具体实现:

实现思路

  1. 遍历GPX文件的所有轨迹段与轨迹点
  2. 计算相邻两点的时间差与实际距离
  3. 当时间差≥设定的暂停阈值,且距离≤位置漂移阈值时,判定为暂停并记录相关信息

代码实现

import gpxpy.gpx
import datetime
from geopy.distance import geodesic

def detect_pauses(gpx, pause_threshold_min=5, distance_threshold_m=10):
    pauses = []
    for track in gpx.tracks:
        for segment in track.segments:
            points = segment.points
            if len(points) < 2:
                continue
            # 遍历连续轨迹点对
            for i in range(1, len(points)):
                prev_point = points[i-1]
                curr_point = points[i]
                # 计算时间差(转换为分钟)
                time_diff = (curr_point.time - prev_point.time).total_seconds() / 60
                # 计算两点实际距离(米)
                distance = geodesic(
                    (prev_point.latitude, prev_point.longitude),
                    (curr_point.latitude, curr_point.longitude)
                ).meters
                # 判定暂停
                if time_diff >= pause_threshold_min and distance <= distance_threshold_m:
                    pauses.append({
                        "start_time": prev_point.time,
                        "end_time": curr_point.time,
                        "duration_min": round(time_diff, 2),
                        "location": (prev_point.latitude, prev_point.longitude)
                    })
    return pauses

if __name__ == "__main__":
    # 读取GPX文件
    file = '../original/2019-07 Dunwich_Dynamo.gpx'
    with open(file, 'r') as gpx_file:
        gpx = gpxpy.parse(gpx_file)
    
    # 检测暂停时段
    pauses = detect_pauses(gpx)
    
    # 输出结果
    if pauses:
        print("识别到的暂停时段:")
        for idx, pause in enumerate(pauses, 1):
            print(f"暂停{idx}:")
            print(f"  开始时间: {pause['start_time']}")
            print(f"  结束时间: {pause['end_time']}")
            print(f"  时长: {pause['duration_min']}分钟")
            print(f"  地点: 纬度{pause['location'][0]}, 经度{pause['location'][1]}")
            print("-" * 50)
    else:
        print("未检测到符合条件的暂停时段")

代码说明

  • 用geopy.geodesic计算两点实际距离,避免GPS漂移导致的误判
  • 可通过调整pause_threshold_min(暂停阈值分钟数)和distance_threshold_m(位置漂移阈值米数)适配不同场景
  • 输出包含暂停的时间范围、时长与经纬度坐标

二、暂停地点的地址查询

通过逆地理编码可将经纬度转换为实际地址,推荐使用geopy的Nominatim(基于OpenStreetMap,无需API密钥):

代码扩展

from geopy.geocoders import Nominatim

def get_address(lat, lon):
    geolocator = Nominatim(user_agent="gpx_pause_detector")
    location = geolocator.reverse(f"{lat}, {lon}", exactly_one=True)
    return location.address if location else "无法查询到地址"

# 整合到主函数中
if __name__ == "__main__":
    # 读取GPX文件与检测暂停的代码同上...
    
    # 输出结果并查询地址
    if pauses:
        print("识别到的暂停时段:")
        for idx, pause in enumerate(pauses, 1):
            lat, lon = pause['location']
            address = get_address(lat, lon)
            print(f"暂停{idx}:")
            print(f"  开始时间: {pause['start_time']}")
            print(f"  结束时间: {pause['end_time']}")
            print(f"  时长: {pause['duration_min']}分钟")
            print(f"  地点: 纬度{lat}, 经度{lon}")
            print(f"  地址: {address}")
            print("-" * 50)

注意事项

  • Nominatim有请求频率限制,避免短时间内大量查询
  • 若需更精准的地址,可改用高德、百度等商业逆地理编码服务(需申请API密钥)

内容的提问来源于stack exchange,提问作者Paul Allen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 11:13:11