it-swarm.com.ru

Геолокация в 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");
}

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

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

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

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

12
user2700896

Я думаю, что проблема возникает, потому что вы даете 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 :

  1. set Geolocator.ReportInterval до 0:

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

  2. set Geolocator.DesiredAccuracyInMeters до 10 метров:

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

  3. попробуем разобраться между запуском Geolocator и повторным чтением:

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

8
Romasz

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

0
Mulflar