当前位置: 首页 > news >正文

BMSL:Map Mode解析

       和传统GIS客户端架构有所不同,BMSLMapMode的方式来控制Map的一些特征,比如更换地图瓦片数据,限定缩放级别,固定平移范围;甚至是控制鼠标键盘事件导航地图的方式,以及地理坐标与像素坐标的映射等。

         Map有属性曰Mode,类型为MapModeMapMode有子类FlatMapModeFlatMapMode有子类MercatorModeMercatorMode有两个子类RoadModeAerialMode。(关系简单,不再图示)

         MercatorMode设置了Web Mercator投影的相关投影,RoadModeAerialMode分别定了Bing Maps的数据类型,以及导航控件等。比如把MapMode设置为空的MercatorMode,即可清除Bing Maps数据,替换其中的TileSource,即可更换底图数据。

         若要限制显示范围,则要定制自己的MapMode,比如从RoadMode继承,覆盖GetZoomRange限制缩放级别,覆盖ConstrainView限制平移范围。


        下文的示例,大致限定在中国经纬度范围内,缩放级别限定在310之间,并把底图数据改变为Google卫星地图以及它的地图注记数据(即那些汉字标绘),如何自定义TileSource请参考《在BMSL中使用Google 地图》。

    public class ChinaMode : RoadMode
    {
        private Range<double> validLatitudeRange = new Range<double>(3.92, 53.51);
        private Range<double> validLongitudeRange = new Range<double>(73.60, 135.01);

        public ChinaMode()
            : base()
        {
            var tileLayer = (MapTileLayer)this.Content;
            tileLayer.TileSources.Clear();
            tileLayer.TileSources.Add(new GoogleSatelliteTileSource());
            tileLayer.TileSources.Add(new GoogleLabelTileSource());
        }

        protected override Range<double> GetZoomRange(Location center)
        {
            return new Range<double>(3, 10);
        }

        public override bool ConstrainView(Location center, ref double zoomLevel, ref double heading, ref double pitch)
        {
            bool isChanged = base.ConstrainView(center, ref zoomLevel, ref heading, ref pitch);
            double newLatitude = center.Latitude;
            double newLongitude = center.Longitude;
            if (center.Longitude > validLongitudeRange.To)
            {
                newLongitude = validLongitudeRange.To;
            }
            else if (center.Longitude < validLongitudeRange.From)
            {
                newLongitude = validLongitudeRange.From;
            }

            if (center.Latitude > validLatitudeRange.To)
            {
                newLatitude = validLatitudeRange.To;
            }
            else if (center.Latitude < validLatitudeRange.From)
            {
                newLatitude = validLatitudeRange.From;
            }

            if (newLatitude != center.Latitude || newLongitude != center.Longitude)
            {
                center.Latitude = newLatitude;
                center.Longitude = newLongitude;
                isChanged = true;
            }

            Range<double> range = GetZoomRange(center);
            if (zoomLevel > range.To)
            {
                zoomLevel = range.To;
                isChanged = true;
            }
            else if (zoomLevel < range.From)
            {
                zoomLevel = range.From;
                isChanged = true;
            }

            return isChanged;
        }

    }

 

         定义好之后,调用起来很方便。

XAML<m:Map x:Name="myMap" CredentialsProvider="Your Key" /> C#

            myMap.Mode = new ChinaMode();

            myMap.SetView(new Location(37.5, 104.3), 4);

            myMap.MapForeground.TemplateApplied += (s, e) =>

            {

                myMap.MapForeground.NavigationBar.TemplateApplied += (sender, eventArgs) =>

                    {

                        myMap.MapForeground.NavigationBar.HorizontalPanel.Children.Clear();

                    };

            };

         限定显示范围内,导航条中的缩放条会自动根据所设置的级别变化,但需要手工屏蔽它自带的RoadAerial的按钮。上述C#后面的代码作用即此,请注意图中左上角的导航条变化。示例结果图示: http://hi.baidu.com/liongg/blog/item/5724d42a1d048291033bf620.html 

转载于:https://www.cnblogs.com/LionGG/archive/2009/11/17/1604987.html

相关文章:

  • 如何避免辐射
  • ASP.NET(C#) 如何定时执行一段代码?
  • 巧用SAR命令维护linux系统
  • 全国公共英语五级(PETS-5) 写作作文
  • 【读书笔记】C# in Depth (2)
  • java传值问题.
  • WorldWind学习系列八:Load/Unload Plugins——直捣黄龙篇
  • 计算字符串的相似度(VB2005)
  • AS3+touchlib+GoogleMap=多点触摸GoogleMap
  • 深入浅出ASP.NET
  • 重谈字符串连接性能(下):分析优化
  • [翻译]CryEngine3人工智能的正确设置——高级技巧
  • 莫贪 勿迫
  • PHP连接MySQL的数据库类文件【转】
  • bearychat的java client
  • CSS中外联样式表代表的含义
  • golang 发送GET和POST示例
  • HashMap剖析之内部结构
  • HTML-表单
  • Javascript Math对象和Date对象常用方法详解
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Node + FFmpeg 实现Canvas动画导出视频
  • Promise初体验
  • Twitter赢在开放,三年创造奇迹
  • Vue 2.3、2.4 知识点小结
  • Vue实战(四)登录/注册页的实现
  • 复杂数据处理
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 技术:超级实用的电脑小技巧
  • 力扣(LeetCode)965
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 通过npm或yarn自动生成vue组件
  • 译自由幺半群
  • 原生js练习题---第五课
  • 正则与JS中的正则
  • MPAndroidChart 教程:Y轴 YAxis
  • 回归生活:清理微信公众号
  • ​ubuntu下安装kvm虚拟机
  • ​批处理文件中的errorlevel用法
  • ###C语言程序设计-----C语言学习(3)#
  • #162 (Div. 2)
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (力扣)1314.矩阵区域和
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • ... 是什么 ?... 有什么用处?
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET NPOI导出Excel详解
  • .net 获取url的方法
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接