GPS Runner Maps: 我的第一个 Windows Azure 应用程序






4.90/5 (12投票s)
这是一个“云”Web 应用程序,用于在 Google 或 Bing 地图上显示 GPS 轨迹。
引言
这是一个“云”Web 应用程序,用于在 Google 或 Bing 地图上显示 GPS 轨迹,基于最新的 Windows Azure 软件开发工具包 (2009 年 11 月)。如果您想启动一个新的 Windows Azure 应用程序,或者想找到代码来在 Google/Bing 地图上用服务器代码显示 GPS 数据,此代码可能对您有用。它不是一个完整的应用程序,例如像 Every Trail 这样专业设计的网站。该应用程序使用与 Azure Table Storage 配合使用的 ASP.NET 提供程序 (来自 Windows Azure 代码示例的 AspProviders 示例),因此它与传统的 Web 应用程序没有太大区别。它使用 Table Storage 存储数据。当我开始开发时,SQL Azure 尚不可用。我强烈建议使用 SQL Azure,因为 Table Storage 有一些限制(尽管它应该更快)。
应用程序描述
我将该应用程序作为 PersonalWebSite 示例的克隆开始。它具有注册/登录的标准功能。通过“添加轨迹”页面,您可以通过上传标准的 GPX 文件并给出名称、您的国家和描述来添加轨迹。您还可以选择轨迹是否公开。在“轨迹”页面中,您可以查看所有公共轨迹和您的私人轨迹,或按用户和国家/地区进行筛选。“查看”按钮在所选地图(Google 或 Bing)中显示轨迹。如果您以注册用户身份登录,则将显示一个删除按钮,用于删除您自己的轨迹。

“详细信息”按钮显示轨迹,其点以点显示,以及一些统计信息。“地图动画”功能为您提供轨迹的虚拟“旅程”。地图以可调整的速度集中在连续的轨迹点上。提供了一个暂停/继续按钮。在这种模式下,Bing 鸟瞰图特别有吸引力。最后,提供了一个链接来显示该区域的完整 Google/Bing 网页。

Using the Code
该代码在 SDK 提供的本地开发结构中工作。Table Storage 由默认 SQL express 安装中的数据库模拟。如果您想将其发布到 Windows Azure 环境中,请替换 ServiceConfiguration.cscfg 配置文件中的键值。
Table Storage 用于存储轨迹/坐标数据。有关 Table Storage 的教程,请参阅 Windows Azure 平台培训工具包。您只需从 TableServiceEntity
基类派生您的实体类,并使用 LINQ 代码进行查询。不幸的是,不支持 Count
和 Take
操作。可以使用自定义标头实现分页,如下所示。有关更多信息,请参阅此视频。
private void DataBindTracks()
{
try
{
DataServiceQuery tracksQuery = this.GetTracks(this.PageSize);
// int c = tracksQuery.Count(); --> unfortunately count is not supported
var continuation = Request["ct"];
if (continuation != null)
{
string[] tokens = continuation.Split('/');
string partitionToken = tokens[0];
string rowToken = tokens[1];
tracksQuery.AddQueryOption("NextPartitionKey", partitionToken).
AddQueryOption("NextRowKey", rowToken);
}
QueryOperationResponse res = (QueryOperationResponse)tracksQuery.Execute();
string nextPartition = null;
string nextRow = null;
res.Headers.TryGetValue("x-ms-continuation-NextPartitionKey", out nextPartition);
res.Headers.TryGetValue("x-ms-continuation-NextRowKey", out nextRow);
dtlTracks.DataKeyField = "TrackId";
dtlTracks.DataSource = res;
// bind data list
dtlTracks.DataBind();
if (nextPartition != null && nextRow != null)
{
navNext.NavigateUrl = string.Format("?ct={0}/{1}", nextPartition, nextRow);
}
else
{
navNext.Enabled = false;
}
if (continuation == null)
{ navPrev.Enabled = false; }
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
throw ex;
}
//Checking for enabling/disabling next/prev buttons.
//Next/prev button will be disabled when it is the last/first page of the pageobject.
}
/// <summary>
/// Gets the public tracks from all users filtered by country.
/// </summary>
/// <returns></returns>
public static DataServiceQuery<trackrow> GetPublicTracks(string country)
{
try
{
GpsDataContext svc = GetGpsDataContext();
DataServiceQuery<trackrow> rows = (DataServiceQuery<trackrow>)
from tr in svc.Tracks where tr.IsPublic == true select tr;
if (!string.IsNullOrEmpty(country))
{ rows = (DataServiceQuery<trackrow>)rows.Where
(tr => tr.Country == country); }
return rows;
}
catch (Exception ex)
{
Log.Write(EventKind.Error, "Could not get tracks" + ex.Message);
throw ex;
}
}
“后退”按钮只是调用 history.go(-1)
JavaScript 代码以返回到上一页。
在这里,我不得不坦白。分页在我的应用程序中不起作用,尽管返回并使用了延续标头。它总是显示第一页。如果有人发现了原因,请在文章中发表评论。
Google 地图的显示是在服务器端完成的,使用的是名为 Google Maps for ASP.NET 的用户控件,该控件在 CodeProject 上发表了两篇文章:第 1 部分和第 2 部分。这是一个非常聪明的代码,它通过仅向客户端发出回发之间地图的坐标差异来优化性能。它已被修改为在 Web 应用程序中运行。
对于 Bing 地图,我使用了 Windows Live SDK 的 Virtual Earth 服务器控件。Microsoft 不再提供它,但它仍然有效!此外,还使用了来自 CodeProject 的 IPToCountry 代码来查找匿名访问者的国家/地区。
就代码的其余部分而言,它没有坚实的架构,只是快速而粗糙的实现!轨迹坐标存储在用户的会话中,IMapDisplay
接口用于消除重复的 if(google) else ... 决策。GoogleMapDisplay
和 VEMapDisplay
提供实际的地图显示功能。像 Panoramio
和 ExtJsJsonHelper
这样的类实际上没有使用,它们属于从未实现的功能!
历史
- 2009 年 12 月 20 日:应用程序的初始版本,也可能是最终版本!
我希望您会发现其中的某些部分有用。