예제 #1
0
 /// <summary>
 ///マップのインスタンスを生成しないコンストラクタ
 ///<para>DEMデータ情報について整理し、マップを管理する準備を行います。</para>
 /// </summary>
 /// <param name="fileName">ファイル名</param>
 /// <param name="info">マップ情報</param>
 /// <param name="parentFileName">親ファイル名<para>元ファイルが圧縮ファイル等であった場合に利用してください。</para></param>
 public DemSet(string fileName, Info info, string parentFileName = "")
     : base()
 {
     this.FileName = fileName;
     this.info = info;
     this.map = null;                        // メモリ空間を始めは食わせたくないので、マップのサイズはセットしない。
     this.ErrorMsg = "";
 }
예제 #2
0
        /// <summary>
        /// 指定領域でマップを作成します
        /// <para>指定領域を含むマップを結合することでマップを生成します。</para>
        /// <para>該当データが存在しない領域はfloat.NaNで埋めます。</para>
        /// </summary>
        /// <param name="field">指定領域</param>
        /// <returns>Mapオブジェクト</returns>
        public MapDem CreateMap(RectangleField field)
        {
            this.Load(field);

            //System.Diagnostics.Stopwatch sw2 = System.Diagnostics.Stopwatch.StartNew();

            Pos upperRightPos = this.GetMapAddress(field.UpperRight);
            Pos lowerLeftPos = this.GetMapAddress(field.LowerLeft);
            Pos fieldMaxIndex = upperRightPos - lowerLeftPos;                                   // マップ単位でカウントした領域サイズ - 1
            Pos mapSize = new Pos((fieldMaxIndex.x + 1) * this.amountOfMeshInMap.x,
                (fieldMaxIndex.y + 1) * this.amountOfMeshInMap.y);                              // 生成するマップのサイズを決定する
            MapDem ansMap = new MapDem(new RectangleField(this.GetFieldFromAddress(lowerLeftPos).LowerLeft,
                this.GetFieldFromAddress(upperRightPos).UpperRight), mapSize);                  // マップを生成
            ansMap.Initialize(float.NaN);                                                       // 非値で初期化することで値が存在しない領域をはっきりさせる

            //int count = 0;
            Parallel.For(lowerLeftPos.x, upperRightPos.x + 1, x =>                              // 可能なら並列処理でデータを格納する
            //for (int x = lowerLeftPos.x; x < upperRightPos.x + 1; x++)
            {
                Parallel.For(lowerLeftPos.y, upperRightPos.y + 1, y =>
                //for (int y = lowerLeftPos.y; y < upperRightPos.y + 1; y++)
                {
                    Pos address = new Pos(x, y);
                    if (this.dict.ContainsKey(address) == true)
                    {
                        if (this.dict[address].Error == false && this.dict[address].IsLoaded)
                        {
                            //count++;
                            Pos relativeAddress = new Pos(x - lowerLeftPos.x, y - lowerLeftPos.y);
                            /*
                            for (int localX = 0; localX < this.amountOfMeshInMap.x; localX++)
                            {
                                for (int localY = 0; localY < this.amountOfMeshInMap.y; localY++)
                                {
                                    int globalX = relativeAddress.x * this.amountOfMeshInMap.x + localX;
                                    int globalY = (fieldMaxIndex.y - relativeAddress.y) * this.amountOfMeshInMap.y + localY;
                                    ansMap[globalX, globalY] = this.dict[address].DemMap[localX, localY];
                                }
                            }
                            */
                            Parallel.For(0, this.amountOfMeshInMap.x, localX =>
                            {
                                Parallel.For(0, this.amountOfMeshInMap.y, localY =>
                                {
                                    int globalX = relativeAddress.x * this.amountOfMeshInMap.x + localX;
                                    int globalY = (fieldMaxIndex.y - relativeAddress.y) * this.amountOfMeshInMap.y + localY;
                                    ansMap[globalX, globalY] = this.dict[address].map[localX, localY];
                                });
                            });
                        }
                    }
                });
            });

            //sw2.Stop();                                                             // ストップウォッチを止める
            //Console.WriteLine("マップの統合にかけた処理時間: " + sw2.Elapsed);    // 結果を表示する
            //Console.WriteLine("マップの結合数: " + count.ToString());
            return ansMap;
        }
예제 #3
0
 /// <summary>
 /// 引数のマップ情報を利用してマップを読み込む
 /// </summary>
 /// <param name="fileName">ファイル名</param>
 /// <param name="info">ファイルに含まれているDEMの情報</param>
 /// <returns>マップのインスタンス</returns>
 public MapDem ReadMap(string fileName, Info info)
 {
     // マップ情報を読み出す
     float[,] height = null;
     switch (info.MapModel)
     {
         case Model.JPGIS2x_GML:
             JpgisGmlReader reader = new JpgisGmlReader();
             height = reader.GetValues(fileName, info.Size);
             break;
     }
     MapDem map = null;
     if (height != null)
     {
         map = new MapDem(info.Field);
         map.SetMapData(height);
     }
     return map;
 }
예제 #4
0
        /// <summary>
        /// DEM数値情報をメモリに読み出します
        /// <para>読み込み済みの場合は無視されます。</para>
        /// </summary>
        /// <returns>読み込みに成功するとtrueを返します。</returns>
        public Boolean Load()
        {
            Boolean result = false;

            if (this.IsLoaded == false)
            {
                Reader.Reader reader = new Reader.Reader();
                this.map = reader.ReadMap(this.FileName, this.info);
                if (map != null)
                    result = true;
                else
                    this.ErrorMsg = "マップの読み込みに失敗しました。ファイルが存在しない・ロックされている・壊れているのいずれかが考えられます。";
            }
            return result;
        }