/// <summary> /// 「標高タイル」をロード /// </summary> /// <param name="tile_location">タイル座標</param> /// <param name="dem_type">対象とするDEM群</param> /// <returns>標高群</returns> public static double[,] LoadDEM(TileLocation tile_location, DEMType dem_type = DEMType.DEM_5A_5B_10B) { if (tile_location.Z > 15) { return(null); } if (tile_location.Z == 15 && !(dem_type.HasFlag(DEMType.DEM_5A) || dem_type.HasFlag(DEMType.DEM_5B) ) ) { return(null); } double[,] r = null; const string ext = ".png"; const double f = 1.0e-2; if (tile_location.Z == 15) { if (dem_type.HasFlag(DEMType.DEM_5A)) { const string id = "dem5a_png"; var uri = new Uri($"{URIPatternBase}{id}/{tile_location.Z}/{tile_location.X}/{tile_location.Y}{ext}"); r = LoadPNGNumberTileS(out var has_invalid_value, uri, f, additional_invalid_values: DEMAdditionalInvalidValue); if (!has_invalid_value) { return(r); } } if (dem_type.HasFlag(DEMType.DEM_5B)) { const string id = "dem5b_png"; var uri = new Uri($"{URIPatternBase}{id}/{tile_location.Z}/{tile_location.X}/{tile_location.Y}{ext}"); bool has_invalid_value; if (r == null) { r = LoadPNGNumberTileS(out has_invalid_value, uri, f, additional_invalid_values: DEMAdditionalInvalidValue); } else { LoadPNGNumberTileS(ref r, out has_invalid_value, uri, f, additional_invalid_values: DEMAdditionalInvalidValue); } if (!has_invalid_value) { return(r); } } } if (dem_type.HasFlag(DEMType.DEM_10B)) { const string id = "dem_png"; // over-z if (tile_location.Z == 15) { var zz = 14; var xx = tile_location.X >> 1; var yy = tile_location.Y >> 1; var uri = new Uri($"{URIPatternBase}{id}/{zz}/{xx}/{yy}{ext}"); using (var i = LoadPNGDataTile(uri)) { // trimming const int half = ArrisLength >> 1; var trim_x0 = (tile_location.X & 1) == 1 ? half : 0; var trim_y0 = (tile_location.Y & 1) == 1 ? half : 0; using (var trimmed = i.Clone(new Rectangle(trim_x0, trim_y0, half, half), i.PixelFormat)) { // scaling using (var scaled = new Bitmap(ArrisLength, ArrisLength)) { using (var g = Graphics.FromImage(scaled)) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; g.DrawImage(trimmed, 0, 0, ArrisLength, ArrisLength); } bool has_invalid_value; if (r == null) { r = LoadPNGNumberTileS(out has_invalid_value, scaled, f, additional_invalid_values: DEMAdditionalInvalidValue); } else { LoadPNGNumberTileS(ref r, out has_invalid_value, scaled, f, additional_invalid_values: DEMAdditionalInvalidValue); } if (!has_invalid_value) { return(r); } } } } } else { var uri = new Uri($"{URIPatternBase}{id}/{tile_location.Z}/{tile_location.X}/{tile_location.Y}{ext}"); r = LoadPNGNumberTileS(out var has_invalid_value, uri, f, additional_invalid_values: DEMAdditionalInvalidValue); if (!has_invalid_value) { return(r); } } } if (dem_type.HasFlag(DEMType.DEM_GM)) { const string id = "demgm_png"; const byte critical_z = 8; if (tile_location.Z > critical_z) { var dz = tile_location.Z - critical_z; var xx = tile_location.X >> dz; var yy = tile_location.Y >> dz; var uri = new Uri($"{URIPatternBase}{id}/{critical_z}/{xx}/{yy}{ext}"); using (var i = LoadPNGDataTile(uri)) { // trimming var scaled_length = ArrisLength >> dz; var dx = tile_location.X - (xx << dz); var dy = tile_location.Y - (yy << dz); var trim_x0 = scaled_length * dx; var trim_y0 = scaled_length * dy; using (var trimmed = i.Clone(new Rectangle(( int )trim_x0, ( int )trim_y0, scaled_length, scaled_length), i.PixelFormat)) { // scaling using (var scaled = new Bitmap(ArrisLength, ArrisLength)) { using (var g = Graphics.FromImage(scaled)) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; g.DrawImage(trimmed, 0, 0, ArrisLength, ArrisLength); } bool has_invalid_value; if (r == null) { r = LoadPNGNumberTileS(out has_invalid_value, scaled, f, additional_invalid_values: DEMAdditionalInvalidValue); } else { LoadPNGNumberTileS(ref r, out has_invalid_value, scaled, f, additional_invalid_values: DEMAdditionalInvalidValue); } if (!has_invalid_value) { return(r); } } } } } else { var uri = new Uri($"{URIPatternBase}{id}/{tile_location.Z}/{tile_location.X}/{tile_location.Y}{ext}"); if (r == null) { r = LoadPNGNumberTileS(out var has_invalid_value, uri, f, additional_invalid_values: DEMAdditionalInvalidValue); } else { LoadPNGNumberTileS(ref r, out var has_invalid_value, uri, f, additional_invalid_values: DEMAdditionalInvalidValue); } } } return(r); }