m_position.dart 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import 'dart:math';
  2. import 'package:trackoffical_app/pb.dart' as pb;
  3. import 'package:trackoffical_app/appcore/ffi.dart' as ffi;
  4. import 'package:trackoffical_app/utils.dart';
  5. import 'package:vector_math/vector_math.dart';
  6. import 'package:sensor/sensor.dart' as sensor;
  7. class MPosition{
  8. double latitude=0;
  9. double longitude = 0;
  10. DateTime timestamp = DateTime.now();
  11. double directionRadian = 0.0;
  12. double altitude = 0;
  13. double speed=0;
  14. double accuracy=0;
  15. MPosition({
  16. this.latitude = 0,
  17. this.longitude = 0,
  18. });
  19. pb.Position toPb(){
  20. return pb.Position()
  21. ..latitude= latitude
  22. ..longitude= longitude
  23. ..altitude= altitude
  24. ;
  25. }
  26. pb.GameGpsInfo toPb2(){
  27. return pb.GameGpsInfo()
  28. ..latitude= latitude
  29. ..longitude= longitude
  30. ..altitude= altitude
  31. ..directionRadian= directionRadian
  32. ..gpsTime= timestamp.toPb()
  33. ;
  34. }
  35. @override
  36. String toString() {
  37. return 'la: $latitude lo: $longitude';
  38. }
  39. Distance distance(MPosition p1) {
  40. final p2 = ffi.Position(latitude: latitude, longitude: longitude);
  41. final p3 = ffi.Position(latitude: p1.latitude, longitude: p1.longitude);
  42. final m = ffi.api.distanceMeterBetween(p1: p2, p2: p3);
  43. return Distance(m: m);
  44. }
  45. /// [other] 位于此位置的方向角 弧度
  46. double directionTo(MPosition other){
  47. var lat1 = latitude;
  48. var lon1 = longitude;
  49. var lat2 = other.latitude;
  50. var lon2 = other.longitude;
  51. // 将经纬度转换为弧度
  52. lat1 = radians(lat1);
  53. lon1 = radians(lon1);
  54. lat2 = radians(lat2);
  55. lon2 = radians(lon2);
  56. // 计算经度差
  57. var dLon = lon2 - lon1;
  58. // 计算方位角
  59. var y = sin(dLon) * cos(lat2);
  60. var x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon);
  61. var bearingRadians = atan2(y, x);
  62. return bearingRadians;
  63. }
  64. }
  65. extension PbPositionExt on pb.Position{
  66. MPosition toModel(){
  67. return MPosition(longitude: longitude, latitude: latitude);
  68. }
  69. }
  70. extension PbGpsInfoExt on pb.GameGpsInfo{
  71. MPosition toModel(){
  72. return MPosition(longitude: longitude, latitude: latitude)
  73. ..timestamp = gpsTime.toModel()
  74. ..directionRadian = directionRadian
  75. ..altitude=altitude;
  76. }
  77. }
  78. extension SensorGpsInfoExt on sensor.Position{
  79. MPosition toModel(){
  80. return MPosition(longitude: longitude, latitude: latitude)
  81. ..latitude=latitude
  82. ..longitude=longitude
  83. ..accuracy=accuracy
  84. ..altitude=altitude
  85. ..speed=speed
  86. ..directionRadian = bearing
  87. ..timestamp= DateTime.fromMillisecondsSinceEpoch(tsMs);
  88. }
  89. }