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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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();
            }
        }