/// <summary> /// NMEA読み出し機能およびRectangleFieldクラスのテスト /// <para>ダイアログを利用してNMEAファイルを開きます。</para> /// <para>NMEA読み取り後に、測位結果を配列化して測位結果全体が収まるRectangleFieldオブジェクトを生成します。</para> /// <para>未測位データは除いています。</para> /// </summary> /// <returns>測位データ全体を覆う長方形領域情報</returns> public static RectangleField ReadNmeaToRectangleFeild() { NmeaReader reader = new NmeaReader(); reader.OpenWithDialog(); // NMEAファイル読み出し Blh[] pos = reader.GetPositions(); // 測位情報のうちから位置座標のみを取得 RectangleField field = new RectangleField(); foreach (Blh x in pos) // 最外領域を求める { if (x.B != 0.0 && x.L != 0.0) field.Set(x); // 未測位データは除く } return field; }
/// <summary> /// NMEA形式のGPSのログから緯度経度を抜き出し、その地点における標高値をDEMより取得する /// <para>DEMクラスの動作テストです。</para> /// <para>GPSの高度測定精度の評価目的もあります。</para> /// </summary> public static void CombineGpsAndDemHeight() { DEM dem = new DEM(); dem.AddDirWithDialog(); if (dem.Count != 0) { NmeaReader reader = new NmeaReader(); reader.OpenWithDialog(); // NMEAファイル読み出し if (reader.IsOpen) { var pos = reader.GetPositions(); // 測位情報のうちから位置座標のみを取得 var times = reader.GetDateTimes(); // 測位情報から時刻情報のみを取得 var height = dem.GetHeight(pos); StringBuilder sb = new StringBuilder(5000); // 予め大きなメモリ容量を確保しておく sb.Append("Time,Longitude,Latitude,H,DEM height").Append(System.Environment.NewLine); for (int i = 0; i < pos.Length && i < times.Length; i++) { if(pos[i].B != 0.0 && pos[i].L != 0.0) // 比較が目的なので未測位データは除く sb.Append(times[i].ToString()).Append(",").Append(pos[i].ToString()).Append(",").Append(height[i].ToString("0.0")).Append(System.Environment.NewLine); } using (System.IO.StreamWriter fwriter = new System.IO.StreamWriter("CombinedNmeaWithDem.csv", false, Encoding.UTF8)) { try { fwriter.Write(sb.ToString()); } catch { // エラー処理があれば記述 } } } } return; }
/// <summary> /// Pointクラスのテスト /// <para>NMEAファイルから測位点情報を読み出し、KMLへPoint情報として出力します。</para> /// </summary> public static void ReadNmeaToKmlPoint() { NmeaReader reader = new NmeaReader(); reader.OpenWithDialog(); // NMEAファイル読み出し if (reader.IsOpen) { Blh[] pos = reader.GetPositions(); // 測位情報のうちから位置座標のみを取得 DateTime[] times = reader.GetDateTimes(); // 測位情報から時刻情報のみを取得 if (pos.Length != 0 && times.Length != 0) { Point point = new Point(pos[0], Icon.shaded_dot); point.description = reader.FileName; point.AddDescription("0"); point.AddDescription(pos[0].ToString()); point.AddDescription(times[0].ToString()); point.Time = new KML.Time.TimeStamp(times[0]); if (pos.Length >= 1 && times.Length >= 1) { for (int i = 1; i < pos.Length && i < times.Length; i++) { if (!(pos[i].B == 0.0 && pos[i].L == 0.0)) // 未測位分は除く…最初の奴は例外(対処しようとすると結構長くなる) { Point p = new Point(pos[i]); p.description = i.ToString(); p.AddDescription(pos[i].ToString()); p.AddDescription(times[i].ToString()); p.Time = new KML.Time.TimeStamp(times[i]); point.Add(p); } } } // ファイル出力 // KML出力はUTF8で出力してください。 using (System.IO.StreamWriter fwriter = new System.IO.StreamWriter("NMEAtoPoint.kml", false, Encoding.UTF8)) { try { fwriter.Write(point.GetKmlCode()); } catch { // エラー処理があれば記述 } } } } return; }