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 657/// <summary> ... -
Silverlight项目不能调试问题(VS2010+Silverlight5.0)
2012-08-09 23:26 1519在Silverlight+WCF项目中经常会遇到S ... -
Silverlight DataGrid使用说明
2011-08-13 18:55 1801Silverlight DataGrid常用事件 ... -
Silverlight模拟ASP.NET Session相应操作(二)
2011-07-01 20:24 994上一篇写道了SessionManager类,以下是对这个类的使 ... -
Silverlight模拟ASP.NET Session相应操作(一)
2011-07-01 20:08 1294近期忙于Silverlight项目开发,经过多个Sil ...
相关推荐
自定义Excel操作选项.zip源码EXCEL VBA宏编程Excel VBA实用技巧范例下载自定义Excel操作选项.zip源码EXCEL VBA宏编程Excel VBA实用技巧范例下载自定义Excel操作选项.zip源码EXCEL VBA宏编程Excel VBA实用技巧范例...
Qwt自定义平移操作类QwtPlotPanner,由于项目要求坐标轴平移时不能将曲线移出边界,所以需要自定义QwtPlotPanner。
C#-自定义日志操作类
使用java语言写的自定义集合类,非常好用的集合类,可以实现集合的一些操作。
由于RF框架中的扩展库ExcelLibrary只能操作xls低版本的excel,对于高版本的xlsx的excel并不支持,于是自己用python写了适用于RF框架的ExcelXLSXLibrary类库,可以完美操作xlsx,使用该类库注意事项: 1、安装...
常用数据库操作类和自定义类,三层框架结构
这是学习ContentProvider的第二个练习。 里面自定义ContentProvider类来与SQLite交互。 大致类容就是:通过ContentProvider,创建自己的.db,操作自己的.db. 代码里有详细的解释
Excel-VBA实用技巧范例-自定义Excel操作选项.zip
Excel数据整理与分析如何自定义操作界面共11页.pdf.zip
通过C语言实现的C++中自定义的模拟String类代码,实现基本工程操作
标题说的很清楚,利用asm-3.1.jar,cglib-2.2.jar,commons-io-1.3.2.jar,poi-3.9-20121203.jar 开发的一个工具包。...其中用到字节码编码,反射,excel操作。 主要功能1、自定义列导出excel Main()类为测试用例
包含两个程序,1)模板常用操作,和一个用模板模拟的栈。2)map map中用到的增加 删除 查找 操作,和两种排序方式,当关键 字是结构体时的排序,一种是再结构体中重载符号,另外一种是一个类。
包装了Map对象,使其更加容易操作
本人自己用的excel2010自定义工具。使用时导入即可。有时候我们在预览或打印或另存等快捷操作时,不容易找到。我把常用的添加了进去。,需要的可以下载。
由于项目要求坐标轴缩小到整个曲线都显示之后不能再缩小,所以需要自定义QwtPlotMagnifier。
易语言利用自定义数据类型和数组. 制作键对值操作类/内存配置。@kn剑齿虎。
VBA自定义函数. 6个简单而有用的VBA自定义函数.
在Qt下利用自定义opengl类,同时重载paintGl函数进行绘图操作
VC操作EXCEL文章VC操作EXCEL文章VC操作EXCEL文章
.NET操作EXcel类