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

Windows Phone 8 中的 ReverseGeocodeQuery 类。

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.70/5 (7投票s)

2014 年 8 月 31 日

CPOL

6分钟阅读

viewsIcon

16800

downloadIcon

165

正如上一篇文章所解释的,地理定位是移动领域及其他领域中最常用的功能之一,通过它我们可以检索我们所在位置的地点和信息,并被应用程序用于获取其他信息,例如餐厅。

引言。

正如上一篇文章所解释的,地理定位是移动领域及其他领域中最常用的功能之一,通过它我们可以检索我们所在位置的地点和信息,并被应用程序用于获取其他信息,例如餐厅、酒店、景点和许多其他场景。在这第二篇文章中,我们将继续我们的地理定位服务之旅,我们将看到如何将经纬度坐标转换为地址,从而在应用程序中显示我们所在位置的所有信息,并将在未来的文章中将其用于诺基亚地图控件,以及如何检测天气状况的示例。

 

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 类,它具有相同的方法,不同之处在于它将地址数据转换为经纬度坐标。

© . All rights reserved.