/// <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 = ""; }
/// <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; }
/// <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; }
/// <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; }