2014-06-16 25 views
11

Próbuję opracować aplikację, która powinna być czymś w rodzaju gry. Użytkownik miałby pewne lokalizacje w mieście i musiałby coś zrobić w każdej lokalizacji. W celu śledzenia położenia użytkownika, próbowałem przy użyciu geolokalizacji z następującego kodu:Geolokalizacja w 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"); 
} 

stosując następujący sposób, aby uzyskać współrzędne starałem się sprawdzić, czy urządzenie będzie zlokalizować swoją pozycję poprawnie z następujących Kod:

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

problemem jest to, że dokładność lokalizacji jest bardzo małe, jeśli próbuję przy użyciu bardziej precyzyjne współrzędne to nigdy nie dostać te same współrzędne ponownie, a wraz z tym kodem dokładność jest naprawdę źle (może nawet 300 metrów).

Czy ktoś ma pomysł, jak uzyskać bardziej niezawodną lokalizację, lub inny sposób, aby to naprawić?

Odpowiedz

6

myślę, że problem występuje, ponieważ daje zbyt mało czasu na Geolocator dokonania prawidłowego odczytu z Geolocator.GetGeopositionAsync - timeout:

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

ją podać tylko 1 sekunda , podczas gdy uzyskanie dokładniejszej pozycji wymaga czasu.

Mój przykład:

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

Powyższy kod returs pozycję (w moim przypadku) z dokładnością do ~ 35 metrów, ALE po odczekaniu około 20-30 sekund. Należy również pamiętać, że dokładność zależy od liczby dostępnych satelitów.

także kilka uwag od MSDN:

  1. ustawić Geolocator.ReportInterval do 0:

    aplikacje, które wymagają danych w czasie rzeczywistym powinien ustawić ReportInterval 0, co oznacza, że ​​nie ma minimalny odstęp jest określony . W systemie Windows, gdy interwał raportu wynosi 0, aplikacja otrzymuje zdarzenia z częstotliwością, którą przesyła najdokładniejsze źródło lokalizacji. W systemie Windows Phone aplikacja będzie otrzymywać aktualizacje z szybkością zależną od dokładności wymaganej przez aplikację.

  2. ustawić Geolocator.DesiredAccuracyInMeters do 10 metrów:

    ◾If użytkownik stara się dzielić swoją pozycję, aplikacja powinna wystąpić z dokładnością do 10 metrów.

  3. spróbuj Dealy pomiędzy rozpoczęciem Geolocator i Reding go:

    rozważyć opóźnienie rozruchu. Za pierwszym razem, gdy aplikacja żąda danych o lokalizacji, może nastąpić krótkie opóźnienie (1-2 sekundy) podczas uruchamiania dostawcy lokalizacji. Rozważ to w projekcie interfejsu aplikacji. Na przykład możesz uniknąć blokowania innych zadań oczekujących na zakończenie połączenia z GetGeopositionAsync.

+0

thx, spróbuję tego jutro (nie mam tu teraz telefonu, żeby go przetestować) mam nadzieję, że zadziała :) – user2700896

+0

@ user2700896 Jeśli nie masz pewności, nie oznaczaj go jako sol ved - zrób to po przetestowaniu :) W tym przypadku powinno działać, ale mogły być inne problemy. – Romasz

-1

spróbuj tego:

Geolocator.DesiredAccuracy = PositionAccuracy.High; 
+0

Próbowałem już, że (dlatego komentowana jest linia Geolocator.DesiredAccuracy = PositionAccuracy.High;) Dokładność jest nadal bardzo niska z tym ... Próbowałem przetestować to ponownie i dokładność wynosiła 1342 metry – user2700896

0

Przynajmniej dla mnie kod działa ok, a ja się do „txt.Text =«KONT» Gdzie jesteś znalezieniu stałej szerokości geograficznej lub geograficzną?

+0

hm ... to dziwne, że trafiasz do linii mówiąc txt.Text = "KONT", ponieważ jest to lokalizacja w Chorwacji. Poszedłem tam i zapisałem współrzędne i na stałe je przetestowałem :) – user2700896

+0

... Użyłem swoich współrzędnych :-P Biorę moje współrzędne na te same pozycje dziesiętne, jak ty i ja próbowaliśmy tej metody. Czy używasz prawdziwego urządzenia lub emulatora? Jeśli urządzenie, który? – Mulflar

Powiązane problemy