2011-01-14 4 views
8

Wie kann ich das Steuerelement Microsoft.Phone.Controls.Maps.Map auf die richtige Zoomstufe unter Windows Phone 7 zoomen?So wird gezoomt, um in WP7 zu passen Bing Maps-Steuerelement mit LocationCollection?

Ich habe eine LocationCollection von GeoCoordinates und ich habe das Center selbst berechnet, aber wie berechne ich jetzt die richtige Zoomstufe für die LocationCollection?

P.S. Gibt es eine Out-of-the-Box-Methode, um den Mittelpunkt von GeoCoordinates zu berechnen, damit ich ihn nicht selbst berechnen muss?

EDIT: Ich habe eine andere feine Lösung gefunden: http://4mkmobile.com/2010/09/quick-tip-position-a-map-based-on-a-collection-of-pushpins/

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

Antwort

8

können Sie den folgenden Code verwenden, um die LocationRect zu berechnen, die einen Satz von Punkten begrenzt, und übergeben Sie dann die LocationRect an die SetView() Methode in der Kartensteuerung:

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

Die Kartensteuerung behandelt die Animation von der aktuellen Position zur neuen Position Lage.

HINWEIS: Sie benötigen eine using-Anweisung für System.Linq, um die Methoden Min und Max zu erhalten.

+0

Ja, so habe ich es gemacht. Funktioniert gut. –

+3

Danke, ich akzeptiere deine Antwort, aber ich habe eine andere feine Lösung gefunden: map.SetView (LocationRect.CreateLocationRect (points)); // http://4mkmobile.com/2010/09/quick-tip-position-a-map-based-on-a-collection-of-pushpins/ – Buju

+0

Danke. Schön, dass Sie eine Lösung gefunden haben. Ich muss mir im Klaren sein, dass LocationRect mehr hilft, als ich dachte :) –

1

Derek hat bereits die Antwort gegeben, also sollten Sie seine akzeptieren, biete ich einen alternativen Code für Fälle an, in denen es viele Punkte gibt. Dieser Ansatz iteriert nur einmal die Punktesammlung statt 4 Mal, aber es ist nicht so ästhetisch ansprechend.

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 .. und ich würde dies nicht eine vorzeitige Optimierung nennen; Ich würde die akzeptierte Antwort eine vorzeitige Degradierung nennen :-) –

0

Wie ich SetView mit einem LocationRect verwenden, indem Sie die anderen Antworten vorgeschlagen.

Allerdings habe ich festgestellt, dass es immer zu niedrigen Zoom-Ebene produziert, da nur ganzzahlige Werte verwendet wurde. Wenn beispielsweise die perfekte Zoomstufe 5,5 wäre, würden Sie 5,0 erhalten. Um einen korrekten Sitz ich einen neuen Zoomstufe berechnen von TargetZoomLevel und TargetBoundingRectangle:

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

In diesem Beispiel wird die Zoomstufe viewRect ‚s Höhe auf dem Bildschirm anzupassen.

Verwandte Themen