2010-12-29 21 views
3

Ähnliche Fragen dazu wurden schon einige Male gestellt, aber keiner von ihnen scheint mir genau das zu geben, was ich will. Ich arbeite mit dem Bing Map-Steuerelement unter Windows Phone und möchte eine Ellipse hinzufügen, die bei Zoomänderungen korrekt skaliert wird. Dies kann mit Polylinien und Polygonen geschehen, aber es gibt keinen von MapShapeBase abgeleiteten Ellipsen-Typ. Ich habe verschiedene Möglichkeiten ausprobiert, aber sie müssen mit Pixelgrößen experimentieren und die Mathematik so manipulieren, dass sie mit Geo-Koordinaten ausgerichtet ist. Ich möchte eine Ellipse mit einer Mitte und x/y-Größen in Metern erstellen und den Rest erledigen lassen. Es scheint so einfach zu sein. Habe ich es irgendwo verpasst? Mein anderer Ansatz ist es, 365 Liniensegmente in einer Polylinie zu zeichnen, aber das scheint schrecklich hässlich zu sein, und da sich das Zentrum bewegen kann, müsste ich die Position jedes Segments binden. Das scheint sehr schwer. Irgendwelche anderen Gedanken?Erstellen eines skalierten Kartenkreises

[Um genau zu sein, ich will um den aktuellen Standort ein „GPS-Genauigkeit“ -Anzeige als Kreis hinzuzufügen.]

+0

AFAIK, doesn die API‘ t gibt Daten zurück, die die Positionsgenauigkeit anzeigen. Wenn dies der Fall wäre, müssten Sie immer noch ziemlich weit herangezoomt werden, um einen Kreis zu sehen, der 2-5m Durchmesser darstellt. Die meisten GPS-Einheiten repräsentieren dies einfach als eine Zahl irgendwo auf dem Bildschirm. – Stonetip

Antwort

5

aktualisieren

In Mango, das Telefon automatisch einen solchen Kreis zeigt.

Orginal Beitrag

Es ist ziemlich einfach. Sie verwenden nur ein Pushpin-Steuerelement, mit dem Sie zeichnen können.

1) eine MapLayer zu Ihrer Kontrolle hinzufügen:

<maps:MapLayer> 
    <maps:MapPolygon Fill="Gray" 
         IsHitTestVisible="False" 
         Locations="{Binding AccuracyLocationCollection}" 
         Opacity="0.6" 
         Stroke="Black" 
         StrokeThickness="2" /> 
</maps:MapLayer> 

2) Fügen Sie die AccuracyLocationCollection Eigenschaft in Ihrem Ansichtsmodell

public LocationCollection AccuracyLocationCollection 
{ 
    get; 
    set; 
} 

3) Im GeoCoordinateWatcher_PositionChanged Event-Handler, die Berechnung der Größe des Kreises und setzen Sie den Wert auf AccuracyLocationCollection

4) Der Code für den DrawMapsCircle geht wie folgt:

privaten static Doppel ToRadian (Doppel Grad) { return Grad * (Math.PI/180); }

private static double ToDegrees(double radians) 
{ 
    return radians * (180/Math.PI); 
} 

public static LocationCollection DrawMapsCircle(GeoCoordinate location) 
{ 
    double earthRadiusInMeters = 6367.0 * 1000.0; 
    var lat = ToRadian(location.Latitude); 
    var lng = ToRadian(location.Longitude); 
    var d = location.HorizontalAccuracy/earthRadiusInMeters; 

    var locations = new LocationCollection(); 

    for (var x = 0; x <= 360; x++) 
    { 
     var brng = ToRadian(x); 
     var latRadians = Math.Asin(Math.Sin(lat) * Math.Cos(d) + Math.Cos(lat) * Math.Sin(d) * Math.Cos(brng)); 
     var lngRadians = lng + Math.Atan2(Math.Sin(brng) * Math.Sin(d) * Math.Cos(lat), Math.Cos(d) - Math.Sin(lat) * Math.Sin(latRadians)); 

     locations.Add(new Location() 
     { 
      Latitude = ToDegrees(latRadians), 
      Longitude = ToDegrees(lngRadians) 
     }); 
    } 

    return locations; 
} 

Ergebnis: (Dies zu mir nach Hause nächsten ist, kann ich bestätigen, es etwa 3 Metern zwischen den Straßen ist der graue Kreis zwischen anzeigt)

Accuracy Circle

+0

Das sieht ziemlich gut aus. Es scheint, als wäre es billiger, wenn ich eine echte Ellipse statt eines 360-Punkt-Polygons machen könnte, aber ich nehme, was ich bekommen kann. Vielen Dank! –

+0

Für die Aufzeichnung, in Mango wird es automatisch angezeigt, also kein Grund, Ihre eigenen zu codieren. –

+0

@ ClausJørgensen: Ich benutze Mango und es sieht nicht so aus, als gäbe es einen solchen Genauigkeitskreis. Gibt es einen Parameter, den ich einstellen muss? –