分享

BingMaps学习笔记(一):控制自己加载瓦片地图显示区域和缩放级数

 昵称QAb6ICvc 2013-01-14

BingMaps学习笔记(一):控制自己加载瓦片地图显示区域和缩放级数

分类: BingMaps学习 1400人阅读 评论(1) 收藏 举报

       今天在项目碰到的一个问题,就是怎样控制自己的瓦片地图,在屏幕范围内移动,平移过程地图不能超越屏幕区域。并且控制地图的缩放级别在某个范围内,比喻17<=zoomLevel<=21.

 (一)为什么要这样控制?

       有人肯定要问,为什么要这样控制呢!比喻,在世界地图上我只想控制人们只能看到中国地图,最小级别就能看到整个中国整个板块的地图!不能再缩小了!那么这是控制地图就起到很好的作用了。

 

(二)解决办法

       我一开始本来是想在ViewChangeOnFrame事件里做限制,但是觉得效果不是很好!下面把这段代码贴出来,觉得这种方法的思路应该是没问题的。这种方法只是给大家一种思路,具体起作用还要仔细分析下的。

[c-sharp] view plaincopy?
  1. void map_ViewChangeOnFrame(object sender, MapEventArgs e)  
  2.        {  
  3.            double  currentZoomLevel=map.ZoomLevel;  
  4.            double minZoomLevel=17;  
  5.            double maxZoomLevel=21;  
  6.            double lat = map.Center.Latitude;  
  7.            double log = map.Center.Longitude;   
  8.            if (lat > secondLatitude)  
  9.            {  
  10.                map.SetView(new Location(secondLatitude - 0.000000001, log), currentZoomLevel);  
  11.            }  
  12.            else if (lat < firstLatitude)  
  13.            {  
  14.                map.SetView(new Location(firstLatitude + 0.000000001, log), currentZoomLevel);  
  15.            }  
  16.            else if (log > secondLongitude)  
  17.            {  
  18.                map.SetView(new Location(lat, secondLongitude - 0.000000001), currentZoomLevel);  
  19.            }  
  20.            else if (log < firstLongitude)  
  21.            {  
  22.                map.SetView(new Location(lat, secondLongitude + 0.000000001), currentZoomLevel);  
  23.            }  
  24.   
  25.            if (currentZoomLevel > maxZoomLevel)  
  26.            {  
  27.                map.ZoomLevel = maxZoomLevel;  
  28.            }  
  29.            else if (currentZoomLevel < minZoomLevel)  
  30.            {  
  31.                map.ZoomLevel = minZoomLevel;  
  32.            }                 
  33.                       
  34.        }  
   

          

 

下面介绍一种确实有效的方法,这个方法的Demo来自msdn(http://msdn.microsoft.com/en-us/library/ee681896.aspx),简单介绍下这种方法,主要是通过自定义MapMode,在MapMode中做限制。validLatitudeRange 和validLongitudeRange用来限制移动的区域。new Range<double>(14, 21)就是来限制缩放级别的!确定validLatitudeRange 和validLongitudeRange的范围是比较麻烦的,我经过多次Debug尝试修改后找到一个合理的值的,你可以先地图缩小到你的允许的最小级别调整你的validLatitudeRange 和validLongitudeRange的范围,如果最小级别是地图只能限制在你所设置的区域,那么放大后也一定会在你设置的区域中了!

下面把代码贴出来下!

[c-sharp] view plaincopy?
  1. public class BSMapMode : MercatorMode  
  2.     {  
  3.         //定义LocationRect boundingRect(加载自己瓦片地图的方形区域的坐标)    
  4.         //double firstLatitude = 30.5064852637928;   
  5.         double firstLatitude = 30.5119852637928;  
  6.         //double firstLongitude = 114.14401462212;   
  7.         double firstLongitude = 114.15681462212;  
  8.         //double secondLatitude = 30.5280355935854;   
  9.         double secondLatitude = 30.5190355935854;  
  10.        // double secondLongitude = 114.16879639265;   
  11.         double secondLongitude = 114.15769639265;  
  12.         private Range<double> validLatitudeRange;  
  13.         private Range<double> validLongitudeRange;  
  14.   
  15.         public BSMapMode()  
  16.         {  
  17.             // The latitude value range (From = bottom most latitude, To = top most latitude)   
  18.             validLatitudeRange = new Range<double>(firstLatitude, secondLatitude);  
  19.             // The longitude value range (From = left most longitude, To = right most longitude)   
  20.             validLongitudeRange = new Range<double>(firstLongitude,secondLongitude);  
  21.         }  
  22.   
  23.         // Restricts the map view.   
  24.         protected override Range<double> GetZoomRange(Location center)  
  25.         {  
  26.             // The allowable zoom levels - 14 to 21.   
  27.             return new Range<double>(17, 21);  
  28.         }  
  29.   
  30.   
  31.         // This method is called when the map view changes on Keyboard    
  32.         // and Navigation Bar events.   
  33.         public override bool ConstrainView(Location center, ref double zoomLevel, ref double heading, ref double pitch)  
  34.         {  
  35.             bool isChanged = base.ConstrainView(center, ref zoomLevel, ref heading, ref pitch);  
  36.   
  37.             double newLatitude = center.Latitude;  
  38.             double newLongitude = center.Longitude;  
  39.   
  40.             // If the map view is outside the valid longitude range,   
  41.             // move the map back within range.   
  42.             if (center.Longitude > validLongitudeRange.To)  
  43.             {  
  44.                 newLongitude = validLongitudeRange.To;  
  45.             }  
  46.             else if (center.Longitude < validLongitudeRange.From)  
  47.             {  
  48.                 newLongitude = validLongitudeRange.From;  
  49.             }  
  50.   
  51.             // If the map view is outside the valid latitude range,   
  52.             // move the map back within range.   
  53.             if (center.Latitude > validLatitudeRange.To)  
  54.             {  
  55.                 newLatitude = validLatitudeRange.To;  
  56.             }  
  57.             else if (center.Latitude < validLatitudeRange.From)  
  58.             {  
  59.                 newLatitude = validLatitudeRange.From;  
  60.             }  
  61.   
  62.             // The new map view location.   
  63.             if (newLatitude != center.Latitude || newLongitude != center.Longitude)  
  64.             {  
  65.                 center.Latitude = newLatitude;  
  66.                 center.Longitude = newLongitude;  
  67.                 isChanged = true;  
  68.             }  
  69.   
  70.             // The new zoom level.   
  71.             Range<double> range = GetZoomRange(center);  
  72.             if (zoomLevel > range.To)  
  73.             {  
  74.                 zoomLevel = range.To;  
  75.                 isChanged = true;  
  76.             }  
  77.             else if (zoomLevel < range.From)  
  78.             {  
  79.                 zoomLevel = range.From;  
  80.                 isChanged = true;  
  81.             }  
  82.   
  83.             return isChanged;  
  84.         }  
  85.   
  86.     }  

 

(三)让自定义Map Mode在地图中生效

      只需要在地图加载时启用Map Mode就行了

       Map map=new Map();

       map.Mode=new BSMode();

   

 

    总结,实现对地图的这种控制是非常有用的!这个只是自己的一点感受!仅供参考!

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多