1. 程式人生 > >GDAL庫讀取Envisat ASAR資料

GDAL庫讀取Envisat ASAR資料

GDAL庫讀取Envisat ASAR資料

 

GDAL庫本身就可以讀取Envisat的影象資料,具體連結為:http://www.gdal.org/frmt_various.html#Envisat

但是對於ASAR感測器的資料來說,GDAL在處理的時候將入射角資料沒要進行處理,也就是通過GDAL提供的介面無法獲取到這個資訊。

ASAR資料進行輻射定標的時候,入射角資訊是必須要的資訊,如果通過GDAL庫來對ASAR資料進行輻射定標,那麼因為沒法獲取到入射角資訊從而導致沒法進行輻射定標。

ASAR資料裡面入射角資訊位於GEOLOCATION GRID ADS中,GDAL庫在解析該部分內容時,只將GCP資訊進行了解析,而對於入射角、時間等資訊直接跳過,沒有進行處理,所以要使用GDAL庫能夠讀取入射角資訊,最簡單的方式就是將入射角資訊解析到GDAL的元資料中,這樣就可以在不改動任何介面的情況下來獲取入射角資訊。

基於上面的分析,需要對GDAL庫中讀取ENVISAT資料的驅動進行修改,增加解析入射角的內容,並將入射角構造成元資料資訊寫入Dataset中。通過分析ENVISAT驅動的原始碼檔案envisatdataset.cpp,可以在函式ScanForGCPs_ASAR()中增加相應的程式碼。

增加的程式碼片段為:

  1. 解析First Line的資料
        //解析入射角資訊
        char szKey[32];
        char szValue[32];

        //解析Sample
        memcpy(&unValue, abyRecord + 25 + iRecord * 4, 4);
        int nSample = CPL_MSBWORD32(unValue);
        snprintf(szKey, sizeof(szKey), "FIRST_LINE_SAMPLE_%d", iRecord);
        snprintf(szValue, sizeof(szValue), "%d", nSample);
        SetMetadataItem(szKey, szValue, "GEOLOCATION_GRID_ADSR");

        //解析Time
        float fValue;
        memcpy(&fValue, abyRecord + 25 + 44 + iRecord * 4, 4);
        CPL_SWAP32PTR(&fValue);
        snprintf(szKey, sizeof(szKey), "FIRST_LINE_TIME_%d", iRecord);
        snprintf(szValue, sizeof(szValue), "%.6f", fValue);
        SetMetadataItem(szKey, szValue, "GEOLOCATION_GRID_ADSR");

        //解析Angles
        memcpy(&fValue, abyRecord + 25 + 88 + iRecord * 4, 4);
        CPL_SWAP32PTR(&fValue);
        snprintf(szKey, sizeof(szKey), "FIRST_LINE_ANGLES_%d", iRecord);
        snprintf(szValue, sizeof(szValue), "%.6f", fValue);
        SetMetadataItem(szKey, szValue, "GEOLOCATION_GRID_ADSR");
  •  
  1. 解析Last Line的資料
        //解析入射角資訊
        char szKey[32];
        char szValue[32];

        //解析Sample
        snprintf(szKey, sizeof(szKey), "LAST_LINE_SAMPLE_%d", iGCP);
        snprintf(szValue, sizeof(szValue), "%d", nSample);
        SetMetadataItem(szKey, szValue, "GEOLOCATION_GRID_ADSR");

        //解析Time
        float fValue;
        memcpy(&fValue, abyRecord + 279 + 44 + iGCP * 4, 4);
        CPL_SWAP32PTR(&fValue);
        snprintf(szKey, sizeof(szKey), "LAST_LINE_TIME_%d", iGCP);
        snprintf(szValue, sizeof(szValue), "%.6f", fValue);
        SetMetadataItem(szKey, szValue, "GEOLOCATION_GRID_ADSR");

        //解析Angles
        memcpy(&fValue, abyRecord + 279 + 88 + iGCP * 4, 4);
        CPL_SWAP32PTR(&fValue);
        snprintf(szKey, sizeof(szKey), "LAST_LINE_ANGLES_%d", iGCP);
        snprintf(szValue, sizeof(szValue), "%.6f", fValue);
        SetMetadataItem(szKey, szValue, "GEOLOCATION_GRID_ADSR");
  • 部分程式碼之後,重新編譯GDAL庫,生成DLL即可。下面使用gdalinfo工具來進行測試,輸出的入射角、時間資訊如下:
Metadata (GEOLOCATION_GRID_ADSR):
  FIRST_LINE_ANGLES_0=14.296353
  FIRST_LINE_ANGLES_1=15.133030
  FIRST_LINE_ANGLES_10=22.277876
  FIRST_LINE_ANGLES_2=15.960590
  FIRST_LINE_ANGLES_3=16.779432
  FIRST_LINE_ANGLES_4=17.589853
  FIRST_LINE_ANGLES_5=18.389204
  FIRST_LINE_ANGLES_6=19.186239
  FIRST_LINE_ANGLES_7=19.972475
  FIRST_LINE_ANGLES_8=20.750854
  FIRST_LINE_ANGLES_9=21.521433
  FIRST_LINE_SAMPLE_0=1
  FIRST_LINE_SAMPLE_1=832
  FIRST_LINE_SAMPLE_10=8304
  FIRST_LINE_SAMPLE_2=1663
  FIRST_LINE_SAMPLE_3=2494
  FIRST_LINE_SAMPLE_4=3325
  FIRST_LINE_SAMPLE_5=4153
  FIRST_LINE_SAMPLE_6=4987
  FIRST_LINE_SAMPLE_7=5818
  FIRST_LINE_SAMPLE_8=6649
  FIRST_LINE_SAMPLE_9=7480
  FIRST_LINE_TIME_0=5414506.500000
  FIRST_LINE_TIME_1=5432814.000000
  FIRST_LINE_TIME_10=5637850.500000
  FIRST_LINE_TIME_2=5452048.500000
  FIRST_LINE_TIME_3=5472201.000000
  FIRST_LINE_TIME_4=5493261.000000
  FIRST_LINE_TIME_5=5515137.000000
  FIRST_LINE_TIME_6=5538061.500000
  FIRST_LINE_TIME_7=5561780.000000
  FIRST_LINE_TIME_8=5586363.000000
  FIRST_LINE_TIME_9=5611798.500000
  LAST_LINE_ANGLES_0=14.357172
  LAST_LINE_ANGLES_1=15.185051
  LAST_LINE_ANGLES_10=22.280605
  LAST_LINE_ANGLES_2=16.004770
  LAST_LINE_ANGLES_3=16.816580
  LAST_LINE_ANGLES_4=17.620653
  LAST_LINE_ANGLES_5=18.414248
  LAST_LINE_ANGLES_6=19.206030
  LAST_LINE_ANGLES_7=19.987459
  LAST_LINE_ANGLES_8=20.761423
  LAST_LINE_ANGLES_9=21.527927
  LAST_LINE_SAMPLE_0=1
  LAST_LINE_SAMPLE_1=832
  LAST_LINE_SAMPLE_10=8304
  LAST_LINE_SAMPLE_2=1663
  LAST_LINE_SAMPLE_3=2494
  LAST_LINE_SAMPLE_4=3325
  LAST_LINE_SAMPLE_5=4153
  LAST_LINE_SAMPLE_6=4987
  LAST_LINE_SAMPLE_7=5818
  LAST_LINE_SAMPLE_8=6649
  LAST_LINE_SAMPLE_9=7480
  LAST_LINE_TIME_0=5414506.500000
  LAST_LINE_TIME_1=5432814.000000
  LAST_LINE_TIME_10=5637850.500000
  LAST_LINE_TIME_2=5452048.500000
  LAST_LINE_TIME_3=5472201.000000
  LAST_LINE_TIME_4=5493261.000000
  LAST_LINE_TIME_5=5515137.000000
  LAST_LINE_TIME_6=5538061.500000
  LAST_LINE_TIME_7=5561780.000000
  LAST_LINE_TIME_8=5586363.000000
  LAST_LINE_TIME_9=5611798.500000

從上面的資訊中可以看出,ASAR資料裡面的入射角等資訊都位於GEOLOCATION_GRID_ADSR元資料之下,後續只需從該元資料中解析入射角、Sample等資訊進行插值即可得到輻射定標的相關引數。