Геолокация в 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 ответов:
Я думаю, что проблема возникает, потому что вы даете слишком мало времени для Geolocator, чтобы сделать правильный отсчет с Geolocator.GetGeopositionAsync - тайм-аут:
Geoposition geoposition = await geolocator.GetGeopositionAsync(TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1));Вы даете ему только 1 секунду, в то время как получение более точного положения требует времени.
Мой пример:
Приведенный выше код возвращает позицию (в моем случае) с точностью ~35 метров, но после ожидания около 20-30 секунд. Заметим также, что точность зависит от количества доступных сателлиты.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"); }; }Также некоторые замечания из MSDN :
Установить Геолокатор.ReportInterval to 0:
Приложения, которым требуются данные в реальном времени, должны установить значение ReportInterval равным 0, чтобы указать, что минимальный интервал не задан. В Windows, когда интервал отчета равен 0, приложение получает события с частотой, с которой их отправляет наиболее точный источник местоположения. На Windows Phone приложение будет получать обновления со скоростью, зависящей от точности запрошено приложением.
Установить Геолокатор.DesiredAccuracyInMeters до 10 метров:
◾если пользователь пытается поделиться своей позицией, приложение должно запросить точность около 10 метров.
Попробуйте разобраться между запуском геолокатора и его Редингом:
Рассмотрим задержку запуска. В первый раз, когда приложение запрашивает данные о местоположении, может возникнуть небольшая задержка (1-2 секунды) при запуске поставщика услуг определения местоположения. Учтите это при разработке пользовательского интерфейса вашего приложения. Например, вы можете избежать блокировки других задач до завершения вызова GetGeopositionAsync.
По крайней мере, для меня код работает нормально, и я получаю "txt.Текст = " КОНТ" Где вы находите постоянную широту или долготу?
Comments