2011-01-14 8 views
8

¿Cómo puedo acercar el control Microsoft.Phone.Controls.Maps.Map al nivel de zoom correcto en Windows Phone 7?Cómo hacer zoom para ajustar en WP7 Control de Bing Maps usando LocationCollection?

Tengo un LocationCollection de GeoCoordinates y calculé el Centro yo mismo, pero ahora ¿cómo puedo calcular el nivel de zoom correcto para que coincida con el LocationCollection?

P.S. ¿Existe un método listo para usar para calcular el centro de GeoCoordinates, así que no tengo que calcularlo por mi cuenta?

EDIT: he encontrado otra solución bien: http://4mkmobile.com/2010/09/quick-tip-position-a-map-based-on-a-collection-of-pushpins/

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

Respuesta

8

Se puede utilizar el siguiente código para calcular el LocationRect que delimita un conjunto de puntos, y luego pasar el LocationRect a la SetView() método en el control de mapa:

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);

El control de mapa maneja la animación de la posición actual a la nueva ubicación.

NOTA: Usted necesitará una declaración de usingSystem.Linq para obtener los métodos Min y Max.

+0

Sí, así es como lo hice. Funciona bien –

+3

Gracias, aceptaré su respuesta, sin embargo, he encontrado otra solución excelente: map.SetView (LocationRect.CreateLocationRect (points)); // http://4mkmobile.com/2010/09/quick-tip-position-a-map-based-on-a-collection-of-pushpins/ – Buju

+0

Gracias. Me alegro de que hayas encontrado una solución. Tendré que hacer una nota mental de que LocationRect me ayuda más de lo que pensaba :) –

1

Derek ya ha dado la respuesta por lo que debe aceptar la suya, ofrezco un código alternativo para los casos donde hay muchos puntos. Este enfoque solo itera la colección de puntos una vez, en lugar de 4 veces, sin embargo, no es tan agradable desde el punto de vista estético.

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)); 
+0

+1 ... y no llamaría a esto una optimización prematura; Llamaría a la respuesta aceptada una degradación prematura :-) –

0

Como sugerido por las otras respuestas que utilizo SetView con un LocationRect.

Sin embargo, encontré que siempre produce un nivel de zoom bajo, ya que solo se usaron valores enteros. Si, por ejemplo, el nivel de zoom perfecto fuera 5.5, obtendrías 5.0. Para conseguir un ajuste apropiado calculo un nuevo nivel de zoom en TargetZoomLevel y TargetBoundingRectangle:

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

este ejemplo se establece el nivel de zoom para ajustar la altura viewRect 's en la pantalla.

Cuestiones relacionadas