Геолокация в 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 метров).

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

3 ответов


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

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 геолокатор.Reportinterval значение для 0:

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

  2. set геолокатор.DesiredAccuracyInMeters до 10 метров:

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

  3. попробуйте разобраться между запуском геолокатора и его Редингом:

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


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


попробуйте это:

Geolocator.DesiredAccuracy = PositionAccuracy.High;