示例#1
0
        /* プロパティ ************************************/
        /* メソッド **************************************/
        /// <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;
        }
示例#2
0
        /// <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;
        }
示例#3
0
        /// <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;
        }
示例#4
0
        /// <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();
        }