예제 #1
0
        /// <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);
        }