Domanda

Domande simili a questo è stato chiesto un certo numero di volte qui, ma nessuno di loro sembrano darmi esattamente quello che voglio. Sto lavorando con il controllo Bing Map su Windows Phone e vorrei aggiungere un'ellisse che bilancia adeguatamente con i cambiamenti di zoom. Questo può essere fatto con linee poli e poligoni, ma non v'è alcun tipo ellisse derivato da MapShapeBase. Ho provato diversi modi di farlo, ma hanno bisogno di giocare con dimensioni dei pixel e fudging la matematica per rendere più allineata con le coordinate geografiche. Voglio creare un'ellisse con un centro e x / y dimensioni in metri e avere il quadro fare il resto. Sembra così semplice. Ho perso da qualche parte? Il mio altro approccio è quello di richiamare 365 segmenti in una linea di poli, ma che sembra orribilmente brutto, e dal momento che il centro può muoversi, avrei bisogno di impegnare la posizione di ogni segmento. Che sembra molto pesante. Eventuali altri pensieri?

[Per essere precisi, voglio aggiungere un indicatore di "Precisione GPS", come un cerchio intorno alla posizione corrente.]

È stato utile?

Soluzione

Aggiorna

In Mango, il telefono automaticamente mostra una tale cerchio.

Orginal Messaggio

E 'abbastanza facile. Basta usare un controllo di simboli a che fare con il disegno.

1) Aggiungere un maplayer al vostro controllo:

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

2) Aggiungere la proprietà AccuracyLocationCollection nel vostro ViewModel

public LocationCollection AccuracyLocationCollection
{
    get;
    set;
}

3) Nel gestore di eventi GeoCoordinateWatcher_PositionChanged, calcolare la dimensione del cerchio, e impostare il valore per l'AccuracyLocationCollection

ViewModel.AccuracyLocationCollection = DrawMapsCircle(e.Position.Location);

4) Il codice per il DrawMapsCircle va in questo modo:

private static doppia ToRadian (doppia gradi) { gradi ritorno * (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;
}

Risultato: (Questo è vicino a casa mia, posso confermare ci sono circa 3 metri tra le strade il cerchio grigio è la visualizzazione tra i)

Accuracy Circle

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top