1

我正在使用方法 SetView 来缩放地图中的两个点,但是当它们太近时,我太缩放了。所以我希望我可以检查这样的事情:

myMap.SetView(bounds);
if (myMap.ZoomLevel > Constants.DefaultZoomLevel)
    myMap.ZoomLevel = Constants.DefaultZoomLevel;

但是方法 SetView 不会立即设置 ZoomLevel 属性。我能做些什么来修复它?如何设置一些缩放级别边框?谢谢

编辑:

我发现在 8.0 sdk 中有 ZoomLevelChanged 事件?这可能对我有用。那么有没有可能如何让它在 7.1 中工作?

4

1 回答 1

0

我尝试了几种解决方案,这些是我的结果(我需要为 WP7.1 工作,只针对 WP8 可能有更简单的解决方案):

  • TargetZoomLevel 的使用

像这样:

myMap.ZoomLevel = Math.Min(myMap.TargetZoomLevel, maxZoomLevel);

没有解决我的问题,因为 SetView 在执行此代码后设置了 ZoomLevel。Map 只是在 SetView 的 ZoomLevel 和 maxZoomLevel 之间闪烁(我有用于检查位置的计时器,所以这就是为什么它在闪烁并且对我不利)。

  • MapZoom 事件的使用

像这样:

private void map1_MapZoom(object sender, Microsoft.Phone.Controls.Maps.MapZoomEventArgs e)
{
    if (((Map)sender).ZoomLevel > maxZoomLevel)
    {
        e.Handled = true;
    }
}

问题:MapZoom 事件处理程序在使用 SetView 时未触发。

  • 如果距离很小,检查距离并设置 ZoomLevel:

    public static double GetDistanceBetweenPoints(LatLon firstPoint, LatLon secondPoint)
    {
        var sCoord = new GeoCoordinate(firstPoint.Lat, firstPoint.Lon);
        var eCoord = new GeoCoordinate(secondPoint.Lat, secondPoint.Lon);
        return sCoord.GetDistanceTo(eCoord);
    }
    

用法:

var distance = LocationHelper.GetDistanceBetweenPoints(carPosition, userPosition);
if (distance < MinMetersDistance)
    myMap.ZoomLevel = maxZoomLevel;

问题:再次闪烁。有时我通过这段代码设置 ZoomLevel。其他时间由 SetView 设置。

  • 我真正的解决方案:

我只是像前一个点一样检查两点之间的距离。但是这次如果距离很短,我只是从旧点创建新点并将它们设置在最小距离的新位置(纬度和经度)(左侧一个我向左移动更多,右侧移动第二个)我向右移动更多)。然后我在新点上使用了 SetView。

于 2013-08-07T20:33:39.217 回答