2011-01-14 10 views
8

Come si può ingrandire il controllo Microsoft.Phone.Controls.Maps.Map sul corretto livello di zoom su Windows Phone 7?Come eseguire lo zoom per adattarsi al controllo WP7 di Bing Maps utilizzando LocationCollection?

Ho un LocationCollection di GeoCoordinate e ho calcolato il Centro stesso, ma ora come faccio a calcolare il livello di zoom corretto per adattarlo a LocationCollection?

P.S. Esiste un metodo fuori dalla scatola per calcolare il centro di GeoCoordinate in modo da non doverlo calcolare da solo?

EDIT: ho trovato un altro bel soluzione: http://4mkmobile.com/2010/09/quick-tip-position-a-map-based-on-a-collection-of-pushpins/

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

risposta

8

È possibile utilizzare il seguente codice per calcolare il LocationRect che delimita un insieme di punti, e quindi passare il LocationRect al SetView() metodo sul controllo mappa:

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

Le maniglie di controllo mappa che animano dalla posizione corrente al nuovo Posizione.

NOTA: Avrete bisogno di una dichiarazione using per System.Linq per ottenere i Min e Max metodi.

+0

Sì, è così che l'ho fatto. Funziona bene. –

+3

Grazie, accetterò la tua risposta, tuttavia ho trovato un'altra soluzione eccellente: map.SetView (LocationRect.CreateLocationRect (points)); // http://4mkmobile.com/2010/09/quick-tip-position-a-map-based-on-a-collection-of-pushpins/ – Buju

+0

Grazie. Sono contento che tu abbia trovato una soluzione. Dovrò prendere nota mentalmente che LocationRect aiuta più di quanto pensassi :) –

1

Derek ha già dato la risposta in modo da poter accettare il suo, offro un codice alternativo per i casi in cui ci sono molti punti. Questo approccio non fa altro che iterare la raccolta punti una volta invece 4 volte, tuttavia non è così esteticamente gradevole.

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 .. e non definirei prematura ottimizzazione; Chiamerei la risposta accettata come un degrado prematuro :-) –

0

come suggerito dalle altre risposte che uso SetView con un LocationRect.

Tuttavia ho trovato che produce sempre a basso livello di zoom, poiché sono stati utilizzati solo valori interi. Se ad esempio il livello di zoom perfetto fosse 5.5, otterresti 5.0. Per ottenere una misura adeguata a calcolare un nuovo livello di zoom da TargetZoomLevel e TargetBoundingRectangle:

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

questo esempio viene impostato il livello di zoom per adattarsi all'altezza viewRect s' sullo schermo.

Problemi correlati