我正在构建出租车应用,想要在旅途中计算距离并从驾驶员应用一侧进行更新
我使用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公里以上的距离