| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- 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);
- }
- }
|