轉自: http://blog.sina.com.cn/s/blog_7cefb1d40100q8xo.html
準備文件
編譯好的gdal核心庫gdal180.dll以及C#封裝庫gdal_wrap.dll、gdal_csharp.dll
讀取DEM數據步驟及說明
1. 將gdal180.dll、gdal_wrap.dll、 gdal_csharp.dll拷貝到程序的生成目錄,並在項目裏添加對gdal_csharp.dll庫的引用。
2. 在要使用gdal的文件頭部加上如下命名空間的聲明:
using OSGeo.GDAL;
3. 讀取代碼如下:
Gdal.AllRegister(); // 初始化gdal庫
Dataset ds = Gdal.Open(path, Access.GA_ReadOnly); // 讀取數據到gdal的dataset中
int XSize = ds.RasterXSize;
int YSize = ds.RasterYSize; // 獲取柵格數據的長和寬
int count = ds.RasterCount; // 獲取柵格數據的點的數量
Band demband = ds.GetRasterBand(1); // 獲取第一個band
double[] gt = new double[6];
ds.GetGeoTransform(gt); // 獲取屏幕座標轉換到實際地理座標的參數
int Xpixel = 100;
int Yline = 100;
double Xgeo = gt[0] + Xpixel*gt[1] + Yline*gt[2];
double Ygeo = gt[3] + Xpixel*gt[4] + Yline*gt[5]; // 計算像素座標爲(100, 100)的點的實際地理座標
double nodatavalue;
int hasval;
demband.GetNoDataValue(out nodatavalue, out hasval); // 獲取沒有數據的點的值
double[] databuf = new double[XSize * YSize];
demband.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, databuf, ds.RasterXSize, ds.RasterYSize, 0, 0); // 讀取數據到緩衝區中
4. 主要函數說明。
1. Open函數
聲明:public static Dataset Open(string utf8_path, Access eAccess);
該函數用於從指定路徑讀取柵格數據。該函數有兩個參數,第一個參數是柵格數據的路徑,可以爲本地或網絡路徑。第二個參數是打開數據的模式,GA_ReadOnly表示以只讀方式打開,GA_Update表示以讀寫方式打開。該函數返回一個DataSet對象,gdal用dataset對象爲所有柵格數據提供統一的訪問接口。Dataset中包含1個或多個band,用於存放實際數據。Dataset還包含了柵格數據的大小、nodatavalue等信息。
2. GetRasterBand函數
聲明:public Band GetRasterBand(int nBand);
該函數用於從dataset中取得一個band。該函數有一個參數,用於指定要取的band的序號。該函數返回一個Band對象,Band是實際存儲柵格數據的對象。柵格數據的一個點上可以存儲多個值,一個柵格數據可以有1個或多個Band。一個Band可以理解爲柵格數據的一組值。比如說DEM數據的每個點只有一個高程值,因此只有一個Band,而一幅bmp圖像每個像素點有RGB三種顏色的值,因而有3個Band,使用GDAL可以方便的單獨操作每個Band。
3. GetGeoTransform函數
聲明:public void GetGeoTransform(double[] argout);
該函數用於取得從像素座標轉換到地理座標的6個參數。該函數有一個數組參數, 用於輸出轉換系數。實際應用中,首先調用該函數得到6個系統,然後按如下式子進行轉換:
Xgeo = GT(0) + Xpixel*GT(1) + Yline*GT(2)
Ygeo = GT(3) + Xpixel*GT(4) + Yline*GT(5)
其中Xgeo, Ygeo是地理座標, Xpixel, Yline是像素座標。GT是係數數組。如果影像正上爲北方向,則GT2和GT4參數爲0,而GT1是象元寬,GT5是象元高, (GT0,GT3)點位置是影像的左上角。 注意,上面所說的點/線座標系是從左上角(0,0)點到右下角,也就是座標軸從 左到右增長,從上到下增長的座標系(即影象的行列從左下角開始計算)。
4. GetGeoTransform函數
聲明:public CPLErr ReadRaster(int xOff, int yOff, int xSize, int ySize, double[] buffer, int buf_xSize, int buf_ySize, int pixelSpace, int lineSpace);
該函數用於從Band中讀取柵格數據。該函數有9個參數,可以對如何讀取數據進行精確描述。該函數返回一個CPLErr類型,用於指示讀取數據是否成功。GDAL C#封裝庫提供了多個重載用於讀取不同類型的數據,即buffer參數的類型可以是double, byte, int, float, short或者一個指針。
參數說明:
xOff – 待讀取數據x方向的起始位置,即x方向的偏移值
yOff – 待讀取數據y方向的起始位置,即y方向的偏移值
xSize – 待讀取數據的寬度
ySize – 待讀取數據的高度
buffer – 緩衝區用於存放讀取出來的數據
buf_xSize – 緩衝區x方向的大小,一般等於xSize
buf_ySize – 緩衝區y方向的大小,一般等於ySize
pixelSpace – 兩個像素橫向之間的間隔大小,一般取默認值0,即buffer的類型的大小。
lineSpace – 兩行之間第一個數據之間的間隔大小,一般取默認值0,即buffer類型大小*buf_xSize.