GDAL库读取Envisat ASAR数据

114 篇文章 239 订阅
1 篇文章 0 订阅

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等信息进行插值即可得到辐射定标的相关参数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
语言的好处及其适用范围 C语言是一种非常流行的编程语言,同时又是一种非常灵活和高效的语言,其应用范围广泛。下面我们就一起来看看使用C语言的好处及其适用范围。 C语言的好处: 1.高效性:C语言是一种非常高效的编程语言,其执行速度比大多数其他编程语言快很多,因此对于需要进行处理大量数据和进行复杂计算的场景非常适合。 2.灵活性:C语言提供了非常多的工具和函数,同时又支持用户自定义函数和数据类型,因此可以让程序员根据自己的需要编写出非常灵活的程序。 3.可移植性:C语言可以在不同的操作系统和硬件平台上运行,因此可以让程序更加通用和适用于不同的计算环境。 4.易于学习:C语言的语法相对简单,模块化和结构化编程风格易于理解,因此入门门槛较低,易于学习。 C语言的适用范围: 1.系统软件开发:C语言由于其高效性和可移植性的特点,其广泛用于系统软件开发中,如操作系统、编译器等。 2.嵌入式系统开发:C语言在嵌入式系统开发中也非常流行,其可以用于编写驱动程序、操作系统、网络协议栈等等。 3.科学计算:C语言的执行速度非常快,其广泛用于科学计算领域,如数值分析、机器学习等等。 4.游戏开发:C语言由于其高效性,非常适合用于游戏开发中,其可以用于编写游戏引擎、游戏物理引擎等。 总之,使用C语言可以带来高效、灵活、可移植等多种好处,其可以应用于不同领域的开发工作中。当然,C语言也有其缺点,如容易出错、内存管理较为复杂等,因此使用C语言的开发人员需要具备一定的编程和操作系统相关知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值