/* プロパティ ************************************/ /* メソッド **************************************/ /// <summary> /// 文字列を解析して、そこに含まれる1エポック分の測位情報を返す /// </summary> /// <param name="line">被解析文字列</param> /// <returns>測位情報の解析データ<para>null: 解析不可能であった場合</para></returns> public PositioningInfo Parse(string line) { Match m = this.regexGroup.Match(line); // マッチチェック if (m.Success) { Blh pos = new Blh(); // 初期値は全て0になっている PositioningInfo ans = new PositioningInfo(); int day = int.Parse(m.Groups["day"].Value); int month = int.Parse(m.Groups["month"].Value); int year = int.Parse(m.Groups["year"].Value); int hour = int.Parse(m.Groups["hour"].Value); int min = int.Parse(m.Groups["min"].Value); int sec = int.Parse(m.Groups["sec"].Value); ans.Time = new DateTime(year, month, day, hour, min, sec); pos.B = double.Parse(m.Groups["lat"].Value); pos.L = double.Parse(m.Groups["lon"].Value); pos.H = double.Parse(m.Groups["height"].Value); ans.Position = pos; return ans; } else return null; }
/// <summary> /// GPGGAをトリガにして、タイミングごとにまとめた測位情報を返す /// <para>NMEAはセンテンスの出力順序を規定していないので、もしかすると時刻と測位位置がずれるかもしれない。</para> /// </summary> /// <returns>測位情報履歴</returns> public PositioningInfos GetPositioningResults() { PositioningInfos ans = new PositioningInfos(); PositioningInfo pos = new PositioningInfo(); if (this.IsOpen) { for (int i = 0; i < this.text.Length; i++) { string line = this.text[i]; // 1行分データを取得 string[] field = line.Split(','); // スプリットでカンマを使って区切る if (GGA.CheckMatch(line)) { pos = GGA.Parse(line); ans.Add(pos); } else if (ZDA.CheckMatch(line)) { pos.Time = ZDA.Parse(line); } } } return ans; }
/// <summary> /// GGAを解析して、測位情報を返す /// <para>現時点では緯度と経度と楕円体高しか返していないんだけど・・・</para> /// </summary> /// <param name="str">解析文字列</param> /// <returns></returns> public static PositioningInfo Parse(string str) { Blh pos = new Blh(); // 初期値は全て0になっている PositioningInfo ans = new PositioningInfo(); Match m = GGA.regexGroup.Match(str); // マッチチェック if (m.Success) { string clock = m.Groups["clock"].Value; string lat = m.Groups["lat"].Value; string lon = m.Groups["lon"].Value; string alt_MSL = m.Groups["Alt_MSL"].Value; string alt_Geoid = m.Groups["Alt_Geoid"].Value; // 緯度経度と高度を取得する double _lat = 0.0, _lon = 0.0; if (lat != "") _lat = double.Parse(lat); if (_lat != 0.0) _lat = (double)((int)(_lat / 100.0d)) + (_lat % 100.0) / 60.0d; // 単位を度へ変換する pos.B = _lat; if (m.Groups["NorS"].Value == "S") pos.B = -pos.B; // 南緯は負数とする if (lon != "") _lon = double.Parse(lon); if (_lon != 0.0) _lon = (double)((int)(_lon / 100.0d)) + (_lon % 100.0) / 60.0d; pos.L = _lon; if (m.Groups["EorW"].Value == "W") pos.L = -pos.L; // 西経は負数とする if (alt_MSL != "" && alt_Geoid != "") pos.H = double.Parse(alt_MSL) + double.Parse(alt_Geoid);// 平均海水面高とジオイド高を足して楕円体高とする } ans.Position = pos; return ans; }
/// <summary> /// ZDAから時刻データ列のみを取得する /// GGAのトリガはないのでGetPositioningResults()とは時刻がずれる可能性がある。 /// 日付も考慮してみる。 /// </summary> /// <returns>測位情報履歴に含まれる時刻情報を配列にしたもの</returns> public DateTime[] GetDateTimes() { PositioningInfos ans = new PositioningInfos(); if (this.IsOpen) { for (int i = 0; i < this.text.Length; i++) { string line = this.text[i]; // 1行分データを取得 string[] field = line.Split(','); // スプリットでカンマを使って区切る if (field[0] == "$GPZDA") { PositioningInfo pos = new PositioningInfo(); DateTime time = ZDA.Parse(line); pos.Time = time; ans.Add(pos); } } } return ans.GetTimes(); }