c# GDAL 讀 DEM

       轉自:  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);     // 讀取數據到gdaldataset

           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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章