【Silverlight】 Bing Maps开发应用与技巧四:自定义MapMode实现(2)
通过MercatorMode继承过来有分别处理地图加载范围(ConstrainView)和地图深度缩放级别(GetZoomRange)的两个方法。实际上我们要在地图访问上做一些范围的限制主要就是通过重写这两个方法的具体实现。如下代码块演示了加载经度从70--140范围的地图,且地图缩放级别只能是在3--10级之间进行缩放。
/// <summary>
/// 自定义地图投影模式
/// </summary>
public class ChinaMode : MercatorMode
{
/// <summary>
/// 纬度范围
/// </summary>
public Range<double> LatitudeRange = new Range<double>(-50.0, 50.0);
/// <summary>
/// 经度范围(70-140刚好就是中国地图区域)
/// </summary>
public Range<double> LongitudeRange = new Range<double>(70.0, 140.0);
/// <summary>
/// 深度缩放范围(3-10级)
/// </summary>
public Range<double> MapZoomRange = new Range<double>(3.0, 10.0);
/// <summary>
///
/// </summary>
/// <param name="center">地图中心地理坐标</param>
/// <param name="zoomLevel">地图缩放级别</param>
/// <param name="heading">定向视图标题</param>
/// <param name="pitch"></param>
/// <returns>是否有值更改</returns>
public override bool ConstrainView(Location center, ref double zoomLevel, ref double heading, ref double pitch)
{
return base.ConstrainView(center, ref zoomLevel, ref heading, ref pitch);
}
/// <summary>
/// 确定地图深度缩放范围
/// </summary>
/// <param name="center"></param>
/// <returns></returns>
protected override Range<double> GetZoomRange(Location center)
{
//只能访问3-10级地图
return this.MapZoomRange;
}
/// <summary>
/// 重写鼠标中键滚轮操作行为
/// </summary>
/// <param name="e"></param>
public override void OnMouseWheel(MapMouseWheelEventArgs e)
{
if ((e.WheelDelta > 0.0) && (this.ZoomLevel >= this.MapZoomRange.To))
{
e.Handled = true;
}
else
{
base.OnMouseWheel(e);
}
}
/// <summary>
/// 重写鼠标拖放地图行为
/// </summary>
/// <param name="e"></param>
public override void OnMouseDragBox(MapMouseDragEventArgs e)
{
if (((this.TargetBoundingRectangle.East <= this.LongitudeRange.To)
&& (this.TargetBoundingRectangle.West >= this.LongitudeRange.From)))
{
e.Handled = true;
}
else
{
e.Handled = false;
}
}
}