using Assets.Scripts.Apis.Models; using GeoJSON.Net.Geometry; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels { public abstract class BaseCycling { public CyclingModel Mode { get; private set; } /// /// 是否记录数据 /// internal bool IsRecord { get; set; } /// /// 骑行数据记录器 /// public RecorderDataModel recorderData { get; protected set; } public List riders { get; protected set; } /// /// 骑行的路线 /// public Route route; /// /// 计时器 /// public int Ticks = 0; /// /// 当前骑行的距离 /// protected double currentDistance { get; set; } public virtual bool CanPause => true; protected TurfHelper _turfHelper; protected double Zoom { get; private set; } protected string Bounds { get; private set; } protected List realRiders; protected GeographicPosition CenterPoint { get; private set; } /// /// 结束的时间 /// protected DateTime? EndTime { get; set; } public BaseCycling(Route route, CyclingModel cyclingModel) { this.route = route; this.Mode = cyclingModel; _turfHelper = new TurfHelper(route.JsonData.List.Select(d => d.Point)); } public virtual DateTime Now { get { return UIManager.Now.GetDateTime(); } } public virtual string ShowTime { get { return Helper.FormatTicks(Ticks); } } /// /// 骑行函数(如果此方法不满足,可以在子类中重写此方法) /// /// public virtual void Run(TargetData targetData) { //将当前用户的位置发送到udf服务 SendUserPositionToServer(); //OutModel outData = GetSelfTargetData(targetData); BeforeRunAfterPakcData();//执行前的函数 } /// /// =>发送用户的位置信息到服务端 /// private void SendUserPositionToServer() { try { //if (recorderData.Saved) // return; if (recorderData.RiderDatas.Any()) { var lastData = recorderData.RiderDatas.Last(); var preDistance = recorderData.PreDistance; var weightKg = Math.Round(lastData._Power / recorderData.CurrentUser.Weight, 2); MapUDPService.Send(route.RouteInstance.Id, recorderData.BelongUserId, new double[] { lastData._Lat, lastData._Lon }, recorderData.IsCompleted, false, recorderData.EndDistance, true, 1, lastData._Speed, false, preDistance, weightKg, competitionId: recorderData.Competitionid, recorderData.Saved, 0, lastData._Power, lastData._Cadence, lastData.Ticks, (lastData._FrameRate??0)); } else if (recorderData.EndDistance > 0)//没有骑,但是有初始位置的情况 { var point = _turfHelper.Along(recorderData.EndDistance); //MapUDPService.Send(route.RouteInstance.Id, recorderData.BelongUserId, new double[] { point.Latitude, point.Longitude }, competitionId: recorderData.Competitionid); MapUDPService.Send(route.RouteInstance.Id, recorderData.BelongUserId, new double[] { point.Latitude, point.Longitude }, endDistance:recorderData.EndDistance,preDistance: recorderData.EndDistance, competitionId: recorderData.Competitionid); } else { MapUDPService.Send(route.RouteInstance.Id, recorderData.BelongUserId, route.Point.First().Reverse().ToArray(), competitionId: recorderData.Competitionid); } } catch (Exception) { } } /// /// 执行前,数据打包后 /// /// protected virtual void BeforeRunAfterPakcData() { } protected double SpeedToDistance(double speed) { return Math.Round(speed / 3600, 5, MidpointRounding.AwayFromZero); //return 0.08; } } }