技术开发 频道

Silverlight4应用Bing Maps构建程序

  (3)构建一个简单的Airport类

  现在,我们要构建一个新类Airport。这个类中能够提供所有美国飞机场中当前状态数据。这个类的代码如下:

public class Airport
  {
        
public string ID { get; set; }
        
public string Name { get; set; }
        
public string Description { get; set; }
        
public Location Location { get; set; }
  }

   注意其中的Location属性。此属性的类型定义于命名空间Microsoft.Maps.MapControl中。

  (4)加载XML数据—Airports.xml

  本示例中所提供的所有美国飞机场简单信息数据(其中仅提供了代码及飞机场名称)包含在一个XML文件Airports.xml中。尽管如此,我们可以通过Bing提供的WCF服务并通过简单的编程取得感兴趣的飞机场有关数据。此文件的部分内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<Airports>
  
<Airport id="SEA" name="Seattle-Tacoma International Airport, WA" />
  
<Airport id="MIA" name="Miami International Airport, FL" />
  
<Airport id="MCO" name="Orlando International Airport, FL" />
  
<!—……其他省略-->
  
</Airports>

   (5)添加Bing Maps服务引用

  要应用Bing Maps服务,可以右键单击示例工程SL4BingMashup并选择“Add Service References…”。然后,在地址栏中输入如下服务地址URL并点击按钮Go:

  http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc

  当服务最后加载完成时,你会观察到如图4所示的内容。在本示例中,我把服务名更改为geoservices。

1

  图4. 添加基于Bing支持的WCF服务引用。

  三、读取飞机场数据与消费WCF服务

  现在,我们已经配置好了WCF服务并且拥有了机场名单。此后,在使用这些数据时,我们必须找到每个机场的位置。

  (1)继续修改XAML代码

  所以,现在请切换回MainPage.xaml文件,并在地图控件的下部添加如下的XAML代码:

<StackPanel Grid.Column="2" Orientation="Vertical">
      
<Button Content="Install" x:Name="btnInstall" Height="25"/>
      
<ListBox x:Name="lstbAirports" Margin="10,0,0,0">
        
<ListBox.ItemTemplate>
          
<DataTemplate>
            
<StackPanel Orientation="Horizontal">
              
<TextBlock Text="{Binding ID}" />
              
<TextBlock Text=" - " />
              
<TextBlock Text="{Binding Name}" />
            
</StackPanel>
          
</DataTemplate>
        
</ListBox.ItemTemplate>
      
</ListBox>
    
</StackPanel>

   请特别注意其中添加的按钮控件和ListBox控件。这里,我们把Listbox的DataTemplate模板修改了一下,使之显示形如“ID – Name”格式的数据。至此,XAML代码部分全部构建完毕。

  (2)后台代码编程

  接下来,我们打开后台代码文件MainPage.xaml.cs添加一个读取文件Airports.xml内容的方法。然后,我们便可以通过Bing提供的WCF地理信息服务Geoservices检索每一个机场的位置信息。

  首先,需要添加对于两个重要命名空间Microsoft.Maps.MapControl和System.Xml.Linq的引用。

  然后,创建下面两个私有变量:

private geoService.GeocodeServiceClient _geoservice;
private geoService.GeocodeRequest _geocodeRequest;
private List<Airport> Airports;

   这些变量将帮助我们消费Bing地理信息服务。其中,变量_geoservice是一个针对Bing服务的引用,变量_geocodeRequest十分重要,请参考后面代码。第三个变量Airports是一个泛型List列表,其中将包含当前应用程序运行时相应的所有飞机场数据列表。

  至此,创建好了变量。接下来,我们就可以创建一个方法GetAirports以读取文件Airport.xml的内容,并把其中每一个入口数据转换成一个Airport对象以添加进前面创建的Airports列表中。

  下面给出方法GetAirports的完整代码:

public void GetAirports()
  {
        XDocument doc
= XDocument.Load("Airports.xml");
        _geocodeRequest
= new geoService.GeocodeRequest();
        _geocodeRequest.Credentials
= new Credentials();
        _geocodeRequest.Credentials.ApplicationId
= ((ApplicationIdCredentialsProvider)myMAP.CredentialsProvider).ApplicationId;
        foreach (var item in doc.Elements(
"Airports").Elements("Airport").ToList())
    {
          var airport
= new Airport();
          airport.ID
= item.Attributes("id").FirstOrDefault().Value;
          airport.Name
= item.Attributes("name").FirstOrDefault().Value;
          Airports.Add(airport);
          Search(airport.ID);
    }
  }

   归纳来看,上面这个方法实现如下功能:

  •   创建一个类型XDocument的局部变量,以便通过Linq To XML技术读XML文件内容。
  •   创建一个GeocodeRequest类的实例。
  •   创建一个Credentials证书类的实例,它将负责加载我们在本文开头提到的证书。
  •      修改_geocodeRequest.Credentials.ApplicationId属性值,修改以前面XAML代码myMAP控件提供的ApplicationId属性值。
  •    通过一个foreach循环遍历整个airports.xml文件,并为每个机场节点数据,创建一个Airport类的实例,最后将它添加到list类型的变量Airports中。 
0
相关文章