如何在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));
答案 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
来获取Min
和Max
方法。
答案 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)
正如其他答案所示,我使用SetView
和LocationRect
。
但是我发现它总是产生低缩放级别,因为只使用了整数值。例如,如果完美缩放级别为5.5,则会得到5.0。为了获得合适的效果,我计算了TargetZoomLevel
和TargetBoundingRectangle
的新缩放级别:
viewRect = LocationRect.CreateLocationRect(coordinates);
map.SetView(viewRect);
double scale = map.TargetBoundingRectangle.Height/viewRect.Height;
map.ZoomLevel = map.TargetZoomLevel + Math.Log(scale, 2);
此示例将缩放级别设置为适合屏幕上viewRect
的高度。