/// <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; }
/* [2012/5/12] 更新後は動作未確認 */ /// <summary> /// ログを全走査し、2つ以上のログが存在した場合に、ログを覆う長方形領域を返す /// </summary> /// <returns> /// 領域情報またはnull /// <para>領域を構成できない場合はnullを返します。</para> /// </returns> public RectangleField GetRectangleField() { RectangleField field = new RectangleField(); if (this.data.Count >= 2) // 領域は2点以上なければ指定できない { foreach (PositioningInfo pos in this.data) { field.Set(pos.Position); } return field; } else { return null; } }
/// <summary> /// 領域を指定マージン[km]にて拡張した領域を返します /// <para>非破壊的メソッド</para> /// <para>経度方向は高緯度に合わせ、緯度方向は低緯度に合わせて拡張します。</para> /// </summary> /// <param name="marginKm">マージン[km]<para>負値の場合は処理を行いません。</para></param> /// <returns>拡張済みのオブジェクト<para>引数のmarginが負値の場合はnullを返します。</para></returns> public RectangleField Extend(double marginKm) { RectangleField ans = null; if (marginKm > 0) { ans = new RectangleField(this); Blh highLat, lowLat; if (Math.Abs(this.LowerLeft.B) > Math.Abs(this.UpperLeft.B)) { highLat = this.LowerLeft; lowLat = this.UpperLeft; } else { highLat = this.UpperLeft; lowLat = this.LowerLeft; } double n = marginKm * 1000.0 / lowLat.GetUnitLengthForEN().N; // 緯度が低い方が緯度方向の単位距離が短い double e = marginKm * 1000.0 / highLat.GetUnitLengthForEN().E; // 緯度が高い方が経度方向の単位距離は短い Blh pad = new Blh(n, e); ans.Set(this.UpperRight + pad); ans.Set(this.LowerLeft - pad); } return ans; }