65.9K
CodeProject 正在变化。 阅读更多。
Home

导出 Chaser Windows Phone Strava 应用的行程数据

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2013年7月6日

公共领域

5分钟阅读

viewsIcon

13912

本文将介绍如何将 Chaser Windows Phone 应用中的最后一次行程数据导出,并将其转换为 GPX 数据,以便您可以手动上传到 Strava。

引言

Strava 已停止支持其 V1 和 V2 API,并且只允许选定的合作伙伴使用其 V3 API。Windows Phone 没有官方的 Strava 应用,因此任何正在使用的应用都已停止工作,而没有提供将数据直接从手机上传到 Strava 的完全集成选项。

我使用了一款名为 Chaser 的特定应用,并在他们关闭 V2 API 的那天记录了一次骑行。我不想丢失这些数据,所以我开始寻找一种收集这些数据的方法。该应用本身没有内置的方法来实现这一点。本文将介绍如何将数据从手机中导出,并将其转换为正确的格式(.GPX),以便正确上传到 Strava。

许多 Windows Phone 应用仅通过第三方支持。不幸的是,这意味着其他应用也很可能发生这种情况。本文中的一些信息可能对您从手机中提取数据有所帮助。反序列化 JSON 并将其序列化为 XML 的示例可能也很有用;尽管实现方式不同;但相同的总体范例也适用。

背景

无法访问 Windows Phone 上应用的内部存储。为了从手机中获取数据,我使用 Fiddler 作为手机的代理。使用 Fiddler 作为代理可让您查看发送到手机的所有 HTTP 网络流量。由于 Chaser 应用在未先验证身份验证令牌的情况下,只是将包含所有行程信息的 JSON 块发送到 Strava,因此您可以轻松获取行程的所有数据。

获取数据后,它会以某种非标准格式存储。有一种常见的 GPS 数据格式称为 .GPX。许多网站支持 GPX,并且该标准与 schema 一起发布。我们将把数据重新格式化为 .GPX 文件,然后您可以将其上传到 Strava 或任何接受 .GPX 数据的其他网站。

设置代理的步骤

  1. 安装 Fiddler - 如果您还没有安装 Fiddler,可以使用此链接在您的台式电脑上安装它。我安装的是 4.0 版本,但我想其他版本也应该同样有效。
  2. 将 Fiddler 配置为代理并将 Windows Phone 设置为通过代理进行连接 - Fiddler 网站上有关于如何执行此操作的出色说明。这些说明在 Windows Phone 8 上对我来说也同样有效。我必须将台式电脑连接到以太网才能使其正常工作,不确定这是否对每个人都适用。
  3. 启动 Fiddler - 运行 Fiddler 后,它将充当代理,您应该可以在电脑上看到手机的所有 HTTP 流量。现在,在 Windows Phone 上访问任何网页进行测试,并确保您可以在 Fiddler 中看到数据。

捕获数据

  1. 尝试上传数据 - 将手机设置为代理后,您可以进入 Chaser 应用,点击“完成”按钮,然后点击“上传”按钮。现在已经设置好了代理,您将在 Fiddler 中看到包含您的行程的封包。所有数据都包含在一个 JSON 块中。

    Image of Chaser Upload Screen

    Chaser 上传屏幕的图像
  2. 保存数据 - 将 Fiddler 中的 JSON 块复制粘贴到文本文件中。根据您实现的以下代码,您可以将其保存到文件中,或者将其作为 string 传递以将其转换为 .gpx

    数据应如下所示

    {"token": "XxxxXxxxxxx",
                                    "id": "2013-07-05T14:08:56",
                                    "activity_type":"Ride",
                                    "activity_name":"Jul Fri 5 14:07 2013",
                                    "type": "json",
                                    "data_fields": ["time", "latitude", "longitude"],
                                    "data": [["2013-07-04T00:10:28",47.63803872, -122.12497856],
    ["2013-07-04T00:10:38",47.63819225, -122.12509857],
    ["2013-07-04T00:10:43",47.6381939649582, -122.125069499016],
    ["2013-07-04T00:10:47",47.6381939649582, -122.125101685524],
    ["2013-07-04T00:11:10",47.63819442, -122.12514232],
    ["2013-07-04T00:11:11",47.6381948, -122.12514444],
    ["2013-07-04T00:11:12",47.63819501, -122.12514552],
    ["2013-07-04T00:11:13",47.6381971, -122.12514657],
    ["2013-07-04T00:11:14",47.6382686, -122.1252347],
    ["2013-07-04T00:11:15",47.63830859, -122.125289],
    ["2013-07-04T00:11:16",47.63832192, -122.12532939],
    ["2013-07-04T00:11:18",47.63833359, -122.12537187],
    ["2013-07-04T00:11:21",47.63834116, -122.12540437],
    ["2013-07-04T00:11:24",47.63834063, -122.12543642],
    ["2013-07-04T00:11:40",47.63834157, -122.12546144],
    ["2013-07-04T00:12:32",47.63834165, -122.12492476],
    ["2013-07-04T01:14:35",47.59522847, -122.30526577],
    ["2013-07-04T01:23:56",47.6166450977325, -122.307384610176],
    ["2013-07-04T01:24:04",47.6166558265686, -122.307406067848]] 
                                            }

代码

  1. .GPX schema 创建序列化类

    正如我之前提到的,.GPX schema 是公开的,可以在 http://www.topografix.com/GPX/1/1/gpx.xsd 找到。Visual Studio 提供了一个 命令行工具,用于从 XSD 创建序列化类。下载 XSD,然后打开 Visual Studio 命令提示符。您可以使用类似 'xsd /c gpx.xsd' 的命令行运行该工具,它将生成一个类文件 gpx.cs。您可以将此文件添加到 Visual Studio 项目中,我们将使用它将数据转换为 GPX 文件数据。

  2. 反序列化 JSON 块

    保存数据后,您需要将其转换为 .GPX 格式。我用 C# 编写了一个快速的辅助方法来完成此操作。

using 语句

using System;
using System.Collections.Generic;
using System.IO;
using System.Web.Script.Serialization;
using System.Xml.Serialization;

我们使用 System.Web.Script.Serialization 命名空间中的 JavaScriptSerializer 类,这需要您添加对 System.Web.Extensions.dll 的引用,因为它默认未在 C# 项目中引用。我们还使用 System.Xml.Serialization 类中的 XmlSerializer 类。

序列化 JSON 数据

使用 JavaScriptSerializer 类序列化 JSON 数据相对简单。

var serializer = new JavaScriptSerializer();
object obj = serializer.DeserializeObject(json);
Dictionary<string, object><string,> jsonDictionary = (Dictionary<string, object><string,>)obj;
</string,></string,>

这将创建一个松散类型集合。每个项目的键对应于 JSON 块中“:”之前的数据,而值中包含的对象是该对象“:”之后的所有内容。

创建 GPX 对象

我从 Strava 下载了一个 .GPX 文件,以比较 JSON 块与 GPX 文件的映射方式。通过这样做,我能够确定 GPX 对象的结构。

gpxType gpx = new gpxType();
gpx.creator = "Strava JSON to GPX convertor";
gpx.metadata = new metadataType();
gpx.metadata.author = new personType();
gpx.metadata.author.name = "Nigel Stuke"; 
gpx.version = "1.1";
gpx.trk = new trkType[1];
gpx.trk[0] = new trkType();
gpx.trk[0].name = "The name for this ride";
gpx.trk[0].trkseg = new trksegType[1];
gpx.trk[0].trkseg[0] = new trksegType(); 

这将创建对象并实例化一些字段。其中一些数据(活动名称)可以从 JSON 数据中提取。但我们主要关心的是 GPS 数据。

转换数据

查看 JSON 块,我们可以看到三个值:“time”、“latitude”和“longitude”。我们可以轻松地将每个数据点的这些值取出来,并将其填入 GPX 文件中的相应类型。

object dataObject = jsonDictionary["data"];
object[] dataObjects = (object[])dataObject;
wptType[] waypoints = Array.ConvertAll(
    dataObjects,
    new Converter<object, wptType>(
        (waypointObject) =>
        {
            object[] waypointObjects = (object[])waypointObject;
            DateTime dateTime = Convert.ToDateTime(waypointObjects[0]);
            Decimal latitude = Convert.ToDecimal(waypointObjects[1]);
            Decimal longitude = Convert.ToDecimal(waypointObjects[2]);
            var waypoint = new wptType();
            waypoint.time = dateTime;
            waypoint.timeSpecified = true; 
            waypoint.lat = latitude;
            waypoint.lon = longitude;
            return waypoint;
        }));

gpx.trk[0].trkseg[0].trkpt = waypoints; 

这将使我们从 JSON 块中获得所有元素,并将其转换为 .GPX 格式的正确数据点类型。

现在您已将数据作为 .GPX 对象,您可以将其简单地序列化为 .GPX 文件,或者对其进行任何您想进行的操作。这将使您不必丢弃数据;您现在可以通过电脑导入您的数据!

using (StreamWriter sw = new StreamWriter("output.gpx"))
{
    XmlSerializer serializer = new XmlSerializer(typeof(gpxType));
    serializer.Serialize(sw, gpx); 
}

在我的例子中,我上传了新文件,并能够看到行程已正确绘制并导入到 Strava。希望您也能使用此模式来捕获 Windows Phone 的数据。

© . All rights reserved.