Пример #1
0
        public SplitForm(bykIFv1.TrackItem track)
        {
            InitializeComponent();

            _track = track;
            _items = new List <bykIFv1.TrackItem>();
        }
Пример #2
0
 private void ExportGPX(string filePath, bykIFv1.TrackItem trackItem)
 {
     using (TrackItemWriter tiw = new TrackItemWriter(filePath))
     {
         tiw.Write(trackItem);
     }
 }
Пример #3
0
        public TrackPointPreviewForm(bykIFv1.TrackItem trackItem)
        {
            InitializeComponent();

            _trackItem = trackItem;
            maxSpeed   = 200;
        }
Пример #4
0
        private void _downloadWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            List <bykIFv1.Point> points = _port.ReadLatLonData();

            bykIFv1.TrackItem item = new bykIFv1.TrackItem(Properties.Resources.DownloadData_DefaultName, DateTime.Now);
            item.Items = points;

            e.Result = item;
        }
Пример #5
0
        public UInt32 AddItem(bykIFv1.TrackItem track)
        {
            TrackItemSummary tiSum = new TrackItemSummary(track);

            if (0 == _locations.Count)
            {
                _locations.Add(tiSum);
            }
            else
            {
                _locations.Insert(0, tiSum);
            }

            return(tiSum.ID);
        }
Пример #6
0
        private void _splitItems_DoubleClick(object sender, EventArgs e)
        {
            if (1 != _splitItems.SelectedItems.Count)
            {
                return;
            }
            bykIFv1.TrackItem trackItem = _splitItems.SelectedItems[0].Tag as bykIFv1.TrackItem;
            if (null == trackItem)
            {
                return;
            }

            TrackPointPreviewForm tpf = new TrackPointPreviewForm(trackItem);

            tpf.Show(this);
        }
Пример #7
0
        public UInt32 AddItem(UInt32 id, bykIFv1.TrackItem track)
        {
            TrackItemSummary tiSum = new TrackItemSummary(track);
            int index = _locations.FindIndex(x => x.ID == id);

            if (0 > index)
            {
                _locations.Add(tiSum);
            }
            else
            {
                _locations.Insert(index, tiSum);
            }

            return(tiSum.ID);
        }
Пример #8
0
        private void _export_Click(object sender, EventArgs e)
        {
            if (1 != _locationSources.SelectedItems.Count)
            {
                return;
            }
            ListViewItem     item             = _locationSources.SelectedItems[0];
            TrackItemSummary trackItemSummary = item.Tag as TrackItemSummary;

            if (null == trackItemSummary)
            {
                return;
            }

            ToolStripMenuItem menu = sender as ToolStripMenuItem;

            if (null == menu)
            {
                return;
            }

            ExportMethod  exportMethod = null;
            EXPORT_FORMAT format       = (EXPORT_FORMAT)menu.Tag;

            switch (format)
            {
            case EXPORT_FORMAT.GPX:
                _exportFileDialog.DefaultExt = ".gpx";
                _exportFileDialog.Filter     = "GPX Files|*.gpx|ALL Files|*.*";
                _exportFileDialog.FileName   = trackItemSummary.Name;
                exportMethod = new ExportMethod(ExportGPX);
                break;

            default:
                return;
            }

            if (DialogResult.OK == _exportFileDialog.ShowDialog(this))
            {
                bykIFv1.TrackItem trackItem = trackItemSummary.TrackItem;
                if (null != exportMethod)
                {
                    exportMethod(_exportFileDialog.FileName, trackItem);
                }
            }
        }
Пример #9
0
        public void Load()
        {
            // 場所情報のサマリーを取得する
            string locations = System.IO.Path.Combine(_savePath, "BayakiSummary.dat");

            if (File.Exists(locations))
            {
                using (var stream = new FileStream(locations, FileMode.Open))
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    _locations = bf.Deserialize(stream) as List <TrackItemSummary>;
                }
            }
            else
            {
                // ファイルがないけど、リカバリーを試みよう
                DirectoryInfo di = new DirectoryInfo(_savePath);
                foreach (FileInfo fi in di.GetFiles("TrackItem*.dat"))
                {
                    try
                    {
                        using (TrackItemReader tir = new TrackItemReader(fi.FullName))
                        {
                            bykIFv1.TrackItem item = tir.Read();
                            if (null != item)
                            {
                                TrackItemSummary summary = new TrackItemSummary(item, fi.FullName);

                                _locations.Add(summary);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        // 読み込みでエラーが発生する可能性は、この場合では無視する。
                        System.Diagnostics.Debug.Print(ex.Message);
                    }
                }

                if (0 < _locations.Count)
                {
                    Save();
                }
            }
        }
Пример #10
0
        /// <summary>
        /// リカバリー用コンストラクタ
        /// </summary>
        /// <param name="track">リカバリーデータ</param>
        /// <param name="filePath">リカバリー元のファイル</param>
        public TrackItemSummary(bykIFv1.TrackItem track, string filePath)
        {
            track.Normalize();

            PointCount = track.Items.Count;
            From       = track.Items[0].Time;
            TimeSpan span = System.TimeZoneInfo.Local.GetUtcOffset(From);

            From = From.Add(span);

            To   = track.Items[PointCount - 1].Time;
            span = System.TimeZoneInfo.Local.GetUtcOffset(To);
            To   = To.Add(span);

            Description = track.Description;

            _name           = track.Name;
            _trackItemProxy = new TrackItemCacheLoaded(track, filePath);

            _saveFileName = filePath;
        }
Пример #11
0
        private void _routePreview_Click(object sender, EventArgs e)
        {
            if (1 != _locationSources.SelectedItems.Count)
            {
                return;
            }
            ListViewItem     lvItem       = _locationSources.SelectedItems[0];
            TrackItemSummary trackSummary = lvItem.Tag as TrackItemSummary;

            if (null == trackSummary)
            {
                return;
            }

            bykIFv1.TrackItem trackItem = trackSummary.TrackItem;

            trackItem.Name = trackSummary.Name;
            TrackPointPreviewForm tpf = new TrackPointPreviewForm(trackItem);

            tpf.Show(this);
        }
Пример #12
0
        public TrackItemSummary(bykIFv1.TrackItem track)
        {
            track.Normalize();

            ID = GenerateID();

            PointCount = track.Items.Count;
            From       = track.Items[0].Time;
            TimeSpan span = System.TimeZoneInfo.Local.GetUtcOffset(From);

            From = From.Add(span);

            To   = track.Items[PointCount - 1].Time;
            span = System.TimeZoneInfo.Local.GetUtcOffset(To);
            To   = To.Add(span);

            Description = track.Description;

            _name           = track.Name;
            _trackItemProxy = new TrackItemCacheNotYetSaved(track);

            _saveFileName = string.Empty;
        }
Пример #13
0
        private void _downloadWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (null == e.Error)
            {
                _item = e.Result as bykIFv1.TrackItem;

                if (null != _item && 0 >= _item.Items.Count)
                {
                    _cancel.Enabled   = true;
                    _download.Enabled = true;
                    MessageBox.Show(Properties.Resources.MSG3, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);

                    DialogResult = DialogResult.Cancel;
                }

                DialogResult = DialogResult.OK;
            }
            else
            {
                _cancel.Enabled   = true;
                _download.Enabled = true;
                MessageBox.Show(e.Error.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
Пример #14
0
        public bykIFv1.TrackItem Read()
        {
            bykIFv1.Point olditem = null;

            bykIFv1.TrackItem result = new bykIFv1.TrackItem("KML data", DateTime.Now);


            List <DateTime> wayPoints = new List <DateTime>();

            while (_xmlReader.Read())
            {
                switch (_xmlReader.NodeType)
                {
                case System.Xml.XmlNodeType.Element:
                    if (0 == string.Compare(_xmlReader.Name, "Placemark", true))
                    {
                        if (!_xmlReader.IsEmptyElement)
                        {
                            string datetime = string.Empty;
                            string coord    = string.Empty;

                            while (_xmlReader.Read())
                            {
                                switch (_xmlReader.NodeType)
                                {
                                case System.Xml.XmlNodeType.Element:
                                    if (0 == string.Compare(_xmlReader.Name, "name", true))
                                    {
                                        result.Name = _xmlReader.ReadString();
                                    }
                                    else if (0 == string.Compare(_xmlReader.Name, "description", true))
                                    {
                                        result.Description = _xmlReader.ReadString();
                                    }
                                    else if (0 == string.Compare(_xmlReader.Name, "gx:Track", true))
                                    {
                                        if (!_xmlReader.IsEmptyElement)
                                        {
                                            while (_xmlReader.Read())
                                            {
                                                switch (_xmlReader.NodeType)
                                                {
                                                case System.Xml.XmlNodeType.Element:
                                                    if (0 == string.Compare(_xmlReader.Name, "when", true))
                                                    {
                                                        datetime = _xmlReader.ReadString();
                                                    }
                                                    else if (0 == string.Compare(_xmlReader.Name, "gx:coord", true))
                                                    {
                                                        coord = _xmlReader.ReadString();

                                                        string[] coords = coord.Split(' ');

                                                        DateTime dt;
                                                        if (DateTime.TryParse(datetime, out dt))
                                                        {
                                                            double lon = double.Parse(coords[1]);
                                                            double lat = double.Parse(coords[0]);
                                                            double ele = (coords.Length > 2) ? double.Parse(coords[2]) : double.NaN;

                                                            bykIFv1.Point item = new bykIFv1.Point(dt.ToUniversalTime(), lon, lat, ele, 0, false);

                                                            bool skip = false;
                                                            if (null != olditem)
                                                            {
                                                                TimeSpan s = item.Time - olditem.Time;

                                                                double maxDistance = Math.Abs(_maxSpeed * s.TotalSeconds);

                                                                // 音速を超える移動は破棄する
                                                                skip = (maxDistance < item.Location.GetDistanceTo(olditem.Location));
                                                            }
                                                            if (false == skip)
                                                            {
                                                                result.Items.Add(item);
                                                            }
                                                            olditem = item;
                                                        }

                                                        datetime = string.Empty;
                                                    }
                                                    else
                                                    {
                                                        if (!_xmlReader.IsEmptyElement)
                                                        {
                                                            while (_xmlReader.Read())
                                                            {
                                                                if (_xmlReader.NodeType == System.Xml.XmlNodeType.EndElement)
                                                                {
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                    }
                                                    continue;
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        if (!_xmlReader.IsEmptyElement)
                                        {
                                            while (_xmlReader.Read())
                                            {
                                                if (_xmlReader.NodeType == System.Xml.XmlNodeType.EndElement)
                                                {
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    continue;

                                case System.Xml.XmlNodeType.EndElement:
                                    break;

                                default:
                                    continue;
                                }
                                break;
                            }
                        }
                    }
                    break;
                }
            }

            return(result);
        }
Пример #15
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);
        }
Пример #16
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();
            }
        }
Пример #17
0
        public ExecCommandForm()
        {
            InitializeComponent();

            _item = null;
        }
Пример #18
0
        private void _splitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (1 != _locationSources.SelectedItems.Count)
            {
                return;
            }
            ListViewItem     lvItem       = _locationSources.SelectedItems[0];
            TrackItemSummary trackSummary = lvItem.Tag as TrackItemSummary;

            if (null == trackSummary)
            {
                return;
            }

            bykIFv1.TrackItem trackItem = trackSummary.TrackItem;

            trackItem.Name = trackSummary.Name;

            SplitForm sf = new SplitForm(trackItem);

            if (DialogResult.OK != sf.ShowDialog())
            {
                return;
            }

            UInt32 inserPosID  = trackSummary.ID;
            bool   blNewTracks = false;

            foreach (bykIFv1.TrackItem track in sf.Items)
            {
                if (null == track)
                {
                    continue;
                }
                if (1 > track.Items.Count)
                {
                    continue;
                }

                System.Diagnostics.Debug.Print(string.Format("create:{1} name:{0}", track.Name, track.CreateTime));

                inserPosID  = _trackItemBag.AddItem(inserPosID, track);
                blNewTracks = true;
            }

            if (blNewTracks)
            {
                // 分割されたので元データを削除します
                _trackItemBag.Remove(trackSummary.ID);

                this.UseWaitCursor = true;

                // 読み込んでいるイメージに対して再度位置情報のマッチングを実施する
                LocationMatching();

                // リストを更新する
                UpdateLocationList();

#if true
                // データが変化したので保存します。
                var task = Task.Factory.StartNew(() =>
                {
                    _trackItemBag.Save();
                }).ContinueWith(_ =>
                {
                    this.UseWaitCursor = false;
                }, TaskScheduler.FromCurrentSynchronizationContext());
#else
                _trackItemBag.Save();
                this.UseWaitCursor = false;
#endif
            }
        }
Пример #19
0
        public DownloadDataForm()
        {
            InitializeComponent();

            _item = null;
        }
Пример #20
0
        private void _exec_Click(object sender, EventArgs e)
        {
            try
            {
                _exec.Enabled        = false;
                _cancel.Enabled      = false;
                _selExecFile.Enabled = false;

                if ((0 <= _parameters.Text.IndexOf("-o")) || (0 <= _parameters.Text.IndexOf("-F")))
                {
                    _parameters.Focus();
                    MessageBox.Show(Properties.Resources.MSG1, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                this.Cursor = Cursors.WaitCursor;

                System.Diagnostics.Process p = new System.Diagnostics.Process();
                p.StartInfo.FileName = _execPath.Text;
                //出力を読み取れるようにする
                p.StartInfo.UseShellExecute        = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardInput  = false;
                p.StartInfo.RedirectStandardError  = false;
                //ウィンドウを表示しないようにする
                p.StartInfo.CreateNoWindow = true;

                // 結果をGPXとしてstdoutに出力させる(-oは出力形式 -Fは出力先[-]はstdout指定
                p.StartInfo.Arguments = string.Format("{0} -o gpx -F -", _parameters.Text);

                // stdoutを受け取る
                StringBuilder sb = new StringBuilder();
                p.OutputDataReceived += delegate(object s, System.Diagnostics.DataReceivedEventArgs dre) { sb.AppendLine(dre.Data); };

                // GPSBabelを起動する
                p.Start();

                //出力を読み取る
                p.BeginOutputReadLine();

                //プロセス終了まで待機する
                p.WaitForExit();
                p.Close();

                // stdoutの結果をgpxに読み込む
                using (MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(sb.ToString())))
                {
                    using (TextReader tr = new StreamReader(ms))
                    {
                        using (XmlReader xr = new XmlTextReader(tr))
                        {
                            using (Bayaki.TrackItemReader tir = new Bayaki.TrackItemReader(xr))
                            {
                                bykIFv1.TrackItem item = tir.Read();
                                _item = (0 < item.Items.Count) ? item : null;
                            }
                        }
                    }
                }

                // 成功していたら設定を反映させます。
                RollParamList(_parameters.Text);
                Properties.Settings.Default.GPSBabel_PATH   = _execPath.Text;
                Properties.Settings.Default.GPSBabel_Param0 = _parameters.Text;
                Properties.Settings.Default.Save();

                // 正常終了
                DialogResult = DialogResult.OK;
            }
            catch (Exception ex)
            {
                this.Cursor = Cursors.Default;

                MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                // 異常終了とする
                DialogResult = DialogResult.Cancel;
            }
            finally
            {
                _exec.Enabled        = true;
                _cancel.Enabled      = true;
                _selExecFile.Enabled = true;

                this.Cursor = Cursors.Default;
            }
        }
Пример #21
0
        public bykIFv1.TrackItem Read()
        {
            bykIFv1.TrackItem    result = null;
            List <bykIFv1.Point> points = new List <bykIFv1.Point>();

            DateTime createTime = DateTime.Now;
            string   name       = string.Empty;

            List <DateTime> wayPoints = new List <DateTime>();

            while (_xmlReader.Read())
            {
                switch (_xmlReader.NodeType)
                {
                case System.Xml.XmlNodeType.Element:
                    if (0 == string.Compare(_xmlReader.Name, "time", true))
                    {
                        string   sTime = _xmlReader.ReadString();
                        DateTime dt;
                        if (DateTime.TryParse(sTime, out dt))
                        {
                            createTime = dt;
                        }
                    }
                    else if (0 == string.Compare(_xmlReader.Name, "name", true))
                    {
                        name = _xmlReader.ReadString();
                    }
                    else if (0 == string.Compare(_xmlReader.Name, "wpt", true))
                    {
                        if (!_xmlReader.IsEmptyElement)
                        {
                            string lon = _xmlReader.GetAttribute("lon");
                            string lat = _xmlReader.GetAttribute("lat");

                            string sEle   = string.Empty;
                            string sTime  = string.Empty;
                            string sSpeed = string.Empty;

                            while (_xmlReader.Read())
                            {
                                switch (_xmlReader.NodeType)
                                {
                                case System.Xml.XmlNodeType.Element:
                                    if (0 == string.Compare(_xmlReader.Name, "ele", true))
                                    {
                                        sEle = _xmlReader.ReadString();
                                    }
                                    else if (0 == string.Compare(_xmlReader.Name, "time", true))
                                    {
                                        sTime = _xmlReader.ReadString();
                                    }
                                    else if (0 == string.Compare(_xmlReader.Name, "speed", true))
                                    {
                                        sSpeed = _xmlReader.ReadString();
                                    }
                                    else
                                    {
                                        if (!_xmlReader.IsEmptyElement)
                                        {
                                            while (_xmlReader.Read())
                                            {
                                                if (_xmlReader.NodeType == System.Xml.XmlNodeType.EndElement)
                                                {
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    continue;

                                case System.Xml.XmlNodeType.EndElement:
                                    break;

                                default:
                                    continue;
                                }
                                break;
                            }

                            DateTime dt;
                            if (DateTime.TryParse(sTime, out dt))
                            {
                                wayPoints.Add(dt);
                            }
                        }
                    }
                    else if (0 == string.Compare(_xmlReader.Name, "trkpt", true))
                    {
                        if (!_xmlReader.IsEmptyElement)
                        {
                            string lon = _xmlReader.GetAttribute("lon");
                            string lat = _xmlReader.GetAttribute("lat");

                            string sEle   = string.Empty;
                            string sTime  = string.Empty;
                            string sSpeed = string.Empty;

                            while (_xmlReader.Read())
                            {
                                switch (_xmlReader.NodeType)
                                {
                                case System.Xml.XmlNodeType.Element:
                                    if (0 == string.Compare(_xmlReader.Name, "ele", true))
                                    {
                                        sEle = _xmlReader.ReadString();
                                    }
                                    else if (0 == string.Compare(_xmlReader.Name, "time", true))
                                    {
                                        sTime = _xmlReader.ReadString();
                                    }
                                    else if (0 == string.Compare(_xmlReader.Name, "speed", true))
                                    {
                                        sSpeed = _xmlReader.ReadString();
                                    }
                                    else
                                    {
                                        if (!_xmlReader.IsEmptyElement)
                                        {
                                            while (_xmlReader.Read())
                                            {
                                                if (_xmlReader.NodeType == System.Xml.XmlNodeType.EndElement)
                                                {
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    continue;

                                case System.Xml.XmlNodeType.EndElement:
                                    break;

                                default:
                                    continue;
                                }
                                break;
                            }

                            DateTime dt;
                            if (DateTime.TryParse(sTime, out dt))
                            {
                                bool wayPoint = (0 <= wayPoints.IndexOf(dt));

                                bykIFv1.Point item = new bykIFv1.Point(dt.ToUniversalTime(), double.Parse(lat), double.Parse(lon), double.Parse(sEle), double.Parse(sSpeed), wayPoint);
                                points.Add(item);
                            }
                        }
                    }
                    break;
                }
            }

            if (0 >= name.Length)
            {
                name = "location data";
            }
            // 応答を作成しますよ
            result       = new bykIFv1.TrackItem(name, createTime);
            result.Items = points;

            return(result);
        }
Пример #22
0
        public void Write(bykIFv1.TrackItem trackItem)
        {
            _xmlWriter.WriteStartElement("gpx");
            {
                _xmlWriter.WriteAttributeString("version", "1.0");
                _xmlWriter.WriteAttributeString("creator", "Bayaki");

                _xmlWriter.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
                _xmlWriter.WriteAttributeString("schemaLocation", "http://www.w3.org/2001/XMLSchema-instance", "http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd");

                // 名前
                if (0 < trackItem.Name.Length)
                {
                    _xmlWriter.WriteElementString("name", trackItem.Name);
                }

                // 詳細
                if (0 < trackItem.Description.Length)
                {
                    _xmlWriter.WriteElementString("desc", trackItem.Description);
                }

                // 作成時間
                _xmlWriter.WriteElementString("time", trackItem.CreateTime.ToString("yyyy-MM-ddTHH:mm:ssZ"));

                _xmlWriter.WriteStartElement("bounds");
                {
                    double minlat = trackItem.Items[0].Latitude;
                    double maxlat = trackItem.Items[0].Latitude;
                    double minlon = trackItem.Items[0].Longitude;
                    double maxlon = trackItem.Items[0].Longitude;
                    foreach (bykIFv1.Point point in trackItem.Items)
                    {
                        if (point.Latitude < minlat)
                        {
                            minlat = point.Latitude;
                        }
                        if (point.Latitude < maxlat)
                        {
                            maxlat = point.Latitude;
                        }
                        if (point.Longitude < minlon)
                        {
                            minlon = point.Longitude;
                        }
                        if (point.Longitude > maxlon)
                        {
                            maxlon = point.Longitude;
                        }
                    }
                    _xmlWriter.WriteAttributeString("minlat", minlat.ToString("0.######"));
                    _xmlWriter.WriteAttributeString("minlon", minlon.ToString("0.######"));
                    _xmlWriter.WriteAttributeString("maxlat", maxlat.ToString("0.######"));
                    _xmlWriter.WriteAttributeString("maxlon", maxlon.ToString("0.######"));
                }
                _xmlWriter.WriteEndElement();

                // waypointを出力します
                int index = 0;
                foreach (bykIFv1.Point point in trackItem.Items)
                {
                    ++index;
                    if (point.Interest)
                    {
                        _xmlWriter.WriteStartElement("wpt");
                        {
                            _xmlWriter.WriteAttributeString("lat", point.Latitude.ToString("0.######"));
                            _xmlWriter.WriteAttributeString("lon", point.Longitude.ToString("0.######"));

                            if (!double.IsNaN(point.Altitude))
                            {
                                _xmlWriter.WriteElementString("ele", point.Altitude.ToString());
                            }
                            _xmlWriter.WriteElementString("time", point.Time.ToString("yyyy-MM-ddTHH:mm:ssZ"));
                            if (!double.IsNaN(point.Speed))
                            {
                                _xmlWriter.WriteElementString("speed", point.Speed.ToString("0.######"));
                            }
                            _xmlWriter.WriteElementString("name", string.Format("PT{0:D4}", index));
                        }
                        _xmlWriter.WriteEndElement();
                    }
                }

                _xmlWriter.WriteStartElement("trk");
                {
                    _xmlWriter.WriteStartElement("trkseg");
                    {
                        index = 0;
                        foreach (bykIFv1.Point point in trackItem.Items)
                        {
                            _xmlWriter.WriteStartElement("trkpt");
                            {
                                _xmlWriter.WriteAttributeString("lat", point.Latitude.ToString("0.######"));
                                _xmlWriter.WriteAttributeString("lon", point.Longitude.ToString("0.######"));

                                if (!double.IsNaN(point.Altitude))
                                {
                                    _xmlWriter.WriteElementString("ele", point.Altitude.ToString());
                                }
                                _xmlWriter.WriteElementString("time", point.Time.ToString("yyyy-MM-ddTHH:mm:ssZ"));
                                if (!double.IsNaN(point.Speed))
                                {
                                    _xmlWriter.WriteElementString("speed", point.Speed.ToString("0.######"));
                                }
                                _xmlWriter.WriteElementString("name", string.Format("PT{0:D4}", ++index));
                            }
                            _xmlWriter.WriteEndElement();
                        }
                    }
                    _xmlWriter.WriteEndElement();
                }
                _xmlWriter.WriteEndElement();
            }
            _xmlWriter.WriteEndElement();
        }