Обновление GeoLocaiton в режиме реального времени - PullRequest
0 голосов
/ 24 октября 2019

Я создаю небольшое работающее приложение для собственного обучения, и я пытаюсь получить местоположения GPS, для которого я использую геолокацию xamrain essentials, она отлично работает для ручных записей. Я собираюсь сохранить точки в списке, когда ониобновить, но это событие, на которое я могу подписаться, которое сообщит мне, когда местоположение изменилось, поскольку в большинстве работающих приложений пользователь не нажимает кнопку.

private async void BtnStart_OnClicked(object sender, EventArgs e)
{
    var location = await Geolocation.GetLastKnownLocationAsync();
    if (location != null)
    {
      Console.WriteLine($"Latitude: {location.Latitude}, Longitude: {location.Longitude}, Altitude: {location.Altitude}");
    }

        lbllong.Text = location.Longitude.ToString();

        lbllat.Text = location.Latitude.ToString();
        Location StartLocation = new Location(location.Latitude,location.Longitude);
        Location endLocation = new Location(37.783333, -122.416667);

        double miles = Location.CalculateDistance(StartLocation, endLocation, DistanceUnits.Miles);

}

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

1 Ответ

1 голос
/ 25 октября 2019

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

Если вы хотите обновить местоположение, когда расстояние или времякак сказал Джейсон, вы можете использовать Xam.Plugin.Geolocator для установки пакетов nuget.

Вы можете реализовать этот метод для контроля времени и расстояния:

Task<bool> StartListeningAsync(TimeSpan minimumTime, double minimumDistance, bool includeHeading = false, ListenerSettings listenerSettings = null);

И подпишитесь на это событие, чтобы получить текущую позицию:

CrossGeolocator.Current.PositionChanged += CrossGeolocator_Current_PositionChanged;

Вы можете увидеть весь образец по первой ссылке Джейсона, я предоставляю необходимый код:

bool tracking;

    public ObservableCollection<Position> Positions { get; } = new ObservableCollection<Position>();

    public HomePage()
    {
        InitializeComponent();
        ListViewPositions.ItemsSource = Positions;
    }

private async void ButtonTrack_Clicked(object sender, EventArgs e)
    {
        try
        {
            var hasPermission = await Utils.CheckPermissions(Permission.Location);
            if (!hasPermission)
                return;

            if (tracking)
            {
                CrossGeolocator.Current.PositionChanged -= CrossGeolocator_Current_PositionChanged;
                CrossGeolocator.Current.PositionError -= CrossGeolocator_Current_PositionError;
            }
            else
            {
                CrossGeolocator.Current.PositionChanged += CrossGeolocator_Current_PositionChanged;
                CrossGeolocator.Current.PositionError += CrossGeolocator_Current_PositionError;
            }

            if (CrossGeolocator.Current.IsListening)
            {
                await CrossGeolocator.Current.StopListeningAsync();
                labelGPSTrack.Text = "Stopped tracking";
                ButtonTrack.Text = "Start Tracking";
                tracking = false;
                count = 0;
            }
            else
            {
                Positions.Clear();
                if (await CrossGeolocator.Current.StartListeningAsync(TimeSpan.FromSeconds(TrackTimeout.Value), TrackDistance.Value,
                    TrackIncludeHeading.IsToggled, new ListenerSettings
                    {
                        ActivityType = (ActivityType)ActivityTypePicker.SelectedIndex,
                        AllowBackgroundUpdates = AllowBackgroundUpdates.IsToggled,
                        DeferLocationUpdates = DeferUpdates.IsToggled,
                        DeferralDistanceMeters = DeferalDistance.Value,
                        DeferralTime = TimeSpan.FromSeconds(DeferalTIme.Value),
                        ListenForSignificantChanges = ListenForSig.IsToggled,
                        PauseLocationUpdatesAutomatically = PauseLocation.IsToggled
                    }))
                {
                    labelGPSTrack.Text = "Started tracking";
                    ButtonTrack.Text = "Stop Tracking";
                    tracking = true;
                }
            }
        }
        catch (Exception ex)
        {
            await DisplayAlert("Uh oh", "Something went wrong, but don't worry we captured for analysis! Thanks.", "OK");
        }
    }




void CrossGeolocator_Current_PositionError(object sender, PositionErrorEventArgs e)
{

    labelGPSTrack.Text = "Location error: " + e.Error.ToString();
}

void CrossGeolocator_Current_PositionChanged(object sender, PositionEventArgs e)
{

    Device.BeginInvokeOnMainThread(() =>
    {
        var position = e.Position;
        Positions.Add(position);
        count++;
        LabelCount.Text = $"{count} updates";
        labelGPSTrack.Text = string.Format("Time: {0} \nLat: {1} \nLong: {2} \nAltitude: {3} \nAltitude Accuracy: {4} \nAccuracy: {5} \nHeading: {6} \nSpeed: {7}",
            position.Timestamp, position.Latitude, position.Longitude,
            position.Altitude, position.AltitudeAccuracy, position.Accuracy, position.Heading, position.Speed);

    });
}

https://github.com/jamesmontemagno/GeolocatorPlugin/blob/master/samples/GeolocatorSample/GeolocatorSample/HomePage.xaml.cs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...