Windows Phone 7 的简单 GPS 定位器
一个简单的 GPS 系统,

引言
现在很多人都需要手机上的 GPS 系统,尤其是游客,所以 GPS 系统会越来越流行。但是,很多开发者不知道如何开始开发 GPS 系统。
这是一个 Windows Phone 7(微软的新技术)上的 GPS 系统示例。它展示了如何使用手机内置的定位器获取您的位置,然后在 Bing 地图(类似于 Google 地图,但是微软的版本)上显示这个位置。
背景
要使用 Bing 地图,您必须获取一个 Bing Key 作为开发者。 这是一个应用程序的唯一密钥,以便它能够登录到 Bing 地图。
当您注册 Windows Live 帐户时,可以从 Bing 地图门户获取此密钥。
获得密钥后,您可以将其附加到您的应用程序并获取您希望的地图。 之后,我们将在应用程序中使用一项重要服务 - Terra 服务,它可以根据纬度和经度以文本形式获取位置。 您可以通过右键单击项目名称并选择“添加服务引用”来添加服务。 对于 Terra 服务,您可以使用此 URL - http://msrmaps.com/TerraService2.asmx,然后通过在导入时命名的名称将其添加到 usings 中。
这是官方网站:http://msrmaps.com/。
Terra 服务包括一些重要的 GPS 方法,例如
- ConvertLonLatPtToNearestPlace (将经纬度坐标转换为最近地点)
- ConvertLonLatPtToUtmPt (将经纬度坐标转换为 UTM 坐标)
- ConvertPlaceToLonLatPt (将地点转换为经纬度坐标)
- ConvertUtmPtToLonLatPt (将 UTM 坐标转换为经纬度坐标)
- CountPlacesInRect (计算矩形区域内的地点数量)
- GetAreaFromPt (从点获取区域)
- GetAreaFromRect (从矩形获取区域)
- GetAreaFromTileId (从瓦片 ID 获取区域)
- GetLatLonMetrics (获取经纬度指标)
- GetPlaceFacts (获取地点信息)
- GetPlaceList (获取地点列表)
- GetPlaceListInRect (获取矩形区域内的地点列表)
- GetTheme (获取主题)
- GetTile (获取瓦片)
- GetTileMetaFromLonLatPt (从经纬度坐标获取瓦片元数据)
- GetTileMetaFromTileId (从瓦片 ID 获取瓦片元数据)
我们感兴趣的是 'ConvertLonLatPtToNearestPlace
' 方法,它从坐标获取地点名称。
还有另一种方法(我们不会使用它),它执行相反的操作,即 'ConvertPlaceToLonLatPt
'。
Using the Code
首先,让我们研究一下地图部分的 XAML 代码。
<my:Map Height="457" Name="mapBing" Width="450" CredentialsProvider="Your Key"/>
然后你的地图就可以工作了,你会注意到即使在你部署和运行之前,它也会在设计视图中开始工作。 现在,开始编写代码
Terra.TerraServiceSoapClient client = new Terra.TerraServiceSoapClient();
这部分是从我们下载的服务中创建一个对象。
public MainPage()
{
InitializeComponent();
client.ConvertLonLatPtToNearestPlaceCompleted += |
new EventHandler<ConvertLonLatPtToNearestPlaceCompletedEventArgs>(
client_ConvertLonLatPtToNearestPlaceCompleted);
mapBing.ZoomBarVisibility = System.Windows.Visibility.Visible;
}
在构造函数中,我们为 ConvertLonLatPtToNearestPlaceCompleted
事件创建了一个事件处理程序,当服务获得我们坐标的最近位置时会引发此事件,然后使地图中的缩放按钮可见。
void client_ConvertLonLatPtToNearestPlaceCompleted(object sender,
ConvertLonLatPtToNearestPlaceCompletedEventArgs e)
{
txtResult.Text = e.Result;
mapBing.Center = new GeoCoordinate(latitude, longitude);
mapBing.ZoomLevel = 10;
}
这是事件处理程序。 它将结果打印到文本框,并将地图居中于新的坐标,然后我们将地图缩放到该点 10 次。
现在,让我们看一下按钮单击事件
txtResult.Text = "Loading....";
GeoCoordinateWatcher myWatcher = new GeoCoordinateWatcher();
var myPosition = myWatcher.Position;
latitude = 30.01;
longitude = 31.14;
if (!myPosition.Location.IsUnknown)
{
latitude = myPosition.Location.Latitude;
longitude = myPosition.Location.Longitude;
}
client.ConvertLonLatPtToNearestPlaceAsync(new Terra.LonLatPt {
Lat = latitude, Lon = longitude });
GeoCoordinateWatcher
类是手机定位器中的一个内置类,我们使用它通过 Position
属性获取当前坐标。
我添加了一些默认坐标,因为在 Windows Phone 模拟器中,没有定位器单元,所以它无法正确获取坐标。 我添加这些默认值仅用于测试。 最后,我们使用 Terra 服务对象来搜索此位置的名称。
关注点
在我的工作中,我添加了一些按钮来更改地图模式,例如航空、道路、街道、卫星等等,但我发现这是不必要的,所以我将其删除以在屏幕上腾出空间。
历史
这是第一个版本,我很快就会推出更高级的功能。