一.C#使用GDAL做WKT和WKB之间的转换。
using System;
using OSGeo.OGR;
/// <summary>
/// A C# based sample for demonstrating the usage of ExportToWkb.
/// </summary>
class WKT2WKB {
public static void usage()
{
Console.WriteLine("usage example: wkt2wkb \"POINT(47.0 19.2)\"");
System.Environment.Exit(-1);
}
public static void Main(string[] args) {
if (args.Length != 1) usage();
/* -------------------------------------------------------------------- */
/* Register format(s). */
/* -------------------------------------------------------------------- */
Ogr.RegisterAll();
Geometry geom = Geometry.CreateFromWkt(args[0]);
long wkbSize = geom.WkbSize();
if (wkbSize > 0)
{
byte[] wkb = new byte[wkbSize];
geom.ExportToWkb( wkb );
Console.WriteLine( "wkt-->wkb: " + BitConverter.ToString(wkb) );
// wkb --> wkt (reverse test)
Geometry geom2 = Geometry.CreateFromWkb(wkb);
string geom_wkt;
geom2.ExportToWkt(out geom_wkt);
Console.WriteLine( "wkb->wkt: " + geom_wkt );
}
// wkt -- gml transformation
string gml = geom.ExportToGML();
Console.WriteLine( "wkt->gml: " + gml );
Geometry geom3 = Geometry.CreateFromGML(gml);
string geom_wkt2;
geom3.ExportToWkt(out geom_wkt2);
Console.WriteLine( "gml->wkt: " + geom_wkt2 );
}
}
二、C#使用gdal读取光栅,文档说明我没有找到C#的文档,大家可以参考一下c++的文档或者java的文档
java:Band (GDAL/OGR 3.6.2 Java bindings API)
class GDALRead
{
public static void usage()
{
Console.WriteLine("使用方式: gdalread {GDAL数据集名称} {输出文件名字} {overview}");
System.Environment.Exit(-1);
}
public static void GDALReadMain(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
{
/* -------------------------------------------------------------------- */
/* 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 + ")");//光栅的尺寸
/* -------------------------------------------------------------------- */
/* 获取当前数据集使用的驱动 */
/* -------------------------------------------------------------------- */
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)
{
// 从数据集中获取GDAL波段对象
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(@"D:\Image\1.png");
}
}
调用的方法:
const string relativePath = @"D:\Project\Winform\SharpGDAL\SharpGDAL\GeoData\GeoTiff\utm.tif";
GdalConfiguration.ConfigureGdal();
GdalConfiguration.ConfigureOgr();
string[] str = new string[3]
{
relativePath,
"ddd",
"3"
};
GDALRead.GDALReadMain(str);
通过上面两个demo,关于gdal也算是入门了,其他的C# demo可以去gdal官网查看。
apps in trunk/gdal/swig/csharp – GDAL
或者github也可以查看