web-dev-qa-db-fra.com

Géolocalisation en C #

J'essaie de développer une application qui devrait ressembler à un jeu. L'utilisateur aurait des emplacements dans une ville et il devrait faire quelque chose à chaque emplacement. Afin de suivre la position de l'utilisateur, j'ai essayé d'utiliser la géolocalisation avec le code suivant:

Geolocator geolocator = new Geolocator();
//geolocator.DesiredAccuracy = Windows.Devices.Geolocation.PositionAccuracy.High;
geolocator.DesiredAccuracyInMeters = 50;
try
{
    Geoposition geoposition = await geolocator.GetGeopositionAsync(TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1));
    textLatitude.Text = "Latitude: " + geoposition.Coordinate.Latitude.ToString("0.0000000000");
    textLongitude.Text = "Longitude: " + geoposition.Coordinate.Longitude.ToString("0.0000000000");
    textAccuracy.Text = "Accuracy: " + geoposition.Coordinate.Accuracy.ToString("0.0000000000");
}

En utilisant la méthode suivante pour obtenir les coordonnées, j'ai essayé de vérifier si le périphérique localiserait correctement ma position avec le code suivant:

if( Math.Abs(geoposition.Coordinate.Latitude - 45.3285) < 0.001 ){
    if (Math.Abs(geoposition.Coordinate.Longitude - 14.4474) < 0.001)
    {
        txt.Text = "KONT";              
    }
}

Le problème est que la précision de la localisation est vraiment petite, si j'essaie d'utiliser des coordonnées plus précises, les coordonnées ne seront plus jamais les mêmes, et avec ce code, la précision est vraiment mauvaise (elle peut même perdre 300 mètres).

Quelqu'un a-t-il une idée pour obtenir un emplacement plus fiable ou un autre moyen de résoudre ce problème?

12
user2700896

Je pense que le problème se produit, car vous donnez trop peu de temps à Geolocator pour effectuer une lecture correcte avec Geolocator.GetGeopositionAsync - timeout _ :

Geoposition geoposition = await geolocator.GetGeopositionAsync(TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1));

Vous ne lui accordez qu'une seconde, alors que prendre une position plus précise prend du temps.

Mon exemple:

Geolocator geolocator;
Geoposition geoposition;
public MainPage()
{
   this.InitializeComponent();
   geolocator = new Geolocator();
   geolocator.DesiredAccuracyInMeters = 10;
   geolocator.ReportInterval = 0;

   myButton.Click += async (sender, e) =>
       {
           geoposition = await geolocator.GetGeopositionAsync();
           string latitude = geoposition.Coordinate.Latitude.ToString("0.0000000000");
           string Longitude = geoposition.Coordinate.Longitude.ToString("0.0000000000");
           string Accuracy = geoposition.Coordinate.Accuracy.ToString("0.0000000000");
       };
}

Le code ci-dessus reprend une position (dans mon cas) avec une précision de ~ 35 mètres,MAISaprès avoir attendu environ 20-30 secondes. Notez également que la précision dépend du nombre de satellites disponibles.

Quelques remarques de MSDN :

  1. set Geolocator.ReportInterval à 0:

    Les applications qui nécessitent des données en temps réel doivent définir ReportInterval sur 0 pour indiquer qu'aucun intervalle minimum n'est spécifié. Sous Windows, lorsque l'intervalle de rapport est 0, l'application reçoit les événements à la fréquence à laquelle la source de localisation la plus précise les envoie. Sur Windows Phone, l'application recevra des mises à jour à un taux dépendant de la précision demandée par l'application.

  2. set Geolocator.DesiredAccuracyInMeters jusqu'à 10 mètres:

    Si l'utilisateur tente de partager sa position, l'application doit demander une précision d'environ 10 mètres. 

  3. essayez de faire la sourde oreille entre le démarrage de Geolocator et sa suppression:

    Considérer le délai de démarrage. La première fois qu'une application demande des données de localisation, un court délai (1 à 2 secondes) est nécessaire au démarrage du fournisseur de localisation. Considérez ceci dans la conception de l'interface utilisateur de votre application. Par exemple, vous voudrez peut-être éviter de bloquer d'autres tâches en attendant l'achèvement de l'appel à GetGeopositionAsync.

8
Romasz

Au moins pour moi, le code fonctionne bien, et j'arrive à "txt.Text =" KONT " Où trouvez-vous votre latitude ou longitude constante?

0
Mulflar