using System; using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Media; using Microsoft.Maps.MapControl; using Microsoft.Maps.MapControl.Core; using Microsoft.Maps.MapControl.Navigation; using Microsoft.Maps.MapControl.Overlays; namespace CustomMap.Lib { /* * 功能描述 * 本类应该有一个强大的图层管理功能 * 至少应该要具有如下的方法: * 1.插入用户控件,参数有:所在图层,位置信息,控件信息 * 2.模式设置:是卫星地图/路径地图 * 3.定位中心点:缩放级别/中心点 * 4.测距:点集 * 5.添加/清理标注信息 * 6.清除指定图层/清除所有图层 * 7.图例的操作 * 8.保障好在加载不同的地图时,一切均能正常 */ /// <summary> /// 地图操作控件 /// </summary> public class MapEx : Microsoft.Maps.MapControl.Map { #region 字段声明 /// <summary> /// 偏移经度 /// </summary> private double dLongWarp = 0; /// <summary> /// 偏移纬度 /// </summary> private double dLatWarp = 0; #endregion #region 属性声明 /// <summary> /// 图层名称集合 /// </summary> private List<MapLayerInfo> listLayer = null; public List<MapLayerInfo> ListLayer { get { return listLayer; } } #endregion #region 构造函数 /// <summary> /// 构造函数 /// </summary> public MapEx() { listLayer = new List<MapLayerInfo>(); #region 事件注册 this.MapForeground.TemplateApplied += delegate(object sender, EventArgs args) { this.MapForeground.NavigationBar.TemplateApplied += new EventHandler(NavigationBar_TemplateApplied); }; this.LoadingError += delegate(object sender, LoadingErrorEventArgs e) { //移除 Unable to contact server 的错误消息 try { (VisualTreeHelper.GetChild(this, 0) as MapLayer).Children.Remove(VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this, 0), 5) as LoadingErrorMessage); } catch { } }; #endregion btnRoad_Click(null, null); } #endregion #region 地图自定义菜单操作 void NavigationBar_TemplateApplied(object sender, EventArgs e) { //清除导航菜单上现有项 NavigationBar navBar = this.MapForeground.NavigationBar; navBar.HorizontalPanel.Children.Clear(); navBar.VerticalPanel.Children.Clear(); //添加自定义导航菜单项 ChangeMapModeButton btnAerial = new ChangeMapModeButton(new AerialMode(true), "卫星地图", "点击导航到卫星地图"); btnAerial.IsChecked = true; navBar.HorizontalPanel.Children.Add(btnAerial); btnAerial.Click += new RoutedEventHandler(btnAerial_Click); ChangeMapModeButton btnRoad = new ChangeMapModeButton(new RoadMode(), "路径地图", "点击导航到路径地图"); btnRoad.IsChecked = false; navBar.HorizontalPanel.Children.Add(btnRoad); btnRoad.Click += new RoutedEventHandler(btnRoad_Click); ChangeMapModeButton btnStreet = new ChangeMapModeButton(new RoadMode(), "街道地图", "点击导航到街道地图"); btnStreet.IsChecked = false; navBar.HorizontalPanel.Children.Add(btnStreet); btnStreet.Click += new RoutedEventHandler(btnStreet_Click); } /// <summary> /// 卫星地图 /// </summary> void btnAerial_Click(object sender, RoutedEventArgs e) { //中文地图---目前Bing因为法律问题暂时不支持中文卫星地图访问 MapTileLayer tileLayer = new MapTileLayer(); GoogleWXSource gts = new GoogleWXSource(); tileLayer.TileSources.Add(gts); this.Children.Add(tileLayer); this.Mode = new AerialMode(); dLatWarp = 0; dLongWarp = 0; } /// <summary> /// 路径地图 /// </summary> void btnRoad_Click(object sender, RoutedEventArgs e) { MapTileLayer tileLayer = new MapTileLayer(); GoogleTileSource gts = new GoogleTileSource(); tileLayer.TileSources.Add(gts); this.Children.Add(tileLayer); this.Mode = new MercatorMode(); dLatWarp = -0.00041397; dLongWarp = 0.00557889; } /// <summary> /// 街道地图 /// </summary> void btnStreet_Click(object sender, RoutedEventArgs e) { MapTileLayer tileLayer = new MapTileLayer(); StreetTileSource sts = new StreetTileSource(); tileLayer.TileSources.Add(sts); this.Children.Add(tileLayer); this.Mode = new MercatorMode(); dLatWarp = -0.0007038; dLongWarp = 0.0054717; } #endregion #region 地图操作方法 /// <summary> /// 地图中心点定位 /// </summary> /// <param name="latitude">纬度</param> /// <param name="longitude">经度</param> /// <param name="zoomLevel">缩放级别</param> public void SetPosition(double latitude, double longitude, double zoomLevel) { latitude += dLatWarp; longitude += dLongWarp; Location location = new Location(latitude, longitude); zoomLevel = zoomLevel == 0 ? this.ZoomLevel : zoomLevel; this.SetView(location, zoomLevel); } /// <summary> /// 添加UI对象 /// </summary> /// <param name="layerName">图层名称</param> /// <param name="latitude">纬度</param> /// <param name="longitude">经度</param> /// <param name="element">UIElement对象</param> public void AddUIElement(string layerName, double latitude, double longitude, UIElement element) { MapLayer MapLayer = this.CreateLayer(layerName); // 获UIElement对象名称 string name = element.GetValue(NameProperty).ToString(); // 判断该UIElement对象在地图上是否存在 // 如果存在则移除 UIElement uc = MapLayer.FindName(name) as UIElement; if (uc != null) MapLayer.Children.Remove(uc); PositionOrigin position = PositionOrigin.Center; latitude += dLatWarp; longitude += dLongWarp; Location location = new Location(latitude, longitude); MapLayer.AddChild(element, location, position); } /// <summary> /// 重载添加UI对象 /// </summary> /// <param name="layerName">图层名称</param> /// <param name="latitude">纬度</param> /// <param name="longitude">经度</param> /// <param name="element">UIElement对象</param> /// <param name="position">偏移定位</param> public void AddUIElement(string layerName, double latitude, double longitude, UIElement element, PositionOrigin position) { MapLayer MapLayer = this.CreateLayer(layerName); // 获UIElement对象名称 string name = element.GetValue(NameProperty).ToString(); // 判断该UIElement对象在地图上是否存在 // 如果存在则移除 UIElement uc = MapLayer.FindName(name) as UIElement; if (uc != null) MapLayer.Children.Remove(uc); latitude += dLatWarp; longitude += dLongWarp; Location location = new Location(latitude, longitude); MapLayer.AddChild(element, location, position); } /// <summary> /// 重载添加UI对象 /// </summary> /// <param name="layerName">图层名称</param> /// <param name="latitude">纬度</param> /// <param name="longitude">经度</param> /// <param name="element">UIElement对象</param> /// <param name="zoomLevel">地图缩放级别</param> public void AddUIElement(string layerName, double latitude, double longitude, UIElement element, double zoomLevel) { MapLayer MapLayer = this.CreateLayer(layerName); // 获UIElement对象名称 string name = element.GetValue(NameProperty).ToString(); // 判断该UIElement对象在地图上是否存在 // 如果存在则移除 UIElement uc = MapLayer.FindName(name) as UIElement; if (uc != null) MapLayer.Children.Remove(uc); PositionOrigin position = PositionOrigin.Center; latitude += dLatWarp; longitude += dLongWarp; Location location = new Location(latitude, longitude); MapLayer.AddChild(element, location, position); this.SetView(location, zoomLevel); } /// <summary> /// 重载添加UI对象 /// </summary> /// <param name="layerName">图层名称</param> /// <param name="latitude">纬度</param> /// <param name="longitude">经度</param> /// <param name="element">UIElement对象</param> /// <param name="zoomLevel">地图缩放级别</param> /// <param name="position">偏移定位</param> public void AddUIElement(string layerName, double latitude, double longitude, UIElement element, double zoomLevel, PositionOrigin position) { MapLayer MapLayer = this.CreateLayer(layerName); // 获UIElement对象名称 string name = element.GetValue(NameProperty).ToString(); // 判断该UIElement对象在地图上是否存在 // 如果存在则移除 UIElement uc = MapLayer.FindName(name) as UIElement; if (uc != null) MapLayer.Children.Remove(uc); latitude += dLatWarp; longitude += dLongWarp; Location location = new Location(latitude, longitude); MapLayer.AddChild(element, location, position); this.SetView(location, zoomLevel); } /// <summary> /// 创建图层 /// </summary> /// <param name="layerName">图层名称</param> /// <returns>返回当前添加的图层</returns> public MapLayer CreateLayer(string layerName) { MapLayerInfo MyLayer = listLayer.FirstOrDefault(n => n.LayerName == layerName); if (MyLayer == null) { MyLayer = new MapLayerInfo() { LayerName = layerName, MapLayer = new MapLayer() }; this.Children.Add(MyLayer.MapLayer); listLayer.Add(MyLayer); } return MyLayer.MapLayer; } /// <summary> /// 清除用户控件 /// </summary> /// <param name="layerName">图层名称</param> /// <param name="name">对象名称</param> public void RemoveUIElement(string layerName, string name) { MapLayerInfo MyLayer = listLayer.FirstOrDefault(n => n.LayerName == layerName); if (MyLayer == null) return; UIElement uc = MyLayer.MapLayer.FindName(name) as UIElement; if (uc == null) return; MyLayer.MapLayer.Children.Remove(uc); } /// <summary> /// 清除指定图层 /// <param name="layerName">图层名称</param> /// </summary> public void RemoveLayer(string layerName) { MapLayerInfo MyLayer = listLayer.FirstOrDefault(n => n.LayerName == layerName); if (MyLayer == null) return; // 清空指定图层里面对象 MyLayer.MapLayer.Children.Clear(); // 清空当前图层 this.Children.Remove(MyLayer.MapLayer); // 从图层集合中移除当前图层 this.listLayer.Remove(MyLayer); } /// <summary> /// 清除地图上所有图层信息 /// </summary> public void RemoveAll() { if (listLayer.Count == 0) return; foreach (MapLayerInfo layer in listLayer) { layer.MapLayer.Children.Clear(); this.Children.Remove(layer.MapLayer); } listLayer.Clear(); } #endregion } #region 图层信息类 /// <summary> /// 图层信息 /// </summary> public class MapLayerInfo { /// <summary> /// 图层名称 /// </summary> public string LayerName { get; set; } /// <summary> /// 图层对象 /// </summary> public MapLayer MapLayer { get; set; } } #endregion }
发表评论
-
Silverlight导出数据
2012-08-31 15:51 684/// <summary> ... -
Silverlight项目不能调试问题(VS2010+Silverlight5.0)
2012-08-09 23:26 1533在Silverlight+WCF项目中经常会遇到S ... -
Silverlight DataGrid使用说明
2011-08-13 18:55 1823Silverlight DataGrid常用事件 ... -
Silverlight模拟ASP.NET Session相应操作(二)
2011-07-01 20:24 1021上一篇写道了SessionManager类,以下是对这个类的使 ... -
Silverlight模拟ASP.NET Session相应操作(一)
2011-07-01 20:08 1318近期忙于Silverlight项目开发,经过多个Sil ...
相关推荐
- 控件提供了基本的地图显示,包括缩放、平移和旋转操作,以及对地图样式、图层和图标的自定义。 - 数据绑定是Bing Maps的一个重要特性,它使得动态更新地图数据变得简单,如根据实时数据展示位置标记或路径。 3....
在iOS项目中集成Bing Maps SDK,你需要按照以下步骤操作: 1. **添加框架**:在Xcode项目中,将`libBingMaps.a`库文件添加到"Link Binary With Libraries"部分,确保项目能正确编译和链接。 2. **导入头文件**:在...
在Windows 8操作系统中开发Bing地图应用是一个有趣且实用的编程任务,它结合了Microsoft的桌面环境与Bing地图服务的强大功能。本教程将深入探讨如何在Windows 8环境中利用C#语言创建一个交互式的Bing地图应用程序。 ...
<maps:BingMap x:Name="bingMap" CredentialsProvider="YOUR_BING_MAPS_KEY" Center="47.6097,-122.3331" ZoomLevel="12" MapStyle="Road"/> ``` 其中,`CredentialsProvider`属性需要填写你的Bing Maps API密钥,`...
**Bing Maps AJAX Control 7.0** 提供了详细的 API 文档,涵盖了所有类、方法、属性等信息。 - **Data Structures**:数据结构,如 `Location`、`LocationRect` 等。 - **Mapping**:映射相关的类和方法。 - **...
项目中的"library.swf"文件是Flex编译后的SWF库文件,其中包含了与Google Map API交互的自定义组件或类。SWF是一种二进制格式,用于在Web上展示互动内容,通常由ActionScript(一种面向对象的脚本语言)驱动。在这个...
3. **MapService.cs**:这可能是与地图服务交互的类,比如从在线地图服务提供商(如Google Maps或Bing Maps)获取地图数据。它可能包含了请求地图数据、解析响应以及错误处理的逻辑。 4. **WorkerSingleton.cs**:...
myMap.MapProvider = GMapProviders.BingMap; ``` Bing Maps同样需要API密钥,记得在使用前设置。 通过以上的步骤,你已经掌握了在WPF应用中使用GMap.NET开发地图功能的基本技巧,包括添加自定义标注和集成Google ...
地图提供者(MapProvider)决定了地图数据的来源,如GoogleMap、BingMap、OpenStreetMap等。设置不同的提供者可以获取不同风格和来源的地图数据。 GMAP控件支持多种地图操作,包括缩放、平移、旋转等。这些可以通过...
Leaflet就是这样的一个框架,它支持多种地图源,包括流行的OpenStreetMap、Google Maps、Bing Maps等。 Leaflet API中文版的文档涵盖了所有关键概念和方法,帮助开发者快速掌握其核心功能。以下是一些主要的Leaflet...
这可以通过在`Map`组件中设置`provider`属性来完成,它可以是在线地图服务提供商(如Google Maps、Bing Maps)的API,也可以是自托管的地图服务。 2. **图层管理**:在电子地图上,我们可以叠加多个图层,例如基础...
你需要熟悉这些对象以及它们的方法和属性,以便在VBA代码中操作Excel元素。 4. **图表对象与类型**:在Excel中,地图通常作为图表显示。VBA可以创建、修改和控制图表。你需要知道如何使用Chart对象,以及如何设置...
Windows Phone 8操作系统集成了Bing Maps服务,开发者可以使用其SDK来创建交互式的地图应用。Bing Maps SDK提供了丰富的功能,包括地图显示、地理位置获取、路线规划、兴趣点搜索等。在这个示例中,开发者可以学习...
这个例子中的" BingMap "可能是源码中的一个关键文件,可能包含了地图与Bing Maps服务的接口或核心功能实现。 总之,这套纯JavaScript实现的微软VEMap源码程序是一个宝贵的教育资源,它可以帮助开发者提升地图开发...
7. **地图服务**:可能还会涉及到如何使用Web服务获取实时地图数据,如通过OpenStreetMap、Bing Maps等API获取卫星或地形图层。 通过研究和学习这个Demo,开发者不仅可以掌握SharpMap的基本用法,还能了解到如何在...
2. **地图初始化**:在Windows Forms应用中,首先需要引用GMap.NET的库,然后创建一个`GMapControl`实例,并设置其`MapProvider`属性为所需的地图服务提供商,如`GMap.NET.MapProviders.GMapProviders.BingMap`...
3. 加载瓦片地图服务:使用`ol.source.OSM`(OpenStreetMap)或其他地图服务提供商(如Google Maps或Bing Maps)加载瓦片。这里以OpenStreetMap为例: ```javascript var tileLayer = new ol.layer.Tile({ source...
GMap.NET是一款强大的开源库,主要用于C#和.NET平台,它允许开发者在应用程序中集成Google Maps、OpenStreetMap、Bing Maps等在线地图服务。这个压缩包“GMAP最新源代码”显然包含了GMap.NET的最新源代码,使得...
"bing.ico"和"desktop.jpg"代表图标和图片资源,QT提供了QIcon和QImage类来处理这类资源。QIcon可以用于设置窗口的图标,而QImage则用于显示和编辑图像。开发者可以利用这些类实现自定义的界面元素。 "bbb.png"和...