Exemple #1
0
 /// <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;
 }