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; } } }
最後までご覧頂き、ありがとうございました