Question

Des questions similaires à ceci ont demandé un certain nombre de fois, mais aucun d'entre eux semblent me donner exactement ce que je veux. Je travaille avec le contrôle Carte Bing sur Windows Phone et je voudrais ajouter une ellipse qui balance correctement avec les changements de zoom. Cela peut être fait avec des lignes et des polygones poly, mais il n'y a pas de type d'ellipse dérivée de MapShapeBase. J'ai essayé différentes façons de le faire, mais ils ont besoin de jouer avec la taille des pixels et fudging les mathématiques pour en faire la ligne avec les coordonnées géographiques. Je veux créer un Ellipse avec un centre et x / y tailles en mètres et ont le cadre le reste. Il semble si simple. Ai-je raté quelque part? Mon autre approche est d'attirer 365 segments de ligne en ligne poly, mais qui semble horriblement laid, et que le centre peut se déplacer, je aurais besoin de lier l'emplacement de chaque segment. Cela semble très lourd poids. Toutes les autres pensées?

[Pour être précis, je veux ajouter un indicateur « de précision GPS » comme un cercle autour de l'emplacement actuel.]

Était-ce utile?

La solution

Mise à jour

Dans Mango, le téléphone automatiquement montre un tel cercle.

Orginal Poster

Il est assez facile. Vous utilisez simplement un contrôle Punaise pour faire le dessin avec.

1) Ajouter un MapLayer à votre commande:

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

2) Ajouter la propriété AccuracyLocationCollection dans votre ViewModel

public LocationCollection AccuracyLocationCollection
{
    get;
    set;
}

3) Dans le gestionnaire d'événements GeoCoordinateWatcher_PositionChanged, calculer la taille du cercle, et définir la valeur de la AccuracyLocationCollection

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

4) Le code de la DrawMapsCircle va comme ceci:

private static à double ToRadian (double diplôme)     {         degrés de retour * (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;
}

Résultat: (Ceci est à côté de chez moi, je peux confirmer qu'il ya environ 3 mètres entre les routes du cercle gris DIFFUSE entre)

Cercle de précision

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top