基于GDAL的栅格图像读写与转换——C#语言版

转载自GDAL官方帮助文档的代码

准备文件
编译好的gdal核心库gdal180.dll以及C#封装库gdal_wrap.dll、gdal_csharp.dll

引用说明
1. 将gdal180.dll、gdal_wrap.dll、 gdal_csharp.dll拷贝到程序的生成目录,并在项目里添加对gdal_csharp.dll库的引用。

2. 在要使用gdal的文件头部加上如下命名空间的声明:using OSGeo.GDAL;

/******************************************************************************
 * $Id$
 *
 * Name:     GDALRead.cs
 * Project:  GDAL CSharp Interface
 * Purpose:  A sample app to read GDAL raster data.
 * Author:   Tamas Szekeres, szekerest@gmail.com
 *
 ******************************************************************************
 * Copyright (c) 2007, Tamas Szekeres
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *****************************************************************************/

using System;
using System.Drawing;
using System.Drawing.Imaging;

using OSGeo.GDAL;


/**

 * <p>Title: GDAL C# GDALRead example.</p>
 * <p>Description: A sample app to read GDAL raster data.</p>
 * @author Tamas Szekeres (szekerest@gmail.com)
 * @version 1.0
 */



/// <summary>
/// A C# based sample to read GDAL raster data.
/// </summary>

class GDALRead {
       
        public static void usage() 

        { 
                Console.WriteLine("usage: gdalread {GDAL dataset name} {output file name} {overview}");
                System.Environment.Exit(-1);
        }
 
    public static void Main(string[] args) 
    {
        int iOverview = -1;
        if (args.Length < 2) usage();
        if (args.Length == 3) iOverview = int.Parse(args[2]);

        // Using early initialization of System.Console
        Console.WriteLine("");

        try 
        {
            /* -------------------------------------------------------------------- */
            /*      Register driver(s).                                             */
            /* -------------------------------------------------------------------- */
            Gdal.AllRegister();

            /* -------------------------------------------------------------------- */
            /*      Open dataset.                                                   */
            /* -------------------------------------------------------------------- */
            Dataset ds = Gdal.Open( args[0], Access.GA_ReadOnly );
               
            if (ds == null) 
            {
                Console.WriteLine("Can't open " + args[0]);
                System.Environment.Exit(-1);
            }

            Console.WriteLine("Raster dataset parameters:");
            Console.WriteLine("  Projection: " + ds.GetProjectionRef());
            Console.WriteLine("  RasterCount: " + ds.RasterCount);
            Console.WriteLine("  RasterSize (" + ds.RasterXSize + "," + ds.RasterYSize + ")");
           
            /* -------------------------------------------------------------------- */
            /*      Get driver                                                      */
            /* -------------------------------------------------------------------- */ 
            Driver drv = ds.GetDriver();

            if (drv == null) 
            {
                Console.WriteLine("Can't get driver.");
                System.Environment.Exit(-1);
            }
           
            Console.WriteLine("Using driver " + drv.LongName);

            /* -------------------------------------------------------------------- */
            /*      Get raster band                                                 */
            /* -------------------------------------------------------------------- */
            for (int iBand = 1; iBand <= ds.RasterCount; iBand++) 
            {
                Band band = ds.GetRasterBand(iBand);
                Console.WriteLine("Band " + iBand + " :");
                Console.WriteLine("   DataType: " + band.DataType);
                Console.WriteLine("   Size (" + band.XSize + "," + band.YSize + ")");
                Console.WriteLine("   PaletteInterp: " + band.GetRasterColorInterpretation().ToString());

                for (int iOver = 0; iOver < band.GetOverviewCount(); iOver++)
                {
                    Band over = band.GetOverview(iOver);
                    Console.WriteLine("      OverView " + iOver + " :");
                    Console.WriteLine("         DataType: " + over.DataType);
                    Console.WriteLine("         Size (" + over.XSize + "," + over.YSize + ")");
                    Console.WriteLine("         PaletteInterp: " + over.GetRasterColorInterpretation().ToString());
                }
            }

            /* -------------------------------------------------------------------- */
            /*      Processing the raster                                           */
            /* -------------------------------------------------------------------- */
            SaveBitmapBuffered(ds, args[1], iOverview);
           
        }
        catch (Exception e) 
        {
            Console.WriteLine("Application error: " + e.Message);
        }
    }

    private static void SaveBitmapBuffered(Dataset ds, string filename, int iOverview) 
    {
        // Get the GDAL Band objects from the Dataset
        Band redBand = ds.GetRasterBand(1);
       
                if (redBand.GetRasterColorInterpretation() == ColorInterp.GCI_PaletteIndex)
                {
                        SaveBitmapPaletteBuffered(ds, filename, iOverview);
                        return;
                }

                if (redBand.GetRasterColorInterpretation() == ColorInterp.GCI_GrayIndex)
                {
                        SaveBitmapGrayBuffered(ds, filename, iOverview);
                        return;
                }

                if (redBand.GetRasterColorInterpretation() != ColorInterp.GCI_RedBand)
                {
            Console.WriteLine("Non RGB images are not supported by this sample! ColorInterp = " + 
                redBand.GetRasterColorInterpretation().ToString());
                        return;
                }

                if (ds.RasterCount < 3) 
                {
                        Console.WriteLine("The number of the raster bands is not enough to run this sample");
                        System.Environment.Exit(-1);
                }

        if (iOverview >= 0 && redBand.GetOverviewCount() > iOverview) 
            redBand = redBand.GetOverview(iOverview);

        Band greenBand = ds.GetRasterBand(2);
       
                if (greenBand.GetRasterColorInterpretation() != ColorInterp.GCI_GreenBand)
                {
            Console.WriteLine("Non RGB images are not supported by this sample! ColorInterp = " + 
                greenBand.GetRasterColorInterpretation().ToString());
                        return;
                }

        if (iOverview >= 0 && greenBand.GetOverviewCount() > iOverview) 
            greenBand = greenBand.GetOverview(iOverview);

        Band blueBand = ds.GetRasterBand(3);
       
                if (blueBand.GetRasterColorInterpretation() != ColorInterp.GCI_BlueBand)
                {
            Console.WriteLine("Non RGB images are not supported by this sample! ColorInterp = " + 
                blueBand.GetRasterColorInterpretation().ToString());
                        return;
                }

        if (iOverview >= 0 && blueBand.GetOverviewCount() > iOverview) 
            blueBand = blueBand.GetOverview(iOverview);

        // Get the width and height of the raster
        int width = redBand.XSize;
        int height = redBand.YSize;

        // Create a Bitmap to store the GDAL image in
        Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppRgb);

        DateTime start = DateTime.Now;
       
        byte[] r = new byte[width * height];
        byte[] g = new byte[width * height];
        byte[] b = new byte[width * height];

        redBand.ReadRaster(0, 0, width, height, r, width, height, 0, 0);
        greenBand.ReadRaster(0, 0, width, height, g, width, height, 0, 0);
        blueBand.ReadRaster(0, 0, width, height, b, width, height, 0, 0);
        TimeSpan renderTime = DateTime.Now - start;
        Console.WriteLine("SaveBitmapBuffered fetch time: " + renderTime.TotalMilliseconds + " ms");

        int i, j;
        for (i = 0; i< width; i++) 
        {
            for (j=0; j<height; j++)
            {
                Color newColor = Color.FromArgb(Convert.ToInt32(r[i+j*width]),Convert.ToInt32(g[i+j*width]), Convert.ToInt32(b[i+j*width]));
                bitmap.SetPixel(i, j, newColor);
            }
        }

        bitmap.Save(filename);
    }

        private static void SaveBitmapPaletteBuffered(Dataset ds, string filename, int iOverview) 
        {
                // Get the GDAL Band objects from the Dataset
                Band band = ds.GetRasterBand(1);
        if (iOverview >= 0 && band.GetOverviewCount() > iOverview) 
            band = band.GetOverview(iOverview);

                ColorTable ct = band.GetRasterColorTable();
                if (ct == null)
                {
                        Console.WriteLine("   Band has no color table!");
                        return;
                }

                if (ct.GetPaletteInterpretation() != PaletteInterp.GPI_RGB)
                {
                        Console.WriteLine("   Only RGB palette interp is supported by this sample!");
                        return;
                }

                // Get the width and height of the Dataset
        int width = band.XSize;
        int height = band.YSize;

                // Create a Bitmap to store the GDAL image in
                Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppRgb);

                DateTime start = DateTime.Now;
       
                byte[] r = new byte[width * height];
               
                band.ReadRaster(0, 0, width, height, r, width, height, 0, 0);
                TimeSpan renderTime = DateTime.Now - start;
                Console.WriteLine("SaveBitmapBuffered fetch time: " + renderTime.TotalMilliseconds + " ms");

                int i, j;
                for (i = 0; i< width; i++) 
                {
                        for (j=0; j<height; j++)
                        {
                                ColorEntry entry = ct.GetColorEntry(r[i+j*width]);
                                Color newColor = Color.FromArgb(Convert.ToInt32(entry.c1),Convert.ToInt32(entry.c2), Convert.ToInt32(entry.c3));
                                bitmap.SetPixel(i, j, newColor);
                        }
                }

                bitmap.Save(filename);
        }

        private static void SaveBitmapGrayBuffered(Dataset ds, string filename, int iOverview) 
        {
                // Get the GDAL Band objects from the Dataset
                Band band = ds.GetRasterBand(1);
        if (iOverview >= 0 && band.GetOverviewCount() > iOverview) 
            band = band.GetOverview(iOverview);

                // Get the width and height of the Dataset
                int width = band.XSize;
        int height = band.YSize;

                // Create a Bitmap to store the GDAL image in
                Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppRgb);

                DateTime start = DateTime.Now;
       
                byte[] r = new byte[width * height];
               
                band.ReadRaster(0, 0, width, height, r, width, height, 0, 0);
                TimeSpan renderTime = DateTime.Now - start;
                Console.WriteLine("SaveBitmapBuffered fetch time: " + renderTime.TotalMilliseconds + " ms");

                int i, j;
                for (i = 0; i< width; i++) 
                {
                        for (j=0; j<height; j++)
                        {
                                Color newColor = Color.FromArgb(Convert.ToInt32(r[i+j*width]),Convert.ToInt32(r[i+j*width]), Convert.ToInt32(r[i+j*width]));
                                bitmap.SetPixel(i, j, newColor);
                        }
                }

                bitmap.Save(filename);
        }
}

Line	 
1
/******************************************************************************
2
 * $Id$
3
 *
4
 * Name:     GDALWrite.cs
5
 * Project:  GDAL CSharp Interface
6
 * Purpose:   sample app to write a GDAL raster.
7
 * Author:   Tamas Szekeres, szekerest@gmail.com
8
 *
9
 ******************************************************************************
10
 * Copyright (c) 2007, Tamas Szekeres
11
 *
12
 * Permission is hereby granted, free of charge, to any person obtaining a
13
 * copy of this software and associated documentation files (the "Software"),
14
 * to deal in the Software without restriction, including without limitation
15
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16
 * and/or sell copies of the Software, and to permit persons to whom the
17
 * Software is furnished to do so, subject to the following conditions:
18
 *
19
 * The above copyright notice and this permission notice shall be included
20
 * in all copies or substantial portions of the Software.
21
 *
22
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28
 * DEALINGS IN THE SOFTWARE.
29
 *****************************************************************************/
30

31
using System;
32

33
using OSGeo.GDAL;
34

35

36
/**
37
 * <p>Title: GDAL C# GDALWrite example.</p>
38
 * <p>Description: A sample app to write a GDAL raster.</p>
39
 * @author Tamas Szekeres (szekerest@gmail.com)
40
 * @version 1.0
41
 */
42

43

44

45
/// <summary>
46
/// A C# based sample to write a GDAL raster.
47
/// </summary>
48

49
class GDALWrite {
50
       
51
        public static void usage() 
52

53
        { 
54
                Console.WriteLine("usage: gdalwrite {dataset name} {width} {height}");
55
                System.Environment.Exit(-1);
56
        }
57
 
58
    public static void Main(string[] args) 
59
    {
60

61
        if (args.Length < 1) usage();
62

63
        // Using early initialization of System.Console
64
        Console.WriteLine("Writing sample: " + args[0]);
65

66
        int bXSize, bYSize;
67
        int w, h;
68

69
        w = 100;
70
        h = 100;
71

72
        if (args.Length > 1)
73
            w = int.Parse(args[1]);
74

75
        if (args.Length > 2)
76
            h = int.Parse(args[2]);
77

78
        bXSize = w;
79
        bYSize = 1;
80

81
        //try
82
        {
83
            /* -------------------------------------------------------------------- */
84
            /*      Register driver(s).                                             */
85
            /* -------------------------------------------------------------------- */
86
            Gdal.AllRegister();
87
           
88
            /* -------------------------------------------------------------------- */
89
            /*      Get driver                                                      */
90
            /* -------------------------------------------------------------------- */ 
91
            Driver drv = Gdal.GetDriverByName("GTiff");
92

93
            if (drv == null) 
94
            {
95
                Console.WriteLine("Can't get driver.");
96
                System.Environment.Exit(-1);
97
            }
98
           
99
            Console.WriteLine("Using driver " + drv.LongName);
100

101
            /* -------------------------------------------------------------------- */
102
            /*      Open dataset.                                                   */
103
            /* -------------------------------------------------------------------- */
104
            string[] options = new string [] {"BLOCKXSIZE=" + bXSize, "BLOCKYSIZE=" + bYSize};
105
            Dataset ds = drv.Create(args[0], w, h, 1, DataType.GDT_Byte, options);
106
               
107
            if (ds == null) 
108
            {
109
                Console.WriteLine("Can't open " + args[0]);
110
                System.Environment.Exit(-1);
111
            }
112

113
            /* -------------------------------------------------------------------- */
114
            /*      Setting corner GCPs.                                            */
115
            /* -------------------------------------------------------------------- */
116
            GCP[] GCPs = new GCP[] { 
117
                new GCP(44.5, 27.5, 0, 0, 0, "info0", "id0"),
118
                new GCP(45.5, 27.5, 0, 100, 0, "info1", "id1"),
119
                new GCP(44.5, 26.5, 0, 0, 100, "info2", "id2"),
120
                new GCP(45.5, 26.5, 0, 100, 100, "info3", "id3")
121
            };
122
            ds.SetGCPs(GCPs, "");
123

124
            Band ba = ds.GetRasterBand(1);
125

126
            byte [] buffer = new byte [w * h];
127

128
            for (int i = 0; i < w; i++)
129
            {
130
                for (int j = 0; j < h; j++)
131
                {
132
                    buffer[i * w + j] = (byte)(i * 256 / w);
133
                }
134
            }
135

136
            ba.WriteRaster(0, 0, w, h, buffer, w, h, 0, 0);
137

138
            ba.FlushCache();
139
            ds.FlushCache();
140

141
        }
142
        /*catch (Exception e)
143
        {
144
            Console.WriteLine("Application error: " + e.Message);
145
        }*/
146
    }
147
}

Line	 
1
/******************************************************************************
2
 * $Id$
3
 *
4
 * Name:     GDALReadDirect.cs
5
 * Project:  GDAL CSharp Interface
6
 * Purpose:  A sample app to read GDAL raster data directly to a C# bitmap.
7
 * Author:   Tamas Szekeres, szekerest@gmail.com
8
 *
9
 ******************************************************************************
10
 * Copyright (c) 2007, Tamas Szekeres
11
 *
12
 * Permission is hereby granted, free of charge, to any person obtaining a
13
 * copy of this software and associated documentation files (the "Software"),
14
 * to deal in the Software without restriction, including without limitation
15
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16
 * and/or sell copies of the Software, and to permit persons to whom the
17
 * Software is furnished to do so, subject to the following conditions:
18
 *
19
 * The above copyright notice and this permission notice shall be included
20
 * in all copies or substantial portions of the Software.
21
 *
22
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28
 * DEALINGS IN THE SOFTWARE.
29
 *****************************************************************************/
30

31
using System;
32
using System.Drawing;
33
using System.Drawing.Imaging;
34

35
using OSGeo.GDAL;
36

37

38
/**
39

40
 * <p>Title: GDAL C# GDALRead example.</p>
41
 * <p>Description: A sample app to read GDAL raster data directly to a C# bitmap.</p>
42
 * @author Tamas Szekeres (szekerest@gmail.com)
43
 * @version 1.0
44
 */
45

46

47

48
/// <summary>
49
/// A C# based sample to read GDAL raster data directly to a C# bitmap.
50
/// </summary>
51

52
class GDALReadDirect {
53
       
54
        public static void usage() 
55

56
        { 
57
                Console.WriteLine("usage: gdalread {GDAL dataset name} {output file name} {overview}");
58
                System.Environment.Exit(-1);
59
        }
60
 
61
    public static void Main(string[] args) 
62
    {
63

64
        int iOverview = -1;
65
        if (args.Length < 2) usage();
66
        if (args.Length == 3) iOverview = int.Parse(args[2]);
67

68
        // Using early initialization of System.Console
69
        Console.WriteLine("");
70

71
        try 
72
        {
73
            /* -------------------------------------------------------------------- */
74
            /*      Register driver(s).                                             */
75
            /* -------------------------------------------------------------------- */
76
            Gdal.AllRegister();
77

78
            /* -------------------------------------------------------------------- */
79
            /*      Open dataset.                                                   */
80
            /* -------------------------------------------------------------------- */
81
            Dataset ds = Gdal.Open( args[0], Access.GA_ReadOnly );
82
               
83
            if (ds == null) 
84
            {
85
                Console.WriteLine("Can't open " + args[0]);
86
                System.Environment.Exit(-1);
87
            }
88

89
            Console.WriteLine("Raster dataset parameters:");
90
            Console.WriteLine("  Projection: " + ds.GetProjectionRef());
91
            Console.WriteLine("  RasterCount: " + ds.RasterCount);
92
            Console.WriteLine("  RasterSize (" + ds.RasterXSize + "," + ds.RasterYSize + ")");
93
           
94
            /* -------------------------------------------------------------------- */
95
            /*      Get driver                                                      */
96
            /* -------------------------------------------------------------------- */ 
97
            Driver drv = ds.GetDriver();
98

99
            if (drv == null) 
100
            {
101
                Console.WriteLine("Can't get driver.");
102
                System.Environment.Exit(-1);
103
            }
104
           
105
            Console.WriteLine("Using driver " + drv.LongName);
106

107
            /* -------------------------------------------------------------------- */
108
            /*      Get raster band                                                 */
109
            /* -------------------------------------------------------------------- */
110
            for (int iBand = 1; iBand <= ds.RasterCount; iBand++) 
111
            {
112
                Band band = ds.GetRasterBand(iBand);
113
                Console.WriteLine("Band " + iBand + " :");
114
                Console.WriteLine("   DataType: " + band.DataType);
115
                Console.WriteLine("   Size (" + band.XSize + "," + band.YSize + ")");
116
                Console.WriteLine("   PaletteInterp: " + band.GetRasterColorInterpretation().ToString());
117

118
                for (int iOver = 0; iOver < band.GetOverviewCount(); iOver++)
119
                {
120
                    Band over = band.GetOverview(iOver);
121
                    Console.WriteLine("      OverView " + iOver + " :");
122
                    Console.WriteLine("         DataType: " + over.DataType);
123
                    Console.WriteLine("         Size (" + over.XSize + "," + over.YSize + ")");
124
                    Console.WriteLine("         PaletteInterp: " + over.GetRasterColorInterpretation().ToString());
125
                }
126
            }
127

128
            /* -------------------------------------------------------------------- */
129
            /*      Processing the raster                                           */
130
            /* -------------------------------------------------------------------- */
131
            SaveBitmapDirect(ds, args[1], iOverview);
132
           
133
        }
134
        catch (Exception e)
135
        {
136
            Console.WriteLine("Application error: " + e.Message);
137
        }
138
    }
139

140
    private static void SaveBitmapDirect(Dataset ds, string filename, int iOverview) 
141
    {
142
        // Get the GDAL Band objects from the Dataset
143
        Band redBand = ds.GetRasterBand(1);
144

145
        if (redBand.GetRasterColorInterpretation() == ColorInterp.GCI_PaletteIndex)
146
        {
147
            SaveBitmapPaletteDirect(ds, filename, iOverview);
148
            return;
149
        }
150

151
        if (redBand.GetRasterColorInterpretation() == ColorInterp.GCI_GrayIndex)
152
        {
153
            SaveBitmapGrayDirect(ds, filename, iOverview);
154
            return;
155
        }
156

157
        if (ds.RasterCount < 3) 
158
        {
159
            Console.WriteLine("The number of the raster bands is not enough to run this sample");
160
            System.Environment.Exit(-1);
161
        }
162

163
        if (iOverview >= 0 && redBand.GetOverviewCount() > iOverview) 
164
            redBand = redBand.GetOverview(iOverview);
165

166
        Band greenBand = ds.GetRasterBand(2);
167

168
        if (iOverview >= 0 && greenBand.GetOverviewCount() > iOverview) 
169
            greenBand = greenBand.GetOverview(iOverview);
170

171
        Band blueBand = ds.GetRasterBand(3);
172

173
        if (iOverview >= 0 && blueBand.GetOverviewCount() > iOverview) 
174
            blueBand = blueBand.GetOverview(iOverview);
175

176
        // Get the width and height of the Dataset
177
        int width = redBand.XSize;
178
        int height = redBand.YSize;
179

180
        // Create a Bitmap to store the GDAL image in
181
        Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppRgb);
182

183
        DateTime start = DateTime.Now;
184
       
185
        // Use GDAL raster reading methods to read the image data directly into the Bitmap
186
        BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
187

188
        try 
189
        {
190
            int stride = bitmapData.Stride;
191
            IntPtr buf = bitmapData.Scan0;
192

193
            blueBand.ReadRaster(0, 0, width, height, buf, width, height, DataType.GDT_Byte, 4, stride);
194
            greenBand.ReadRaster(0, 0, width, height, new IntPtr(buf.ToInt32()+1), width, height, DataType.GDT_Byte, 4, stride);
195
            redBand.ReadRaster(0, 0, width, height, new IntPtr(buf.ToInt32()+2), width, height, DataType.GDT_Byte, 4, stride);
196
            TimeSpan renderTime = DateTime.Now - start;
197
            Console.WriteLine("SaveBitmapDirect fetch time: " + renderTime.TotalMilliseconds + " ms");
198
        }
199
        finally 
200
        {
201
            bitmap.UnlockBits(bitmapData);
202
        }
203

204
        bitmap.Save(filename);
205
    }
206

207
    private static void SaveBitmapPaletteDirect(Dataset ds, string filename, int iOverview) 
208
    {
209
        // Get the GDAL Band objects from the Dataset
210
        Band band = ds.GetRasterBand(1);
211
        if (iOverview >= 0 && band.GetOverviewCount() > iOverview) 
212
            band = band.GetOverview(iOverview);
213

214
        ColorTable ct = band.GetRasterColorTable();
215
        if (ct == null)
216
        {
217
            Console.WriteLine("   Band has no color table!");
218
            return;
219
        }
220

221
        if (ct.GetPaletteInterpretation() != PaletteInterp.GPI_RGB)
222
        {
223
            Console.WriteLine("   Only RGB palette interp is supported by this sample!");
224
            return;
225
        }
226

227
        // Get the width and height of the Dataset
228
        int width = band.XSize;
229
        int height = band.YSize;
230

231
        // Create a Bitmap to store the GDAL image in
232
        Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
233

234
        DateTime start = DateTime.Now;
235
       
236
        byte[] r = new byte[width * height];
237
               
238
        band.ReadRaster(0, 0, width, height, r, width, height, 0, 0);
239
        // Use GDAL raster reading methods to read the image data directly into the Bitmap
240
        BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);
241

242
        try 
243
        {
244
            int iCol = ct.GetCount();
245
            ColorPalette pal = bitmap.Palette;
246
            for (int i = 0; i < iCol; i++)
247
            {
248
                ColorEntry ce = ct.GetColorEntry(i);
249
                pal.Entries[i] = Color.FromArgb(ce.c4, ce.c1, ce.c2, ce.c3);
250
            }
251
            bitmap.Palette = pal;
252
           
253
            int stride = bitmapData.Stride;
254
            IntPtr buf = bitmapData.Scan0;
255

256
            band.ReadRaster(0, 0, width, height, buf, width, height, DataType.GDT_Byte, 1, stride);
257
            TimeSpan renderTime = DateTime.Now - start;
258
            Console.WriteLine("SaveBitmapDirect fetch time: " + renderTime.TotalMilliseconds + " ms");
259
        }
260
        finally 
261
        {
262
            bitmap.UnlockBits(bitmapData);
263
        }
264

265
        bitmap.Save(filename);
266
    }
267

268
    private static void SaveBitmapGrayDirect(Dataset ds, string filename, int iOverview) 
269
    {
270
        // Get the GDAL Band objects from the Dataset
271
        Band band = ds.GetRasterBand(1);
272
        if (iOverview >= 0 && band.GetOverviewCount() > iOverview) 
273
            band = band.GetOverview(iOverview);
274

275
        // Get the width and height of the Dataset
276
        int width = band.XSize;
277
        int height = band.YSize;
278

279
        // Create a Bitmap to store the GDAL image in
280
        Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
281

282
        DateTime start = DateTime.Now;
283
       
284
        byte[] r = new byte[width * height];
285
               
286
        band.ReadRaster(0, 0, width, height, r, width, height, 0, 0);
287
        // Use GDAL raster reading methods to read the image data directly into the Bitmap
288
        BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);
289

290
        try 
291
        {
292
            ColorPalette pal = bitmap.Palette; 
293
            for(int i = 0; i < 256; i++) 
294
                pal.Entries[i] = Color.FromArgb( 255, i, i, i ); 
295
            bitmap.Palette = pal;
296
           
297
            int stride = bitmapData.Stride;
298
            IntPtr buf = bitmapData.Scan0;
299

300
            band.ReadRaster(0, 0, width, height, buf, width, height, DataType.GDT_Byte, 1, stride);
301
            TimeSpan renderTime = DateTime.Now - start;
302
            Console.WriteLine("SaveBitmapDirect fetch time: " + renderTime.TotalMilliseconds + " ms");
303
        }
304
        finally 
305
        {
306
            bitmap.UnlockBits(bitmapData);
307
        }
308

309
        bitmap.Save(filename);
310
    }
311
}

Line	 
1
/******************************************************************************
2
 * $Id$
3
 *
4
 * Name:     createdata.cs
5
 * Project:  GDAL CSharp Interface
6
 * Purpose:  A sample app to create a spatial data source and a layer.
7
 * Author:   Tamas Szekeres, szekerest@gmail.com
8
 *
9
 ******************************************************************************
10
 * Copyright (c) 2007, Tamas Szekeres
11
 * Copyright (c) 2009-2010, Even Rouault <even dot rouault at mines-paris dot org>
12
 *
13
 * Permission is hereby granted, free of charge, to any person obtaining a
14
 * copy of this software and associated documentation files (the "Software"),
15
 * to deal in the Software without restriction, including without limitation
16
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
17
 * and/or sell copies of the Software, and to permit persons to whom the
18
 * Software is furnished to do so, subject to the following conditions:
19
 *
20
 * The above copyright notice and this permission notice shall be included
21
 * in all copies or substantial portions of the Software.
22
 *
23
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29
 * DEALINGS IN THE SOFTWARE.
30
 *****************************************************************************/
31

32

33
using System;
34

35
using OSGeo.OGR;
36
using OSGeo.OSR;
37

38

39
/**
40

41
 * <p>Title: GDAL C# createdata example.</p>
42
 * <p>Description: A sample app to create a spatial data source and a layer.</p>
43
 * @author Tamas Szekeres (szekerest@gmail.com)
44
 * @version 1.0
45
 */
46

47

48

49
/// <summary>
50
/// A C# based sample to create a layer.
51
/// </summary>
52

53
class CreateData {
54
       
55
        public static void usage() 
56

57
        { 
58
                Console.WriteLine("usage: createdata {data source name} {layername}");
59
                System.Environment.Exit(-1);
60
        }
61
 
62
        public static void Main(string[] args) {
63

64
                if (args.Length != 2) usage();
65

66
        // Using early initialization of System.Console
67
        Console.WriteLine("");
68

69
                /* -------------------------------------------------------------------- */
70
                /*      Register format(s).                                             */
71
                /* -------------------------------------------------------------------- */
72
        Ogr.RegisterAll();
73

74
                /* -------------------------------------------------------------------- */
75
                /*      Get driver                                                      */
76
                /* -------------------------------------------------------------------- */     
77
        Driver drv = Ogr.GetDriverByName("ESRI Shapefile");
78

79
                if (drv == null) 
80
                {
81
                        Console.WriteLine("Can't get driver.");
82
            System.Environment.Exit(-1);
83
                }
84

85
        // TODO: drv.name is still unsafe with lazy initialization (Bug 1339)
86
        //string DriverName = drv.name;
87
        //Console.WriteLine("Using driver " + DriverName);
88

89
                /* -------------------------------------------------------------------- */
90
                /*      Creating the datasource                                         */
91
                /* -------------------------------------------------------------------- */     
92

93
        DataSource ds = drv.CreateDataSource( args[0], new string[] {} );
94
        if (drv == null) 
95
        {
96
            Console.WriteLine("Can't create the datasource.");
97
            System.Environment.Exit(-1);
98
        }
99

100
        /* -------------------------------------------------------------------- */
101
        /*      Creating the layer                                              */
102
        /* -------------------------------------------------------------------- */
103

104
        Layer layer;
105
       
106
        int i;
107
        for(i=0;i<ds.GetLayerCount();i++)
108
        {
109
            layer = ds.GetLayerByIndex( i );
110
            if( layer != null && layer.GetLayerDefn().GetName() == args[1])
111
            {
112
                Console.WriteLine("Layer already existed. Recreating it.\n");
113
                ds.DeleteLayer(i);
114
                break;
115
            }
116
        }
117

118
        layer = ds.CreateLayer( args[1], null, wkbGeometryType.wkbPoint, new string[] {} );
119
        if( layer == null )
120
        {
121
            Console.WriteLine("Layer creation failed.");
122
            System.Environment.Exit(-1);
123
        }
124

125
        /* -------------------------------------------------------------------- */
126
        /*      Adding attribute fields                                         */
127
        /* -------------------------------------------------------------------- */
128

129
        FieldDefn fdefn = new FieldDefn( "Name", FieldType.OFTString );
130

131
        fdefn.SetWidth(32);
132

133
        if( layer.CreateField( fdefn, 1 ) != 0 )
134
        {
135
            Console.WriteLine("Creating Name field failed.");
136
            System.Environment.Exit(-1);
137
        }
138

139
                fdefn = new FieldDefn( "IntField", FieldType.OFTInteger );
140
                if( layer.CreateField( fdefn, 1 ) != 0 )
141
                {
142
                        Console.WriteLine("Creating IntField field failed.");
143
                        System.Environment.Exit(-1);
144
                }
145

146
                fdefn = new FieldDefn( "DbleField", FieldType.OFTReal );
147
                if( layer.CreateField( fdefn, 1 ) != 0 )
148
                {
149
                        Console.WriteLine("Creating DbleField field failed.");
150
                        System.Environment.Exit(-1);
151
                }
152

153
                fdefn = new FieldDefn( "DateField", FieldType.OFTDate );
154
                if( layer.CreateField( fdefn, 1 ) != 0 )
155
                {
156
                        Console.WriteLine("Creating DateField field failed.");
157
                        System.Environment.Exit(-1);
158
                }
159

160
        /* -------------------------------------------------------------------- */
161
        /*      Adding features                                                 */
162
        /* -------------------------------------------------------------------- */
163

164
        Feature feature = new Feature( layer.GetLayerDefn() );
165
        feature.SetField( "Name", "value" );
166
                feature.SetField( "IntField", (int)123 );
167
                feature.SetField( "DbleField", (double)12.345 );
168
                feature.SetField( "DateField", 2007, 3, 15, 18, 24, 30, 0 );
169

170
        Geometry geom = Geometry.CreateFromWkt("POINT(47.0 19.2)");
171
       
172
        if( feature.SetGeometry( geom ) != 0 )
173
        {
174
            Console.WriteLine( "Failed add geometry to the feature" );
175
            System.Environment.Exit(-1);
176
        }
177

178
        if( layer.CreateFeature( feature ) != 0 )
179
        {
180
            Console.WriteLine( "Failed to create feature in shapefile" );
181
            System.Environment.Exit(-1);
182
        }
183
       
184
                ReportLayer(layer);
185
        }
186

187
        public static void ReportLayer(Layer layer)
188
        {
189
                FeatureDefn def = layer.GetLayerDefn();
190
                Console.WriteLine( "Layer name: " + def.GetName() );
191
                Console.WriteLine( "Feature Count: " + layer.GetFeatureCount(1) );
192
                Envelope ext = new Envelope();
193
                layer.GetExtent(ext, 1);
194
                Console.WriteLine( "Extent: " + ext.MinX + "," + ext.MaxX + "," +
195
                        ext.MinY + "," + ext.MaxY);
196
               
197
                /* -------------------------------------------------------------------- */
198
                /*      Reading the spatial reference                                   */
199
                /* -------------------------------------------------------------------- */
200
        OSGeo.OSR.SpatialReference sr = layer.GetSpatialRef();
201
                string srs_wkt;
202
                if ( sr != null ) 
203
                {
204
                        sr.ExportToPrettyWkt( out srs_wkt, 1 );
205
                }
206
                else
207
                        srs_wkt = "(unknown)";
208

209

210
        Console.WriteLine( "Layer SRS WKT: " + srs_wkt );
211

212
                /* -------------------------------------------------------------------- */
213
                /*      Reading the fields                                              */
214
                /* -------------------------------------------------------------------- */
215
                Console.WriteLine("Field definition:");
216
                for( int iAttr = 0; iAttr < def.GetFieldCount(); iAttr++ )
217
                {
218
                        FieldDefn fdef = def.GetFieldDefn( iAttr );
219
           
220
                        Console.WriteLine( fdef.GetNameRef() + ": " + 
221
                                fdef.GetFieldTypeName( fdef.GetFieldType() ) + " (" +
222
                                fdef.GetWidth() + "." +
223
                                fdef.GetPrecision() + ")");
224
                }
225

226
                /* -------------------------------------------------------------------- */
227
                /*      Reading the shapes                                              */
228
                /* -------------------------------------------------------------------- */
229
                Console.WriteLine( "" );
230
                Feature feat;
231
                while( (feat = layer.GetNextFeature()) != null )
232
                {
233
                        ReportFeature(feat, def);
234
                        feat.Dispose();
235
                }
236
        }
237

238
        public static void ReportFeature(Feature feat, FeatureDefn def)
239
        {
240
                Console.WriteLine( "Feature(" + def.GetName() + "): " + feat.GetFID() );
241
                for( int iField = 0; iField < feat.GetFieldCount(); iField++ )
242
                {
243
                        FieldDefn fdef = def.GetFieldDefn( iField );
244
           
245
                        Console.Write( fdef.GetNameRef() + " (" +
246
                                fdef.GetFieldTypeName(fdef.GetFieldType()) + ") = ");
247

248
                        if( feat.IsFieldSet( iField ) )
249
                                Console.WriteLine( feat.GetFieldAsString( iField ) );
250
                        else
251
                                Console.WriteLine( "(null)" );
252
           
253
                }
254

255
                if( feat.GetStyleString() != null )
256
                        Console.WriteLine( "  Style = " + feat.GetStyleString() );
257
   
258
                Geometry geom = feat.GetGeometryRef();
259
                if( geom != null )
260
                        Console.WriteLine( "  " + geom.GetGeometryName() + 
261
                                "(" + geom.GetGeometryType() + ")" );
262

263
                Envelope env = new Envelope();
264
                geom.GetEnvelope(env);
265
                Console.WriteLine( "   ENVELOPE: " + env.MinX + "," + env.MaxX + "," +
266
                        env.MinY + "," + env.MaxY);
267

268
                string geom_wkt;
269
                geom.ExportToWkt(out geom_wkt);
270
                Console.WriteLine( "  " + geom_wkt );
271

272
                Console.WriteLine( "" );
273
        }
274
}


转载自:https://blog.csdn.net/shumu_xzw/article/details/45767047

You may also like...