67 lines
1.9 KiB
Dart
67 lines
1.9 KiB
Dart
/// نموذج بيانات إحداثية GPS
|
|
/// يمثل نقطة واحدة مع بيانات الارتفاع والدقة والسرعة
|
|
class GpsCoordinate {
|
|
final double latitude;
|
|
final double longitude;
|
|
final double? altitude;
|
|
final double? accuracy;
|
|
final double? speed; // m/s from GPS sensor
|
|
final double? heading; // degrees from north
|
|
final DateTime timestamp;
|
|
|
|
GpsCoordinate({
|
|
required this.latitude,
|
|
required this.longitude,
|
|
this.altitude,
|
|
this.accuracy,
|
|
this.speed,
|
|
this.heading,
|
|
required this.timestamp,
|
|
});
|
|
|
|
Map<String, dynamic> toMap() {
|
|
return {
|
|
'latitude': latitude,
|
|
'longitude': longitude,
|
|
'altitude': altitude,
|
|
'accuracy': accuracy,
|
|
'speed': speed,
|
|
'heading': heading,
|
|
'timestamp': timestamp.toIso8601String(),
|
|
};
|
|
}
|
|
|
|
factory GpsCoordinate.fromMap(Map<String, dynamic> map) {
|
|
return GpsCoordinate(
|
|
latitude: (map['latitude'] as num).toDouble(),
|
|
longitude: (map['longitude'] as num).toDouble(),
|
|
altitude: map['altitude'] != null
|
|
? (map['altitude'] as num).toDouble()
|
|
: null,
|
|
accuracy: map['accuracy'] != null
|
|
? (map['accuracy'] as num).toDouble()
|
|
: null,
|
|
speed:
|
|
map['speed'] != null ? (map['speed'] as num).toDouble() : null,
|
|
heading: map['heading'] != null
|
|
? (map['heading'] as num).toDouble()
|
|
: null,
|
|
timestamp: DateTime.parse(map['timestamp'] as String),
|
|
);
|
|
}
|
|
|
|
/// Check if this coordinate has acceptable accuracy for tracking
|
|
bool get isAccurate => accuracy != null && accuracy! <= 25.0;
|
|
|
|
/// Check if this is a valid GPS coordinate
|
|
bool get isValid =>
|
|
latitude >= -90 &&
|
|
latitude <= 90 &&
|
|
longitude >= -180 &&
|
|
longitude <= 180;
|
|
|
|
@override
|
|
String toString() =>
|
|
'GpsCoordinate(lat: $latitude, lng: $longitude, alt: $altitude, spd: $speed)';
|
|
}
|