(3)构建一个简单的Airport类
现在,我们要构建一个新类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服务并通过简单的编程取得感兴趣的飞机场有关数据。此文件的部分内容如下:
<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。
图4. 添加基于Bing支持的WCF服务引用。
三、读取飞机场数据与消费WCF服务
现在,我们已经配置好了WCF服务并且拥有了机场名单。此后,在使用这些数据时,我们必须找到每个机场的位置。
(1)继续修改XAML代码
所以,现在请切换回MainPage.xaml文件,并在地图控件的下部添加如下的XAML代码:
<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.GeocodeRequest _geocodeRequest;
private List<Airport> Airports;
这些变量将帮助我们消费Bing地理信息服务。其中,变量_geoservice是一个针对Bing服务的引用,变量_geocodeRequest十分重要,请参考后面代码。第三个变量Airports是一个泛型List列表,其中将包含当前应用程序运行时相应的所有飞机场数据列表。
至此,创建好了变量。接下来,我们就可以创建一个方法GetAirports以读取文件Airport.xml的内容,并把其中每一个入口数据转换成一个Airport对象以添加进前面创建的Airports列表中。
下面给出方法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中。