public SplitForm(bykIFv1.TrackItem track) { InitializeComponent(); _track = track; _items = new List <bykIFv1.TrackItem>(); }
private void ExportGPX(string filePath, bykIFv1.TrackItem trackItem) { using (TrackItemWriter tiw = new TrackItemWriter(filePath)) { tiw.Write(trackItem); } }
public TrackPointPreviewForm(bykIFv1.TrackItem trackItem) { InitializeComponent(); _trackItem = trackItem; maxSpeed = 200; }
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; }
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); }
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); }
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); }
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); } } }
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(); } } }
/// <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; }
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); }
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; }
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); } }
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); }
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(); } }
public ExecCommandForm() { InitializeComponent(); _item = null; }
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 } }
public DownloadDataForm() { InitializeComponent(); _item = null; }
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; } }
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); }
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(); }