2014-06-16 4 views
11

Ich versuche, eine Anwendung zu entwickeln, die so etwas wie ein Spiel sein sollte. Der Benutzer hätte einige Orte in einer Stadt und er müsste an jedem Ort etwas unternehmen. Um die Position des Benutzers zu verfolgen, habe ich mit Geolokalisierung mit dem folgenden Code versucht:Geolocation in C#

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

Mit Hilfe die folgende Art und Weise die Koordinaten zu bekommen habe ich versucht, das Gerät zu testen, ob meine Position ortet korrekt mit dem folgenden Code:

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

das Problem ist, dass die Genauigkeit der Lage ist wirklich klein, wenn ich genauer Koordinaten würde es nie wieder die gleichen Koordinaten erhalten, und mit diesem Code ist die Genauigkeit ist wirklich schlecht versuchen, mit (es kann scheitern sogar 300 Meter).

Hat jemand eine Idee, wie man einen zuverlässigeren Standort erhält, oder eine andere Möglichkeit, das zu beheben?

Antwort

6

Ich denke, dass das Problem auftritt, weil Sie zu wenig Zeit geben für Geolocator eine richtige Anzeige mit Geolocator.GetGeopositionAsync - timeout zu machen:

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

Sie geben es nur 1 Sekunde Während eine genauere Position benötigt wird, braucht es Zeit.

Mein Beispiel:

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

Der obige Code eine Position returs (in meinem Fall) mit einer Genauigkeit von ca. 35 Metern, ABER nach etwa 20-30 Sekunden warten. Beachten Sie auch, dass die Genauigkeit von der Anzahl der verfügbaren Satelliten abhängt.

auch einige Bemerkungen von MSDN:

  1. gesetzt Geolocator.ReportInterval-0:

    Apps, die Daten in Echtzeit erfordern sollte ReportInterval auf 0 gesetzt, um anzuzeigen, dass kein Mindestintervall angegeben wird . Wenn unter Windows das Berichtsintervall 0 ist, empfängt die App Ereignisse mit der Häufigkeit, mit der die genaueste Standortquelle sie sendet. Unter Windows Phone erhält die App Updates mit einer Rate, die von der Genauigkeit abhängt, die von der App angefordert wird.

  2. gesetzt Geolocator.DesiredAccuracyInMeters-10 Meter:

    ◾If der Benutzer versucht, seine Position zu teilen, sollte die App eine Genauigkeit von etwa 10 Metern fordern.

  3. try zwischen Start Geolocator und reding es dealy:

    Betrachten Anlaufverzögerung. Wenn eine App zum ersten Mal Standortdaten anfordert, kann beim Start des Standortanbieters eine kurze Verzögerung (1-2 Sekunden) auftreten. Berücksichtigen Sie dies bei der Gestaltung der Benutzeroberfläche Ihrer App. Beispielsweise möchten Sie möglicherweise verhindern, dass andere Aufgaben bis zum Abschluss des Aufrufs von GetGeopositionAsync blockiert werden.

+0

thx, ich werde das versuchen morgen (Ich habe das Telefon gerade nicht, um es zu testen) ich hoffe, dass es funktioniert :) – user2700896

+0

@ user2700896 Wenn Sie nicht sicher sind, dann markieren Sie es nicht als sol ved - mach es wenn du es einmal testest :) In diesem Fall sollte es funktionieren, aber es könnte andere Probleme gegeben haben. – Romasz

-1

versuchen Sie dies:

Geolocator.DesiredAccuracy = PositionAccuracy.High; 
+0

ich bereits versucht haben, dass (deshalb ist die Zeile Geolocator.DesiredAccuracy = PositionAccuracy.High; kommentiert) .Die Genauigkeit ist immer noch sehr gering mit dem ... Ich habe versucht es nochmal zu testen und die Genauigkeit war 1342 Meter – user2700896

0

Zumindest für mich der Code funktioniert ok, und ich auf „txt.Text =‚KONT‘ Wo sind Sie für konstante Breite oder Länge zu finden?

+0

hm ... es ist komisch, dass Sie zu der Zeile txt.Text = "KONT" kommen, denn das ist ein Ort in Kroatien. Ich ging dorthin und notierte die Koordinaten und schrieb sie nur zum Testen fest :) – user2700896

+0

... Ich habe meine Koordinaten verwendet :-P Ich nehme meine Koordinaten in die gleichen Dezimalstellen wie Sie und ich probierte die Methode aus. Verwenden Sie ein echtes Gerät oder Emulator? Wenn Gerät, welches? – Mulflar