gisempire100
捉鬼专家
捉鬼专家
  • 注册日期2004-08-13
  • 发帖数552
  • QQ
  • 铜币2462枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:869回复:0

BMSL:Map Mode解析

楼主#
更多 发布于:2009-11-18 12:37
<P >       和传统GIS客户端架构有所不同,BMSL同MapMode的方式来控制Map的一些特征,比如<STRONG style="mso-bidi-font-weight: normal">更换地图瓦片数据,限定缩放级别,固定平移范围</STRONG>;甚至是控制鼠标键盘事件导航地图的方式,以及地理坐标与像素坐标的映射等。</P>
<P >         Map有属性曰Mode,类型为MapMode。MapMode有子类FlatMapMode,FlatMapMode有子类MercatorMode,MercatorMode有两个子类RoadMode和AerialMode。(关系简单,不再图示)</P>
<P >         MercatorMode设置了<a href="http://hi.baidu.com/liongg/blog/item/4f6455fbe183381e6d22ebee.html" target="_blank" >Web Mercator</A><a href="http://hi.baidu.com/liongg/blog/item/4f6455fbe183381e6d22ebee.html" target="_blank" >投影</A>的相关投影,RoadMode和AerialMode分别定了Bing Maps的数据类型,以及导航控件等。比如把Map的Mode设置为空的MercatorMode,即可清除Bing Maps数据,替换其中的TileSource,即可更换底图数据。</P>
<P >         若要限制显示范围,则要定制自己的MapMode,比如从RoadMode继承,覆盖GetZoomRange限制缩放级别,覆盖ConstrainView限制平移范围。 </P>
<P ><BR></P>
<P >        下文的示例,大致限定在中国经纬度范围内,缩放级别限定在3和10之间,并把底图数据改变为Google卫星地图以及它的地图注记数据(即那些汉字标绘),如何自定义TileSource请参考《<a href="http://hi.baidu.com/liongg/blog/item/f81a632775c25a09918f9d42.html" target="_blank" >在BMSL中使用Google 地图</A>》。</P>
<P  align=left>    public class ChinaMode : RoadMode<BR>    {<BR>        private Range<double> validLatitudeRange = new Range<double>(3.92, 53.51);<BR>        private Range<double> validLongitudeRange = new Range<double>(73.60, 135.01);</P>
<P  align=left>        public ChinaMode()<BR>            : base()<BR>        {<BR>            var tileLayer = (MapTileLayer)this.Content;<BR>            tileLayer.TileSources.Clear();<BR>            tileLayer.TileSources.Add(new GoogleSatelliteTileSource());<BR>            tileLayer.TileSources.Add(new GoogleLabelTileSource());<BR>        }</P>
<P  align=left>        protected override Range<double> GetZoomRange(Location center)<BR>        {<BR>            return new Range<double>(3, 10);<BR>        }</P>
<P  align=left>        public override bool ConstrainView(Location center, ref double zoomLevel, ref double heading, ref double pitch)<BR>        {<BR>            bool isChanged = base.ConstrainView(center, ref zoomLevel, ref heading, ref pitch);<BR>            double newLatitude = center.Latitude;<BR>            double newLongitude = center.Longitude;<BR>            if (center.Longitude > validLongitudeRange.To)<BR>            {<BR>                newLongitude = validLongitudeRange.To;<BR>            }<BR>            else if (center.Longitude < validLongitudeRange.From)<BR>            {<BR>                newLongitude = validLongitudeRange.From;<BR>            }</P>
<P  align=left>            if (center.Latitude > validLatitudeRange.To)<BR>            {<BR>                newLatitude = validLatitudeRange.To;<BR>            }<BR>            else if (center.Latitude < validLatitudeRange.From)<BR>            {<BR>                newLatitude = validLatitudeRange.From;<BR>            }</P>
<P  align=left>            if (newLatitude != center.Latitude || newLongitude != center.Longitude)<BR>            {<BR>                center.Latitude = newLatitude;<BR>                center.Longitude = newLongitude;<BR>                isChanged = true;<BR>            }</P>
<P  align=left>            Range<double> range = GetZoomRange(center);<BR>            if (zoomLevel > range.To)<BR>            {<BR>                zoomLevel = range.To;<BR>                isChanged = true;<BR>            }<BR>            else if (zoomLevel < range.From)<BR>            {<BR>                zoomLevel = range.From;<BR>                isChanged = true;<BR>            }</P>
<P  align=left>            return isChanged;<BR>        }</P>
<P  align=left>    }</P>
<P > </P>
<P >         定义好之后,调用起来很方便。</P>
<P >XAML:<m:Map x:Name="myMap" CredentialsProvider="Your Key" /> C#:</P>
<P  align=left>            myMap.Mode = new ChinaMode();</P>
<P  align=left>            myMap.SetView(new Location(37.5, 104.3), 4);</P>
<P  align=left>            myMap.MapForeground.TemplateApplied += (s, e) =></P>
<P  align=left>            {</P>
<P  align=left>                myMap.MapForeground.NavigationBar.TemplateApplied += (sender, eventArgs) =></P>
<P  align=left>                    {</P>
<P  align=left>                        myMap.MapForeground.NavigationBar.HorizontalPanel.Children.Clear();</P>
<P  align=left>                    };</P>
<P >            };</P>
<P  align=left>         限定显示范围内,导航条中的缩放条会自动根据所设置的级别变化,但需要手工屏蔽它自带的Road、Aerial的按钮。上述C#后面的代码作用即此,请注意图中左上角的导航条变化。示例结果图示: <a href="http://hi.baidu.com/liongg/blog/item/5724d42a1d048291033bf620.html" target="_blank" >http://hi.baidu.com/liongg/blog/item/5724d42a1d048291033bf620.html </A></P>
喜欢0 评分0
A friend is never known till a man has need. ...CL
游客

返回顶部