Windows Phone 8 中的 ReverseGeocodeQuery 类。






4.70/5 (7投票s)
正如上一篇文章所解释的,地理定位是移动领域及其他领域中最常用的功能之一,通过它我们可以检索我们所在位置的地点和信息,并被应用程序用于获取其他信息,例如餐厅。
引言。
正如上一篇文章所解释的,地理定位是移动领域及其他领域中最常用的功能之一,通过它我们可以检索我们所在位置的地点和信息,并被应用程序用于获取其他信息,例如餐厅、酒店、景点和许多其他场景。在这第二篇文章中,我们将继续我们的地理定位服务之旅,我们将看到如何将经纬度坐标转换为地址,从而在应用程序中显示我们所在位置的所有信息,并将在未来的文章中将其用于诺基亚地图控件,以及如何检测天气状况的示例。
ReverseGeocodeQuery 类。
除了我们可以在命名空间 Windows.Devices.Geolocation
中找到的 Geolocator 类之外,Windows Runtime 还为我们开发者提供了另一个重要的类:ReverseGeocodeQuery
类。如果你仔细想想,当我们开发一个利用地图的应用程序,或者想为用户提供更多关于地点的信息,例如国家名称、地址等等时,ReverseGeocodeQuery
类就是我们需要的。我们将分析主要方法、属性和唯一可用的事件。
属性
• GeoCoordinate
•
IsBusy
最常用的方法
• QueryAsync ()
唯一的事件
• QueryCompleted
属性。
GeoCoordinate,我们在这里输入经纬度,以确保它们随后被 ReverseGeocodeQuery
类转换为地址,所有这些都通过一个 GeoCoordinate
类型的对象进行,稍后我们将在示例中看到如何操作。
IsBusy,只读属性,当我们想知道查询是否正在准备恢复数据时很有用。
方法。
方法 QueryAsync()
在调用时,使用经纬度坐标执行查询,请注意,尽管此方法以 Async 结尾,但它是异步执行的,但由于它是 void 类型,因此不基于 Async/Await
模式。例如,当 void 方法执行时,它不返回任何结果,就像我们调用 Int 类型的方法时一样。
事件。
唯一的事件 QueryCompleted
在查询完成时执行,并将所有关于地址的数据返回到 IList
类型的对象中。这正是查询找到的所有结果,封装在一个集合中,因为它们也可以有多个。要找到所需的信息,我们需要参考 Result 属性。除此之外,我们还有
• Cancelled:布尔类型,用于了解异步操作何时以及是否已被取消。
• Error:也是布尔类型,如果查询执行期间需要错误时很有用,事实上,从这个属性中,您将获得一个 AsyncCompletedEventArgs
类型的异常对象,其中包含发生的错误。
• Result:我们之前描述过,换句话说,查询结果是一个 IList
类型的集合。
• UserState:对象类型的属性,它返回正在运行的异步任务的唯一标识符。
将经纬度坐标转换为地址。
到目前为止,您已经对 ReverseGeocodeQuery
类有了快速概览,换句话说,对最常用的方法、属性以及唯一的事件 QueryCompleted
进行了简要分析。有关该主题的更多详细信息,请参阅 MSDN Library 的官方文档链接。
继续我们上一篇文章中创建的示例,对于尚未下载的用户,下载链接可在此处获取。上一篇文章的测试应用程序结构如下。
我们有四个 TextBlock 控件,用于显示经纬度,通过点击名为 Find data 的 Button 控件。用 Visual Studio 2013 打开项目;我记得这个示例是用专业版创建的。在解决方案管理器中,双击 MainPage.xaml 文件。在 GUI 中,删除名为 ContentPanel 的主网格中的所有控件,并插入以下代码。
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<StackPanel>
<TextBlock Text="City "/>
<TextBlock Text="Country "/>
<TextBlock Text="CountryCode "/>
<TextBlock Text="HouseNumber "/>
<TextBlock Text="PostalCode "/>
<TextBlock Text="State "/>
<TextBlock Text="Street "/>
</StackPanel>
<StackPanel>
<TextBlock x:Name="tbkCity"/>
<TextBlock x:Name="tbkCountry"/>
<TextBlock x:Name="tbkCountryCode"/>
<TextBlock x:Name="tbkHouseNumber"/>
<TextBlock x:Name="tbkPostalCode"/>
<TextBlock x:Name="tbkState"/>
<TextBlock x:Name="tbkStreet"/>
</StackPanel>
</StackPanel>
<Button Grid.Row="1" x:Name="btnFindCoordinate" Content="Find data" Tap="btnFindCoordinate_Tap"/>
</Grid>
添加了其他 TextBlock 控件,用于查看一些最重要的属性,例如城市、国家/地区、门牌号和我们稍后将看到的其他数据。输入 xaml 代码后,我们的 GUI 将呈现此方面。
从上图中,您可以看到我们比以前添加了 TextBlock 控件,可以显示我们所在位置的所有必要数据。现在转到代码隐藏部分,首先要做的是添加下面给出的命名空间,如果我们要使用 ReverseGeocodeQuery
类,这是必要的。
using Microsoft.Phone.Maps.Services;
我们修改按钮的点击事件代码,调用名为 GetAddress()
的异步方法。
private void btnFindCoordinate_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
GetAddress();
}
现在是您需要搜索我们所在位置信息的代码。
public async void GetAddress()
{
var latitude = 0d;
var longitude = 0d;
var locator = new Geolocator();
var reversegeocodequery = new ReverseGeocodeQuery();
if (!locator.LocationStatus.Equals(PositionStatus.Disabled))
{
var position = await locator.GetGeopositionAsync();
latitude = position.Coordinate.Latitude;
longitude = position.Coordinate.Longitude;
reversegeocodequery.GeoCoordinate = new GeoCoordinate(latitude, longitude);
reversegeocodequery.QueryAsync();
reversegeocodequery.QueryCompleted += (sender, args) =>
{
if (!args.Result.Equals(null))
{
var result = args.Result.FirstOrDefault();
tbkCity.Text = result.Information.Address.City;
tbkCountry.Text = result.Information.Address.Country;
tbkCountryCode.Text = result.Information.Address.CountryCode;
tbkHouseNumber.Text = result.Information.Address.HouseNumber;
tbkPostalCode.Text = result.Information.Address.PostalCode;
tbkState.Text = result.Information.Address.State;
tbkStreet.Text = result.Information.Address.Street;
}
};
}
else
{
MessageBox.Show("Service Geolocation not enabled!", AppResources.ApplicationTitle, MessageBoxButton.OK);
return;
}
}
我们将分析内容。关于 Geolocator
类,与上一篇文章的示例相比,没有任何变化,一切保持不变。新闻部分是这行代码,我们在这里声明了一个新的 ReverseGeocodeQuery
类型对象。
var reversegeocodequery = new ReverseGeocodeQuery();
代码的剩余部分。
reversegeocodequery.GeoCoordinate = new GeoCoordinate(latitude, longitude);
reversegeocodequery.QueryAsync();
reversegeocodequery.QueryCompleted += (sender, args) =>
{
if (!args.Result.Equals(null))
{
var result = args.Result.FirstOrDefault();
tbkCity.Text = result.Information.Address.City;
tbkCountry.Text = result.Information.Address.Country;
tbkCountryCode.Text = result.Information.Address.CountryCode;
tbkHouseNumber.Text = result.Information.Address.HouseNumber;
tbkPostalCode.Text = result.Information.Address.PostalCode;
tbkState.Text = result.Information.Address.State;
tbkStreet.Text = result.Information.Address.Street;
}
};
增强地理坐标属性,将 Geolocator
类记录的经纬度作为参数传递,然后调用 QueryAsync()
方法。最后,我们支持 QueryCompleted
事件,该事件在查询执行并完成时执行,将所有数据恢复到 IList
类型的集合中。数据存储在 Address 属性中,我们有 City、Country、CountryCode、HouseNumber、PostalCode 和 State Street 属性,或者说最常用的那些,尽管实际上它们不是唯一的,但我们还有其他属性可以通过智能感知使用,Visual Studio 2013 将显示所有可用值。现在我们有了代码和 GUI 代码隐藏,是时候运行应用程序了,但在开始调试之前,您需要激活所需的权限。在解决方案管理器中,展开 Properties 文件夹,双击 WMAppManifest.xaml 文件,转到功能部分并激活 ID_CAP_MAP
权限,如图所示。
完成此活动后,我们终于可以调试了。按 F5 键,启动应用程序,它最初将如图所示。
点击“查找”按钮,一切顺利;我们将根据 Geolocator 类记录的经纬度获取所有地址数据。
结论。
在这第二篇文章中,我们看到了如何使用我们所在位置的其他数据获取经纬度,这一切都归功于 ReverseGeocedeQuery
类。在下一篇文章中,我们将了解 GeocodeQuery
类,它具有相同的方法,不同之处在于它将地址数据转换为经纬度坐标。