Strava-api导出活动的GPX文件



登录Strava并调用此链接时,我可以很好地下载活动的GPX文件:https://www.strava.com/activities/5656012590/export_original我得到了原始的gpx。它看起来像我需要的。

有v3 api的方法吗?我想用swagger生成的代码访问它,一个la

new ActivitiesApi(getApiClientWithToken(token)).getLoggedInAthleteActivities(System.currentTimeSeconds().toInteger(), 0, 1, 30)

(Groovy代码,用于获取活动(

我唯一发现的是https://www.strava.com/api/v3/routes/{id}/export_gpx。但从我在活动的Api响应中看到的情况来看,它没有附加路由。在活动中,我可以看到一个"externalId",它被设置为"123456123.gpx",我可以从地图上看到多段线。但现在转换多段线听起来太费力了,我想它漏掉了一些点。访问externalID,我不知道。

最后,我真的不在乎如何获得GPX。如果它是一个cURL调用,通过post传递令牌,然后下载它,那就好了,也可以用Java API从swagger获得它。不过,我更喜欢后一种选择。

只需在此处添加它,以防有用。Strava API还可以下载数据流(请参阅API文档(。我相信这会提供更多的信息,例如隐私区内的私人活动和GPX点等,假设API范围设置为read_all。

我在Python中使用API,但我认为它在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文件。

我能得到的最接近的是使用流API,如其他文章中所述。

StreamSet streamSet = streamsApi.getActivityStreams(activityId as long, ['latlng', 'altitude', 'time'], true)
def altitudes = streamSet.getAltitude().getData()
def latLong = streamSet.getLatlng().getData()
def times = streamSet.getTime().getData()
ArrayList<StreamData> data = []
for (int i = 0; i < times.size(); i++) {
StreamData streamData = new StreamData()
streamData.id = activityId as long
streamData.time = times[i]
streamData.startTime = startTime
streamData.altitude = altitudes[i]
streamData.latitude = latLong[i][0]
streamData.longitude = latLong[i][1]
data << streamData
}

然后用它构建我自己的GPX文件:

def stringWriter = new StringWriter()
def gpxBuilder = new MarkupBuilder(stringWriter)
gpxBuilder.mkp.xmlDeclaration(version: "1.0", encoding: "utf-8")
gpxBuilder.gpx() {
metadata() {
time(startTime)
}
trk() {
name(NEW_ACTIVITY_NAME)
type(convertedType)
trkseg() {
for (def item : streamData) {
trkpt(lat: item.latitude, lon: item.longitude) {
ele(item.altitude)
time(UtcTimeString)
}
}
}
}
}
stringWriter.toString()

上传到Strava效果很好。

最新更新