Геолокация в 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:
-
set геолокатор.Reportinterval значение для 0:
приложения, которые требуют данных в реальном времени, должны установить ReportInterval в 0, чтобы указать, что минимальный интервал не указан. В Windows, когда интервал отчета равен 0, приложение получает события с частотой, с которой их отправляет наиболее точный источник местоположения. На Для Windows Phone, приложение будет получать обновления со скоростью, зависящей от точности, запрошенных приложением.
-
set геолокатор.DesiredAccuracyInMeters до 10 метров:
◾если пользователь пытается поделиться своей позицией, приложение должно запросить точность около 10 метров.
-
попробуйте разобраться между запуском геолокатора и его Редингом:
рассмотреть вопрос о пуске задержка. В первый раз, когда приложение запрашивает данные о местоположении, может быть небольшая задержка (1-2 секунды) при запуске поставщика местоположения. Рассмотрим это в дизайне пользовательского интерфейса вашего приложения. Например, может потребоваться избежать блокировки других задач до завершения вызова GetGeopositionAsync.
по крайней мере для меня код работает нормально, и я "в формате txt.Text = " KONT" Где вы находите постоянную широту или долготу?