Silverlight学习笔记十七BingMap(七)之检索地理位置(GeocodeService服务)

GeocodeService服务用来检索地理位置

效果如图

一、添加服务引用

GeocodeService服务也是WCF服务,地址是http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc

二、实例

1. public class ChinaTileSource
    {
        /// <summary>
        /// 加载中国地图系统
        /// http://r2.tiles.ditu.live.com/tiles/r{quadkey}.png?g=41中国地图系统
        /// </summary>
        /// <returns>TileSource</returns>
        public TileSource GetChinaTileSource()
        {
            UriBuilder tileSourceUri = new UriBuilder("http://r2.tiles.ditu.live.com/tiles/r{quadkey}.png?g=41");

            MapTileLayer tileLayer = new MapTileLayer();
            LocationRectTileSource tileSource = new LocationRectTileSource(tileSourceUri.Uri.ToString()
               , new LocationRect(new Location(60, 60), new Location(13, 140)), new Range<double>(1, 16));
            return tileSource;
        }
    }

 

2.前台

<UserControl x:Class="SlBindMapDemo.GeocodeServiceDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:map="clr-namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Width="500" Height="400">
        <map:Map CredentialsProvider="AkGGA_JlwP7XGV8JxIPb8oEWxrInlLMGKpCe7QM4QB5cg4UGNCqUyjqVfC0B2-XC" x:Name="myMap"></map:Map>
        <StackPanel VerticalAlignment="Top" HorizontalAlignment="Right" Background="Gray" Opacity="0.78" Orientation="Vertical" Margin="2,23,2,2">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="地名:" Margin="0,5,0,5"></TextBlock>
                <TextBox x:Name="tbName" Width="233"></TextBox>
                <Button x:Name="btnQuery" Content="搜索" Click="btnQuery_Click" Width="80" Height="30"></Button>
            </StackPanel>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="经度:"></TextBlock>
                <TextBox x:Name="tbLongitude" Width="110"></TextBox>
                <TextBlock Text="纬度:"></TextBlock>
                <TextBox x:Name="tbLatitude" Width="110"></TextBox>
                <Button x:Name="btnQueryReverse" Content="反向搜索" Click="btnQueryReverse_Click" Width="60" Height="30"></Button>
            </StackPanel>
        </StackPanel>
    </Grid>

</UserControl>

 

3.后台

 public partial class GeocodeServiceDemo : UserControl
    {
        const string BingMapID = "AkGGA_JlwP7XGV8JxIPb8oEWxrInlLMGKpCe7QM4QB5cg4UGNCqUyjqVfC0B2-XC";
        public GeocodeServiceDemo()
        {
            InitializeComponent();
           
            MapTileLayer tileLayer = new MapTileLayer();
            ChinaTileSource gts = new ChinaTileSource();

            tileLayer.TileSources.Add(gts.GetChinaTileSource());
            myMap.Children.Add(tileLayer);
        }

        /// <summary>
        /// 检索

  ///根据国家或地名检索
        /// GeocodeRequest用来处理正向检索请求
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnQuery_Click(object sender, RoutedEventArgs e)
        {
            GeocodeServiceClient client = new GeocodeServiceClient();
            client.GeocodeCompleted += new EventHandler<GeocodeCompletedEventArgs>(OnGeocodeCompleted);

            //创建请求
            GeocodeRequest request = new GeocodeRequest();
            request.Credentials = new Credentials();

            //BingMap ID
            request.Credentials.ApplicationId = BingMapID;

            //检索条件
            request.Query = this.tbName.Text.Trim();

            //进行检索
            client.GeocodeAsync(request);
        }

        private void OnGeocodeCompleted(object sender, GeocodeCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                //获取结果
                GeocodeResponse response = e.Result;
                double latitude = response.Results[0].Locations[0].Latitude;
                double longitude = response.Results[0].Locations[0].Longitude;

                this.tbLatitude.Text = latitude.ToString();
                this.tbLongitude.Text = longitude.ToString();

                //根据经纬度和级别设置视图,并显示该位置
                myMap.SetView(new Location(latitude, longitude), 4);
            }
        }

        /// <summary>
        /// 反向检索

   ///根据经纬度检索
        /// ReverseGeocodeRequest用来处理反向检索请求
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnQueryReverse_Click(object sender, RoutedEventArgs e)
        {
            GeocodeServiceClient client = new GeocodeServiceClient();
            client.ReverseGeocodeCompleted += new EventHandler<ReverseGeocodeCompletedEventArgs>(OnReverseGeocodeCompleted);

            ReverseGeocodeRequest request = new ReverseGeocodeRequest();
            request.Credentials = new Credentials();
            request.Credentials.ApplicationId = BingMapID;
            request.Location = new Location(int.Parse(this.tbLongitude.Text), int.Parse(this.tbLatitude.Text));
            client.ReverseGeocodeAsync(request);
        }

        private void OnReverseGeocodeCompleted(object sender, ReverseGeocodeCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                if (e.Result.Results.Count > 0)
                {
                    GeocodeResponse response = e.Result;
                    this.tbName.Text = response.Results[0].DisplayName;

                    double latitude = response.Results[0].Locations[0].Latitude;
                    double longitude = response.Results[0].Locations[0].Longitude;
                    //根据经纬度和级别设置视图,并显示该位置,这一点很重要啊。
                    myMap.SetView(new Location(latitude, longitude), 4);
                }
                else
                    MessageBox.Show("没有检索到该地址");
            }
        }
    }

posted @ 2010-08-23 12:02  ForrestWoo  阅读(2128)  评论(5编辑  收藏  举报