如何使用LocationCollection缩放以适应WP7 Bing Maps控件?

时间:2011-01-14 17:12:06

标签: windows-phone-7 location zoom bing-maps

如何在Windows Phone 7上将Microsoft.Phone.Controls.Maps.Map控件缩放到正确的缩放级别?

我有一个GeoCoordinates的LocationCollection,我自己计算了中心,但现在我如何计算正确的缩放级别以适应LocationCollection?

P.S。是否有开箱即用的方法来计算GeoCoordinates的中心,所以我不必自己计算它?

编辑: 我找到了另一个很好的解决方案:http://4mkmobile.com/2010/09/quick-tip-position-a-map-based-on-a-collection-of-pushpins/

map.SetView(LocationRect.CreateLocationRect(points));

3 个答案:

答案 0 :(得分:8)

您可以使用以下代码计算绑定一组点的LocationRect,然后将LocationRect传递给地图控件上的SetView()方法:

var bounds = new LocationRect(
    points.Max((p) => p.Latitude),
    points.Min((p) => p.Longitude),
    points.Min((p) => p.Latitude),
    points.Max((p) => p.Longitude));
map.SetView(bounds);

地图控件处理从当前位置到新位置的动画。

注意:您需要using语句System.Linq来获取MinMax方法。

答案 1 :(得分:1)

Derek已经给出了答案,所以你应该接受他,我提供了一个替代代码,用于有很多要点的情况。这种方法只迭代点集合一次而不是4次,但它并不令人满意。

 double north, west, south, west;

 north = south = points[0].Latitude;
 west = east = points[0].Longitude;

 foreach (var p in points.Skip(1))
 {
     if (north < p.Latitude) north = p.Latitude;
     if (west > p.Longitude) west = p.Longitude;
     if (south > p.Latitude) south = p.Latitude;
     if (east < p.Longitude) east = p.Longitude
 }
 map.SetView(new LocationRect(north, west, south, east));

答案 2 :(得分:0)

正如其他答案所示,我使用SetViewLocationRect

但是我发现它总是产生低缩放级别,因为只使用了整数值。例如,如果完美缩放级别为5.5,则会得到5.0。为了获得合适的效果,我计算了TargetZoomLevelTargetBoundingRectangle的新缩放级别:

viewRect = LocationRect.CreateLocationRect(coordinates);
map.SetView(viewRect);
double scale = map.TargetBoundingRectangle.Height/viewRect.Height;
map.ZoomLevel = map.TargetZoomLevel + Math.Log(scale, 2);

此示例将缩放级别设置为适合屏幕上viewRect的高度。