strava - Strava api 导出活动的 GPX 文件
问题描述
登录到 Strava 并调用此链接时,我可以很好地下载我的 GPX 文件:https : //www.strava.com/activities/5656012590/export_original 我得到了原始 gpx。它看起来像我需要的那样。
有v3 api方式吗?我想用 swagger 生成的代码来访问它,a la
new ActivitiesApi(getApiClientWithToken(token)).getLoggedInAthleteActivities(System.currentTimeSeconds().toInteger(), 0, 1, 30)
(Groovy 代码,这适用于获取活动)
我唯一找到的是https://www.strava.com/api/v3/routes/{id}/export_gpx。但是从我在活动的 Api 响应中看到的,它没有附加路由。在活动中,我可以看到设置为“123456123.gpx”之类的“externalId”,并且可以从地图中看到折线。但是现在转换折线听起来太费力了,我想它错过了一些要点。访问externalID,我不知道。
最后,我真的不在乎如何获得 GPX。如果它是通过 post 传递令牌然后下载它的 cURL 调用,那很好,也可以使用 Java API 从 swagger 获取它。不过,我更喜欢后一种选择。
解决方案
只需在此处添加它以防万一。Strava API 还能够下载数据流(请参阅此处的API 文档)。我相信这会提供更多信息,例如隐私区域内的私人活动和 GPX 点等。假设 API 范围设置为 read_all。
我将 API 与 Python 一起使用,但我认为它在 Java 中的工作原理基本相同。另请注意,我只是将其作为一种爱好,因此可能有一种更有效的方法来执行以下操作...
此处提供有关创建 gpx 文件的示例
下面的代码应该从 Strava API 下载数据流,然后从这些数据流生成 GPX 文件。
import requests as r
import pandas as pd
import json
import gpxpy.gpx
from datetime import datetime, timedelta
#This info is in activity summary downloaded from API
id = 12345678 #activity ID
start_time = '2022-01-01T12:04:10Z' #activity start_time_local
#get access token for API
with open('config/strava_tokens.json') as f:
strava_tokens = json.load(f)
access_token = strava_tokens['access_token']
# Make API call
url = f"https://www.strava.com/api/v3/activities/{id}/streams"
header = {'Authorization': 'Bearer ' + access_token}
latlong = r.get(url, headers=header, params={'keys':['latlng']}).json()[0]['data']
time_list = r.get(url, headers=header, params={'keys':['time']}).json()[1]['data']
altitude = r.get(url, headers=header, params={'keys':['altitude']}).json()[1]['data']
# Create dataframe to store data 'neatly'
data = pd.DataFrame([*latlong], columns=['lat','long'])
data['altitude'] = altitude
start = datetime.strptime(start_time, "%Y-%m-%dT%H:%M:%SZ")
data['time'] = [(start+timedelta(seconds=t)) for t in time_list]
gpx = gpxpy.gpx.GPX()
# Create first track in our GPX:
gpx_track = gpxpy.gpx.GPXTrack()
gpx.tracks.append(gpx_track)
# Create first segment in our GPX track:
gpx_segment = gpxpy.gpx.GPXTrackSegment()
gpx_track.segments.append(gpx_segment)
# Create points:
for idx in data.index:
gpx_segment.points.append(gpxpy.gpx.GPXTrackPoint(
data.loc[idx, 'lat'],
data.loc[idx, 'long'],
elevation=data.loc[idx, 'altitude'],
time=data.loc[idx, 'time']
))
# Write data to gpx file
with open('output.gpx', 'w') as f:
f.write(gpx.to_xml())
我刚刚向 GitHub 添加了一个 python 代码,希望可以从 Strava 下载所有用户的 GPX 文件。
推荐阅读
- php - Laravel 多态关系同时存储数据
- c++11 - c ++随机设置种子失败
- react-router-v4 - 将 withTheme 包装的组件传递给 Route 时为什么会发出警告?
- mysql - 在配置文件中添加 lower_case_table_names=2 后,mysql 8.0 将启动
- python - 无法卸载“numpy”。它是一个 distutils 安装的项目,因此我们无法准确确定哪些文件属于
- java - git api 在 Java 上进行操作
- angular - Angular 7从组件导航到另一个
- c# - 如何在 web api swagger 的标头中将用户名作为 base 64 编码格式传递?
- spring-boot - Thymeleaf th:field 不绑定输入文本的值
- python - Pandas 中的时间序列数据集到每小时特征数据集