private double GetSpeed(bykIFv1.Point current, bykIFv1.Point prev) { if (0 < current.Speed) { return(current.Speed); } // 10分以上差があるなら、時速算出しない TimeSpan ts = current.Time - prev.Time; if (ts.TotalMinutes >= 10) { return(current.Speed); } double dis = PointDistance.Distance(current, prev); double result = dis / ts.TotalSeconds; return(result); }
public bykIFv1.Point GetPoint(DateTime targetDate, double margineSeconds, double margineDstaince) { // 含まれない場合NULLを返すよ if (!IsContein(targetDate, margineSeconds)) { return(null); } // 指定された時間をUTCに変換する TimeSpan diff = System.TimeZoneInfo.Local.GetUtcOffset(targetDate); DateTime utcTime = targetDate.Subtract(diff); bykIFv1.Point orless = null; bykIFv1.TrackItem trackItem = _trackItemProxy.GetTrackItem(out _trackItemProxy); foreach (bykIFv1.Point pnt in trackItem.Items) { if (utcTime == pnt.Time) { return(pnt); } if (utcTime > pnt.Time) { orless = pnt; } // ソートされているから省略する if (utcTime < pnt.Time) { if (null != orless) { TimeSpan s1 = utcTime - orless.Time; TimeSpan s2 = pnt.Time - utcTime; if (s1 < s2) { if (s1.TotalSeconds <= margineSeconds) { return(orless); } } else { if (s2.TotalSeconds <= margineSeconds) { return(pnt); } } // 前回値の二点間の距離をみるよ double d = PointDistance.Distance(orless, pnt); if (d < margineDstaince) { // 前後の距離が近いので、時間のブレは大きいが、位置情報として採用する // 近い方 if (s1 < s2) { return(orless); } else { return(pnt); } } } else { TimeSpan s2 = pnt.Time - utcTime; if (s2.TotalSeconds <= margineSeconds) { return(pnt); } } break; } } // 最終の点よりも少しあとを再処理する if (2 < trackItem.Items.Count) { bykIFv1.Point ormore = trackItem.Items[trackItem.Items.Count - 1]; TimeSpan s3 = utcTime - ormore.Time; if (0 <= s3.TotalSeconds) { if (s3.TotalSeconds <= margineSeconds) { return(ormore); } } } return(null); }
private void preview_Click(object sender, EventArgs e) { _items.Clear(); if (byDateTime.Checked) { int splitCount = 0; bykIFv1.TrackItem newItem = null; DateTime prevValue = DateTime.MinValue; TimeSpan ts; foreach (bykIFv1.Point p in _track.Items) { ts = p.Time - prevValue; if ((double)timeValue.Value <= ts.TotalHours) { ++splitCount; // 名前は元のデータを利用する newItem = new bykIFv1.TrackItem(string.Format("{0}({1})", _track.Name, splitCount), _track.CreateTime); // 情報があれば利用する if (0 < _track.Description.Length) { newItem.Description = string.Format("{0}({1})", _track.Description, splitCount); } _items.Add(newItem); } newItem.Items.Add(p); prevValue = p.Time; } } else if (byDistance.Checked) { int splitCount = 0; bykIFv1.TrackItem newItem = null; // KMをMにしますよ double distanceValueMeter = (double)distanceValue.Value * 1000; bykIFv1.Point from = null; double distance = 0; foreach (bykIFv1.Point p in _track.Items) { distance = (null == from) ? distanceValueMeter : PointDistance.Distance(from, p); if (distanceValueMeter <= distance) { ++splitCount; // 名前は元のデータを利用する newItem = new bykIFv1.TrackItem(string.Format("{0}({1})", _track.Name, splitCount), _track.CreateTime); // 情報があれば利用する if (0 < _track.Description.Length) { newItem.Description = string.Format("{0}({1})", _track.Description, splitCount); } _items.Add(newItem); } newItem.Items.Add(p); from = p; } } _splitItems.BeginUpdate(); try { _splitItems.Items.Clear(); foreach (var v in _items) { ListViewItem item = new ListViewItem(v.Name); DateTime dtFrom = v.Items[0].Time; TimeSpan span = System.TimeZoneInfo.Local.GetUtcOffset(dtFrom); dtFrom = dtFrom.Add(span); item.SubItems.Add(dtFrom.ToString()); DateTime dtTo = v.Items[v.Items.Count - 1].Time; span = System.TimeZoneInfo.Local.GetUtcOffset(dtTo); dtTo = dtTo.Add(span); item.SubItems.Add(dtTo.ToString()); item.SubItems.Add(v.Items.Count.ToString()); item.Tag = v; _splitItems.Items.Add(item); } _splitItems.Enabled = true; _OK.Enabled = true; } finally { _splitItems.EndUpdate(); } }