Геолокация в С#

Я пытаюсь разработать приложение, которое должно быть чем-то вроде игры. У пользователя будет несколько мест в городе, и он должен будет что-то сделать в каждом месте. Чтобы отслеживать позицию пользователя, я попытался использовать геолокацию со следующим кодом:

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

Используя следующий способ для получения координат, я попытался проверить, правильно ли устройство правильно позиционирует мою позицию с помощью следующего кода:

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

Проблема в том, что точность местоположения действительно мала, если я попытаюсь использовать более точные координаты, она никогда не получит одинаковые координаты, и с этим кодом точность действительно плохая (она может провалиться даже на 300 метров).

У кого-нибудь есть идея, как получить более надежное место или другой способ исправить это?

Ответ 1

Я думаю, что проблема возникает, потому что вы уделяете слишком мало времени, чтобы Geolocator сделал правильное считывание с Geolocator.GetGeopositionAsync - timeout:

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

Вы даете ему только 1 секунду, а получение более точной позиции занимает время.

Мой пример:

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

Код выше возвращает позицию (в моем случае) с точностью ~ 35 метров, НО после ожидания около 20-30 секунд. Отметим также, что точность зависит от количества доступных сателлитов.

Также некоторые замечания из MSDN:

  • установите Geolocator.ReportInterval в 0:

    Приложения, которые требуют данных в реальном времени, должны установить ReportInterval в 0, чтобы указать, что минимальный интервал не указан. В Windows, когда интервал отчета равен 0, приложение получает события на частоте, которую посылает их самый точный источник местоположения. В Windows Phone приложение получит обновления со скоростью, зависящей от точности, запрашиваемой приложением.

  • установите Geolocator.DesiredAccuracyInMeters на 10 метров:

    ◾ Если пользователь пытается разделить свою позицию, приложение должно запросить точность около 10 метров.

  • попытайтесь разобраться между запуском геолокатора и его повторением:

    Рассчитайте задержку запуска. В первый раз, когда приложение запрашивает данные о местоположении, может произойти короткая задержка (1-2 секунды), пока поставщик местоположения запустится. Рассмотрим это в дизайне вашего пользовательского интерфейса приложения. Например, вы можете избежать блокировки других задач до завершения вызова GetGeopositionAsync.

Ответ 2

По крайней мере, для меня код работает нормально, и я добираюсь до "txt.Text =" KONT " Где вы находите постоянную широту или долготу?

Ответ 3

попробуйте следующее:

Geolocator.DesiredAccuracy = PositionAccuracy.High;