最近需要做一个类似于GIS的功能模块。GOOGLE了很久,还是觉得Bing地图来得实在。
  Bing地图跟GOOGLE地图都需要注册KEY,但都是免费的而且非常简单。
  装好BingMapsSilverlightControlv1控件做了实验后,发现了需要解决以下一些问题:
  1.默认是英语显示提示,需要改成中文显示
          MAP控件有Language属性,但后面没有提示,不知道怎么用。在Bing中国网站里用的是ajax版的,不会是silverligh版目前没有中文显示的?
          默认的地图没有,但可以自已构建一个图层来加载中国地图,但中国地图是没有卫星地图的,在切换模式的时候,数据的处理有点繁琐。
1 UriBuilder tileSourceUri = new UriBuilder("http://r2.tiles.ditu.live.com/tiles/r{quadkey}.png?g=41");
2 //初始化LocationRectTileSource对象,设定显示范围及放大级别
3 LocationRectTileSource tileSource = new LocationRectTileSource(tileSourceUri.Uri.ToString(), new LocationRect(new Location(60, 60), new Location(13, 140)), new Range<double>(6, 16));
4 //设置中国地图图层对象属性
5 layChina.TileSources.Add(tileSource);
6 layChina.Opacity = 1.0;
  2.地图控件的左下角有一个bing图标,右下角有版权信息要去掉
          去掉版权信息使用属性 CopyrightVisibility="Collapsed",去掉LOGO图标用使用  LogoVisibility="Collapsed"即可。这点微软做的还是很厚道的。
  3.地图需要自定义MapMode实现地图访问限制
          通过继承MapMode的基类来实现。
  4.自定义控制地图
    4.1 动态设置地图加载模式
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Horizontal">
            <Button Name="btn_aerial" Click="btn_aerial_Click">
                <TextBlock>卫星地图</TextBlock>
            </Button>
            <Button Name="btn_flow" Click="btn_flow_Click">
                <TextBlock>平面地图</TextBlock>
            </Button>
        </StackPanel>
代码
private void btn_aerial_Click(object sender, RoutedEventArgs e)
{
this.bingmap.Mode = new AerialMode(true);
}

private void btn_flow_Click(object sender, RoutedEventArgs e)
{
this.bingmap.Mode = new RoadMode();
}
           
        4.2 动态设置变焦程度
           通过设置 ZoomLevel属性实现。 
        4.3 动态定位
          
1 private void Dynamic_Click( object sender, RoutedEventArgs e)
2 {
3 double latitude = 0 ;
4 double longitude = 0 ;
5
6 double .TryParse(tbLatitude.Text, out latitude);
7 double .TryParse(tbLongitude.Text, out longitude);
8 this .map.SetView( new Location(latitude, longitude), 5 );
9 }
  5.通过图钉显示需要的数据
        
1 Pushpin pushpin = new Pushpin();
2 //设置图钉对象的定位坐标
3   pushpin.Location = map.ViewportPointToLocation(e.ViewportPoint);
4 //添加图钉到地图上
5 map.Children.Add(pushpin);
6

  6.目前好像只有三种显示模式,卫星模式很好,但路径模式里面除建筑物什么的都没有

          同样,跟中文显示一样,只能通过加载中国地图才能有具体的信息,默认的只有路径

  7.加载GOOGLE卫星地图

          只需要派生一个TileSource类,重写其中的GetUri()方法,使用GOOGLE的路径算法

1 public class GoogleTileSource : TileSource
2 {
3 public GoogleTileSource()
4 : base("http://khm{0}.google.com/kh/v=47&x={1}&y={2}&z={3}")
5 { }
6
7 public override Uri GetUri(int x, int y, int zoomLevel)
8 {
9 return new Uri(string.Format(this.UriFormat, x % 4, x, y, zoomLevel));
10 }
11 }
 然后再构建一个MapTileLayer,将tileLayer.TileSources.Add(new GoogleTileSource());将titlesources添加进MapTileLayer即可。用这种方法加载其它地图也可以。
 
posted on 2010-12-19 17:00  丟弃记忆  阅读(811)  评论(1编辑  收藏  举报