import 'dart:math'; import 'package:trackoffical_app/pb.dart' as pb; import 'package:trackoffical_app/appcore/ffi.dart' as ffi; import 'package:trackoffical_app/utils.dart'; import 'package:vector_math/vector_math.dart'; import 'package:sensor/sensor.dart' as sensor; class MPosition{ double latitude=0; double longitude = 0; DateTime timestamp = DateTime.now(); double directionRadian = 0.0; double altitude = 0; double speed=0; double accuracy=0; MPosition({ this.latitude = 0, this.longitude = 0, }); pb.Position toPb(){ return pb.Position() ..latitude= latitude ..longitude= longitude ..altitude= altitude ; } pb.GameGpsInfo toPb2(){ return pb.GameGpsInfo() ..latitude= latitude ..longitude= longitude ..altitude= altitude ..directionRadian= directionRadian ..gpsTime= timestamp.toPb() ; } @override String toString() { return 'la: $latitude lo: $longitude'; } Distance distance(MPosition p1) { final p2 = ffi.Position(latitude: latitude, longitude: longitude); final p3 = ffi.Position(latitude: p1.latitude, longitude: p1.longitude); final m = ffi.api.distanceMeterBetween(p1: p2, p2: p3); return Distance(m: m); } /// [other] 位于此位置的方向角 弧度 double directionTo(MPosition other){ var lat1 = latitude; var lon1 = longitude; var lat2 = other.latitude; var lon2 = other.longitude; // 将经纬度转换为弧度 lat1 = radians(lat1); lon1 = radians(lon1); lat2 = radians(lat2); lon2 = radians(lon2); // 计算经度差 var dLon = lon2 - lon1; // 计算方位角 var y = sin(dLon) * cos(lat2); var x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon); var bearingRadians = atan2(y, x); return bearingRadians; } } extension PbPositionExt on pb.Position{ MPosition toModel(){ return MPosition(longitude: longitude, latitude: latitude); } } extension PbGpsInfoExt on pb.GameGpsInfo{ MPosition toModel(){ return MPosition(longitude: longitude, latitude: latitude) ..timestamp = gpsTime.toModel() ..directionRadian = directionRadian ..altitude=altitude; } } extension SensorGpsInfoExt on sensor.Position{ MPosition toModel(){ return MPosition(longitude: longitude, latitude: latitude) ..latitude=latitude ..longitude=longitude ..accuracy=accuracy ..altitude=altitude ..speed=speed ..directionRadian = bearing ..timestamp= DateTime.fromMillisecondsSinceEpoch(tsMs); } }