C#とDotSpatialでGeoTiff読み書き

DotSpatialを使ってGeoTiffの読み書きをするプログラムのサンプルをご紹介いたします。

準備

①DotSpatialのソースをコンパイルします。詳しくは別のページで行っていますので興味のある方はそちらをご覧ください。

 

②ビルドが終わりました。

 

Visual Studioを起動します。今回は上画像のプロジェクトを選択しました。

 

④プロジェクト名を設定後、このような画面になります。

 

コンパイルしたDotSpatialをこのプログラムで使えるように、参照の追加をします。

今回は2つ追加しました。準備はここまでです。

書き出し

上の画像のようなGeoTiffを出力するプログラムのソースを紹介します。先ほど準備したプログラムに以下のソースを張り付けて実行すると、tifが作成されます。

ソース

using System.Runtime.InteropServices;

using DotSpatial.Data;
using DotSpatial.Data.Rasters.GdalExtension;

namespace ConsoleApp1
{
    class Program
    {
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        static extern bool SetDllDirectory(string lpPathName);

        static void Main(string[] args)
        {
            // gdal等必要なdllをまとめて参照したいので
            SetDllDirectory(@"D:\DotSpatial-master\Source\bin\Debug\Windows Extensions\DotSpatial.Data.Rasters.GdalExtension\gdal\x86");

            string savefilepath = @"D:\test.tif";

            int ncol = 3; // 水平方向ピクセル数
            int nrow = 3; // 鉛直方向ピクセル数
            double nodata = -9999;
            double cellsize = 10;
            double xllcorner = 20000;
            double yllcorner = -40000;

            // https://epsg.io/6677 から
            string prj ="PROJCS[\"JGD2011 / Japan Plane Rectangular CS IX\","+
                        "GEOGCS[\"JGD2011\","+
                        "DATUM[\"Japanese_Geodetic_Datum_2011\"," +
                        "SPHEROID[\"GRS 1980\",6378137,298.257222101]," +
                        "TOWGS84[0, 0, 0, 0, 0, 0, 0]]," +
                        "PRIMEM[\"Greenwich\",0," +
                        "AUTHORITY[\"EPSG\",\"8901\"]]," +
                        "UNIT[\"degree\",0.0174532925199433," +
                        "AUTHORITY[\"EPSG\",\"9122\"]]," +
                        "AUTHORITY[\"EPSG\",\"6668\"]]," +
                        "PROJECTION[\"Transverse_Mercator\"]," +
                        "PARAMETER[\"latitude_of_origin\",36]," +
                        "PARAMETER[\"central_meridian\",139.833333333333]," +
                        "PARAMETER[\"scale_factor\",0.9999]," +
                        "PARAMETER[\"false_easting\",0]," +
                        "PARAMETER[\"false_northing\",0]," +
                        "UNIT[\"metre\",1," +
                        "AUTHORITY[\"EPSG\",\"9001\"]]," +
                        "AUTHORITY[\"EPSG\",\"6677\"]]";

            // GeoTiff書き出し
            GdalRasterProvider d = new GdalRasterProvider();
            IRaster dst = Raster.CreateRaster(savefilepath, null, ncol, nrow, 1, typeof(float), new[] { string.Empty });
            dst.NoDataValue = nodata;
            dst.ProjectionString = prj;
            dst.Bounds = new RasterBounds(nrow, ncol, new double[] { xllcorner, cellsize, 0, yllcorner, 0, -1 * cellsize });

            dst.Value[0, 0] = 32;   // H11
            dst.Value[0, 1] = 64;   // H12
            dst.Value[0, 2] = 128;  // H13
            dst.Value[1, 0] = 16;   // H21
            dst.Value[1, 1] = 0;    // H22
            dst.Value[1, 2] = 1;    // H23
            dst.Value[2, 0] = 8;    // H31
            dst.Value[2, 1] = 4;    // H32
            dst.Value[2, 2] = 2;    // H33

            dst.Save();

            return;
        }
    }
}

読み込み

先ほど書き出しのプログラムで作成したtifを読み込んで、ピクセルの値をコンソールに出力するプログラムのソースを紹介します。

ソース

using System;
using System.Runtime.InteropServices;

using DotSpatial.Data;
using DotSpatial.Data.Rasters.GdalExtension;

namespace ConsoleApp1
{
    class Program
    {
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        static extern bool SetDllDirectory(string lpPathName);

        static void Main(string[] args)
        {
            // gdal等必要なdllをまとめて参照したいので
            SetDllDirectory(@"D:\DotSpatial-master\Source\bin\Debug\Windows Extensions\DotSpatial.Data.Rasters.GdalExtension\gdal\x86");

            string loadfilepath = @"D:\test.tif";

            // GeoTiff読み込み
            GdalRasterProvider d = new GdalRasterProvider();
            IRaster src = d.Open(loadfilepath);

            int ncol = src.NumColumns;
            int nrow = src.NumRows;
            int band_num = src.NumBands;
            string prj = src.ProjectionString;
            double nodata = src.NoDataValue;

            double[] pGT = src.Bounds.AffineCoefficients;
            double xllcenter = pGT[0];
            double cellsize_x = pGT[1];
            double rotate1 = pGT[2];
            double yllcenter = pGT[3];
            double rotate2 = pGT[4];
            double cellsize_y = pGT[5];

            Console.WriteLine("H11 = " + src.Value[0, 0]);
            Console.WriteLine("H12 = " + src.Value[0, 1]);
            Console.WriteLine("H13 = " + src.Value[0, 2]);
            Console.WriteLine("H21 = " + src.Value[1, 0]);
            Console.WriteLine("H22 = " + src.Value[1, 1]);
            Console.WriteLine("H23 = " + src.Value[1, 2]);
            Console.WriteLine("H31 = " + src.Value[2, 0]);
            Console.WriteLine("H32 = " + src.Value[2, 1]);
            Console.WriteLine("H33 = " + src.Value[2, 2]);

            Console.ReadKey();
            return;
        }
    }
}


最後までご覧頂き、ありがとうございました