Xamarin Forms C#实时计算地理位置距离

我正在构建出租车应用,想要在旅途中计算距离并从驾驶员应用一侧进行更新

我使用Geolocator从https://github.com/jamesmontemagno/GeolocatorPlugin进行实时更新,我得到的是随机位置,并且在实时更新中不稳定,因此我在一分钟后更改了获取位置的信息

 private async Task StartTrackingAsync(bool tracking)
        {
            try
            {
                PermissionStatus hasPermission = await Crosspermissions.Current.CheckPermissionStatusAsync(Permission.Location);
                if (hasPermission != PermissionStatus.Denied)
                {
                    // Permission Granted
                    // check for req
                    if (tracking)
                    {
                        // Check is listening...
                        if (CrossGeolocator.Current.IsListening)
                        {
                            // Start

                            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;

                            object aType = "Automotive Navigation";
                            if (await CrossGeolocator.Current.StartListeningAsync(TimeSpan.FromSeconds(5),50,true,new ListenerSettings
                                {
                                    activityType = activityType.AutomotiveNavigation,AllowBackgroundUpdates = true,DeferLocationUpdates = true,DeferralDistanceMeters = 100,DeferralTime = TimeSpan.FromSeconds(50),ListenForSignificantChanges = true,PauseLocationUpdatesAutomatically = false
                                }))
                            {

                                tracking = true;
                            }
                        }

                    }
                    else
                    {
                        CrossGeolocator.Current.PositionChanged -= CrossGeolocator_Current_PositionChanged;
                        CrossGeolocator.Current.PositionError -= CrossGeolocator_Current_PositionError;

                        await CrossGeolocator.Current.StopListeningAsync();


                        tracking = false;

                    }

                }
                else
                {
                    // Permission Denied
                    await DisplayAlert("Location Error","Error Getting Location","OK");
                }

            }
            catch (Exception ex)
            {
                // Error accured
                await DisplayAlert("Location Error","Error Getting Location: " + ex.Message,"OK");
            }
        }

        private void CrossGeolocator_Current_PositionError(object sender,PositionErrorEventArgs e)
        {

        }

        private void CrossGeolocator_Current_PositionChanged(object sender,PositionEventArgs e)
        {
            Device.BeginInvokeonMainThread(async () =>
            {

                Plugin.Geolocator.Abstractions.Position position = e.Position;

                if (Cposition != e.Position)
                {
                    Cposition = e.Position;
                    mainmap.MoveToRegion(MapSpan.FromCenterAndRadius(new Xamarin.Forms.Maps.Position(position.Latitude,position.Longitude),Distance.FromMiles(1)).Withzoom(2));

                    loader.IsVisible = false;
                    mainmap.IsVisible = true;
                    local.Lat = position.Latitude;
                    local.Lng = position.Longitude;
                }


            });
        }

        private void DistanceUpdate(bool w = false)
        {
            Device.StartTimer(new TimeSpan(0,1),() =>
            {
                UpdateDistance();
                return w;
            });
        }

        private async  void UpdateDistance()
        {
            // Get Trip Location
            Models.Location SLocal = Trip.Location;

            Xamarin.Essentials.Location startTrip = new Xamarin.Essentials.Location(SLocal.Lat,SLocal.Lng);

            try
            {
                if (local != null)
                {

                    Xamarin.Essentials.Location OnTrip = new Xamarin.Essentials.Location(local.Lat,local.Lng);

                    double distance = Xamarin.Essentials.Location.CalculateDistance(startTrip,OnTrip,DistanceUnits.Kilometers);
                    double t = tdistance + distance;

                    tdistance = Math.Round(t,2);

                    if (Trip.Key != null)
                    {
                        _firebaseDatabase.UpdateTripDriverLocation(Trip.Key,local);

                        if (Trip.Status == "Started")
                        {
                            _firebaseDatabase.UpdateTripLocation(Trip.Key,local);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // Unable to get location

                await DisplayAlert(ex.Source,"ERROR: " + ex.Message,"OK");

            }
        }

我不是当前位置,而是一个随机位置,在驾驶员开始移动之前的2分钟内,距离产生了5000公里以上的距离

lyyliu 回答:Xamarin Forms C#实时计算地理位置距离

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3158336.html

大家都在问