最近需要做一个类似于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即可。用这种方法加载其它地图也可以。