`

Bing Map 自定义操作类

 
阅读更多
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
}

 

分享到:
评论

相关推荐

    使用 Bing Maps

    - 控件提供了基本的地图显示,包括缩放、平移和旋转操作,以及对地图样式、图层和图标的自定义。 - 数据绑定是Bing Maps的一个重要特性,它使得动态更新地图数据变得简单,如根据实时数据展示位置标记或路径。 3....

    BingMapsIOS

    在iOS项目中集成Bing Maps SDK,你需要按照以下步骤操作: 1. **添加框架**:在Xcode项目中,将`libBingMaps.a`库文件添加到"Link Binary With Libraries"部分,确保项目能正确编译和链接。 2. **导入头文件**:在...

    Windows 8下开发Bing地图的程序例子

    在Windows 8操作系统中开发Bing地图应用是一个有趣且实用的编程任务,它结合了Microsoft的桌面环境与Bing地图服务的强大功能。本教程将深入探讨如何在Windows 8环境中利用C#语言创建一个交互式的Bing地图应用程序。 ...

    BingmapControl使用

    &lt;maps:BingMap x:Name="bingMap" CredentialsProvider="YOUR_BING_MAPS_KEY" Center="47.6097,-122.3331" ZoomLevel="12" MapStyle="Road"/&gt; ``` 其中,`CredentialsProvider`属性需要填写你的Bing Maps API密钥,`...

    bing maps control

    **Bing Maps AJAX Control 7.0** 提供了详细的 API 文档,涵盖了所有类、方法、属性等信息。 - **Data Structures**:数据结构,如 `Location`、`LocationRect` 等。 - **Mapping**:映射相关的类和方法。 - **...

    googleMap-Flex

    项目中的"library.swf"文件是Flex编译后的SWF库文件,其中包含了与Google Map API交互的自定义组件或类。SWF是一种二进制格式,用于在Web上展示互动内容,通常由ActionScript(一种面向对象的脚本语言)驱动。在这个...

    silverlight map

    3. **MapService.cs**:这可能是与地图服务交互的类,比如从在线地图服务提供商(如Google Maps或Bing Maps)获取地图数据。它可能包含了请求地图数据、解析响应以及错误处理的逻辑。 4. **WorkerSingleton.cs**:...

    wpf (C#) 的关于Gmap.net地图的开发

    myMap.MapProvider = GMapProviders.BingMap; ``` Bing Maps同样需要API密钥,记得在使用前设置。 通过以上的步骤,你已经掌握了在WPF应用中使用GMap.NET开发地图功能的基本技巧,包括添加自定义标注和集成Google ...

    GMAP地图控件示例

    地图提供者(MapProvider)决定了地图数据的来源,如GoogleMap、BingMap、OpenStreetMap等。设置不同的提供者可以获取不同风格和来源的地图数据。 GMAP控件支持多种地图操作,包括缩放、平移、旋转等。这些可以通过...

    leaflet地图框架常用的中文API.rar,

    Leaflet就是这样的一个框架,它支持多种地图源,包括流行的OpenStreetMap、Google Maps、Bing Maps等。 Leaflet API中文版的文档涵盖了所有关键概念和方法,帮助开发者快速掌握其核心功能。以下是一些主要的Leaflet...

    flex 电子地图 实例

    这可以通过在`Map`组件中设置`provider`属性来完成,它可以是在线地图服务提供商(如Google Maps、Bing Maps)的API,也可以是自托管的地图服务。 2. **图层管理**:在电子地图上,我们可以叠加多个图层,例如基础...

    EXCEL中绘制地图-VBA源码.zip

    你需要熟悉这些对象以及它们的方法和属性,以便在VBA代码中操作Excel元素。 4. **图表对象与类型**:在Excel中,地图通常作为图表显示。VBA可以创建、修改和控制图表。你需要知道如何使用Chart对象,以及如何设置...

    WP8 地图示例

    Windows Phone 8操作系统集成了Bing Maps服务,开发者可以使用其SDK来创建交互式的地图应用。Bing Maps SDK提供了丰富的功能,包括地图显示、地理位置获取、路线规划、兴趣点搜索等。在这个示例中,开发者可以学习...

    一套基于纯js实现微软的VEMap源码程序例子

    这个例子中的" BingMap "可能是源码中的一个关键文件,可能包含了地图与Bing Maps服务的接口或核心功能实现。 总之,这套纯JavaScript实现的微软VEMap源码程序是一个宝贵的教育资源,它可以帮助开发者提升地图开发...

    sharpmap中的有关WinForm的Demo源码

    7. **地图服务**:可能还会涉及到如何使用Web服务获取实时地图数据,如通过OpenStreetMap、Bing Maps等API获取卫星或地形图层。 通过研究和学习这个Demo,开发者不仅可以掌握SharpMap的基本用法,还能了解到如何在...

    基于GMap.NET的在线地图示例

    2. **地图初始化**:在Windows Forms应用中,首先需要引用GMap.NET的库,然后创建一个`GMapControl`实例,并设置其`MapProvider`属性为所需的地图服务提供商,如`GMap.NET.MapProviders.GMapProviders.BingMap`...

    openlayers加载瓦片地图并手动标记坐标点

    3. 加载瓦片地图服务:使用`ol.source.OSM`(OpenStreetMap)或其他地图服务提供商(如Google Maps或Bing Maps)加载瓦片。这里以OpenStreetMap为例: ```javascript var tileLayer = new ol.layer.Tile({ source...

    GMAP最新源代码

    GMap.NET是一款强大的开源库,主要用于C#和.NET平台,它允许开发者在应用程序中集成Google Maps、OpenStreetMap、Bing Maps等在线地图服务。这个压缩包“GMAP最新源代码”显然包含了GMap.NET的最新源代码,使得...

    QT开发实例

    "bing.ico"和"desktop.jpg"代表图标和图片资源,QT提供了QIcon和QImage类来处理这类资源。QIcon可以用于设置窗口的图标,而QImage则用于显示和编辑图像。开发者可以利用这些类实现自定义的界面元素。 "bbb.png"和...

Global site tag (gtag.js) - Google Analytics