☰
GDAL SAR_CEOS 驱动详解:用 GDAL 读取 Radarsat / JERS-1 / ALOS-2 / ALOS-4 / ERS 的 CEOS SAR 影像
2026/10/12 1:52:08 网站建设 项目流程
  • GIS
  • 遥感
  • 数据工程

【免费下载链接】gdal

GDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.

项目地址:https://gitcode.com/gh_mirrors/gd/gdal
点击查看免费下载

导读

SAR_CEOS 是 GDAL 内置(默认编译启用)的只读栅格驱动,用于读取遵循 CEOS(Committee on Earth Observation Satellites)格式的合成孔径雷达(SAR)影像文件,支持 Radarsat、JERS-1、JAXA PALSAR-2(ALOS-2)、JAXA PALSAR-3(ALOS-4)以及 ERS 等主流 SAR 产品,涵盖单视复数(Single Look Complex,SLC)产品。读完本文,你将掌握该驱动的适用数据范围、GCP 与元数据的自动提取机制、SIR-C 与 PALSAR 极化数据的波段组织方式,以及通过 GDAL 命令行工具(gdalinfo、gdal_translate 等)和 Python 绑定实际使用该驱动的方法,并深入理解其底层实现原理(实现文件为 frmts/ceos2/sar_ceosdataset.cpp)。

驱动概览

SAR_CEOS 是 CEOS SAR 影像的只读读取器。使用时直接选择主影像文件即可(驱动会自动在磁盘上查找配套的 volume directory、leader、trailer 等辅助文件)。其官方文档位于 doc/source/drivers/raster/sar_ceos.rst。

该驱动适用于绝大多数 Radarsat、JERS-1、JAXA PALSAR-2(ALOS-2)、JAXA PALSAR-3(ALOS-4)和 ERS 数据产品(包括单视复数产品),但大概率无法处理非雷达用途的 CEOS 产品(如光学影像)。对于这类数据,通常应改用更简单的 CEOS 驱动(raster.ceos)。

在 GDAL 驱动注册层面,驱动描述名为SAR_CEOS,注册逻辑见 frmts/ceos2/sar_ceosdataset.cpp#L2454-L2472:通过GDALRegister_SAR_CEOS()完成注册,声明GDAL_DCAP_RASTER = YES(只支持栅格),并对外暴露GDAL_DCAP_VIRTUALIO = YES,即支持 虚拟文件系统 打开。

驱动能力矩阵

能力项支持情况说明
读取(只读)✅驱动不支持更新(GA_Update会被ReportUpdateNotSupportedByDriver拒绝,见 Open())
地理参考(Georeferencing)✅通过 GCP(Ground Control Points)提供,详见下文"GCP 提取机制"
虚拟文件系统(Virtual I/O)✅GDAL_DCAP_VIRTUALIO = YES,支持 /vsizip/、/vsicurl/ 等
影像数据类型依据 CEOS 影像描述UInt8 / Int16 / UInt16 / Int32 / UInt32 / Float32 / Float64 / CInt16 / CFloat32,映射关系见 Open()

适用产品与文件结构

CEOS SAR 卷的五类文件

CEOS 格式的 SAR 数据卷通常由五类文件组成,SAR_CEOS 驱动在打开主影像文件后,会按照多套命名规则尝试定位其余文件(见 CeosExtension 表):

文件角色说明常见扩展名(多套规则之一)
Volume Directory File(卷目录文件)记录卷级元信息,如逻辑卷 IDvol、vdf、VOLD
Leader File(前导文件)记录卫星、轨道、处理等元数据led、lea、slf、Sarl_01
Imagery Options File(影像文件)主影像数据,即用户直接打开的文件img、dat
Trailer File(尾随文件)部分元数据与校准记录trl、tra、stf
Null Volume Directory(空卷目录)补充卷信息nul、nvd

命名规则并非只有一种:从源码可以看出驱动内置了十余套候选规则,覆盖 ERS-1/2 的VDF/LF/SLC、Radarsat-1 的vdf_dat/lea_%02d/dat_%02d/tra_%02d、JERS 的VOLD/Sarl_01/Imop_%02d/Sart_01/NULL,以及 ALOS-2/ALOS-4 的VOL/LED//TRL(ALOS2-ALOS4规则)。驱动会逐一尝试这些规则并校验记录序列号,从而兼容不同分发渠道的产品。

打开主影像文件的过程

SAR_CEOSDataset::Open()是驱动入口,其识别流程为(Open()):

  1. 头部魔数校验:检查文件头 12 字节内是否包含合法的 CEOS 记录头——第 5 字节必须为0x3f或0x32,第 6~8 字节必须为0xc0 0x12 0x12;同时拒绝疑似小端字节序的记录索引(规避某些字节序颠倒的产品导致崩溃,见源码注释#1862)。
  2. 解析影像文件:把当前文件作为 Imagery Options File 处理,最多解析前 4 条记录(ProcessData中max_records=4),随后在磁盘上按候选规则寻找其余四类文件。
  3. 获取影像描述:调用GetCeosSARImageDesc()从影像描述记录(类型码63 192 18 18,即IMAGE_OPT)中读出通道数、交错方式、数据类型、每行像素数、记录字节数等字段。这些字段的具体偏移量定义在 ceosrecipe.c 的RadarSatRecipe、JersRecipe、ScanSARRecipe、PALSARRecipe等"配方"表中。
  4. 按数据类型分流:普通类型使用RawRasterBand(大端字节序)或SAR_CEOSRasterBand(多记录每行、CHAR/LONG/ULONG/DOUBLE 等复杂情况);压缩散射矩阵(SIR-C)使用CCPRasterBand;PALSAR 复数据使用PALSARRasterBand。
  5. 扫描元数据与 GCP:调用ScanForMetadata()和按需的ScanForGCPs()。
  6. 初始化 PAM / 概览:支持 PAM(Persistent Auxiliary Metadata,.aux.xml)与外部概览(.ovr)。

值得注意的是:CEOS 记录由 12 字节记录头(记录序号 + 类型码 + 记录长度)与记录体组成,ProcessData()(sar_ceosdataset.cpp#L2309-L2448)逐条读取并校验记录序号,遇到序号不连续时会报"Corrupted CEOS File"并失败(ALOS-2/4 trailer 的"填充记录"情况除外,以静默方式容忍)。

元数据提取机制

SAR_CEOS 驱动会从各类头文件中捕获大量CEOS_前缀元数据。文档中给出的典型示例为:

CEOS_LOGICAL_VOLUME_ID=EERS-1-SAR-MLD CEOS_FACILITY=CDPF-RSAT CEOS_PROCESSING_FACILITY=APP CEOS_PROCESSING_AGENCY=CCRS CEOS_PROCESSING_COUNTRY=CANADA CEOS_SOFTWARE_ID=APP 1.62 CEOS_ACQUISITION_TIME=19911029162818919 CEOS_SENSOR_CLOCK_ANGLE= 90.000 CEOS_ELLIPSOID=IUGG_75 CEOS_SEMI_MAJOR= 6378.1400000 CEOS_SEMI_MINOR= 6356.7550000

ScanForMetadata()(sar_ceosdataset.cpp#L894-L1615)按记录类型逐组提取字段,各字段的元数据名与在记录体中的字节偏移量在源码中均有精确对应,可归纳如下:

  • 卷目录文件 → Volume Descriptor Record:CEOS_LOGICAL_VOLUME_ID(偏移 61)、CEOS_PROCESSING_FACILITY(149)、CEOS_PROCESSING_AGENCY(141)、CEOS_PROCESSING_COUNTRY(129)、CEOS_SOFTWARE_ID(33)、CEOS_PRODUCT_ID(261)、CEOS_VOLSET_ID(77)。
  • Leader/Trailer 文件 → Dataset Summary Record:CEOS_ACQUISITION_TIME(69)、CEOS_ASC_DES(101,升降轨,仅 Radarsat)、CEOS_TRUE_HEADING(149)、CEOS_ELLIPSOID(165)、CEOS_SEMI_MAJOR(181)、CEOS_SEMI_MINOR(197)、CEOS_SCENE_LENGTH_KM(341)、CEOS_SCENE_WIDTH_KM(357)、CEOS_MISSION_ID(397)、CEOS_SENSOR_ID(413)、CEOS_ORBIT_NUMBER(445)、CEOS_PLATFORM_LATITUDE(453)、CEOS_PLATFORM_LONGITUDE(461)、CEOS_PLATFORM_HEADING(469)、CEOS_SENSOR_CLOCK_ANGLE(477,即视角 Look Angle)、CEOS_INC_ANGLE(485,入射角)、CEOS_FACILITY(1047)、CEOS_PIXEL_TIME_DIR(1527)、CEOS_LINE_SPACING_METERS(1687)、CEOS_PIXEL_SPACING_METERS(1703)。
  • Radarsat 专用:CEOS_BEAM_TYPE(来自辐射补偿记录的偏移 4189);CEOS_PROC_START、CEOS_PROC_STOP、CEOS_EPH_ORB_DATA_0..6、CEOS_GROUND_TO_SLANT_C0..C5、CEOS_INC_ANGLE_FIRST/LAST_RANGE(来自详细处理参数记录,多处偏移见源码)。
  • ERS 校准相关:CEOS_INC_ANGLE_FIRST/CENTRE/LAST_RANGE、CEOS_CALIBRATION_CONSTANT_K、CEOS_GROUND_TO_SLANT_C0..C3(来自 General Facility Data Record);CEOS_CALIBRATION_OFFSET(来自 Radiometric Data Record);CEOS_OFFSET_A0、CEOS_GAIN_A1;CEOS_GAIN_SETTING(H/V 增益设置,来自 Scene Header Record)。
  • ALOS-2 / ALOS-4(PALSAR-2/3)专用:CEOS_PLATFORM_POS_*系列(轨道根数、位置/速度矢量序列点,来自 Platform Position Data Record)、CEOS_PLATFORM_ATT_*系列(姿态角与角速率序列点,来自 Attitude Data Record)、CEOS_RADIOMETRIC_*(辐射定标因子与 2×2 复数矩阵 DT/DR,来自 Radiometric Data Record)、CEOS_FACILITY_5_*(Facility Related Data Record #5 中投影坐标↔像素/行、像素/行↔经纬度、经纬度↔像素/行/列的多项式系数,各 25 个系数)、CEOS_SLANT_RANGE_*、CEOS_DOPPLER_CENTROID_*、CEOS_AZIMUTH_FM_RATE_*(来自影像处理数据记录,首/中/末像素分别给出,并额外读取末行记录作为_LAST_LINE后缀校验)。

这些偏移量定义均可在 ScanForMetadata() 中逐条核对,字段为空或与产品无关时不会被写入元数据。

原始记录访问:ceos-*元数据域

驱动还提供了一种特殊的元数据域ceos-FFF-n-n-n-n:r,可访问预加载的原始 CEOS 记录(GetMetadata() 实现):

  • FFF为文件标识:vol(卷目录)、lea(前导)、img(影像)、trl(尾随)、nul(空卷目录);
  • n-n-n-n为四字节记录类型码,例如数据集摘要记录为18-10-18-20(对应前导文件的DATA_SET_SUMMARY);
  • :r为可选的第 r 条记录(从 0 开始计数)。

该域返回两个键:RawRecord(二进制内容中\0被替换为空格的可读文本)与EscapedRecord(对\0、双引号、反斜杠做转义)。注意:只有预加载的记录才能访问,通常大部分影像记录不在其列(ProcessData对影像文件仅预载前 4 条记录)。

GCP 提取机制

SAR_CEOS 驱动通过 GCP 提供地理参考,其空间参考固定为 WGS84 经纬度(m_oSRS.importFromWkt(SRS_WKT_WGS84_LAT_LONG),构造函数)。

常规产品:逐扫描行采样 15 个 GCP

对于普通产品,ScanForGCPs()(sar_ceosdataset.cpp#L1767-L1871)会通过采样每条 CEOS 扫描行前缀(per-scanline superstructure)中的经纬度信息来读取 15 个经纬度 GCP:在每个采样扫描行的开头、中间、末尾各取一个 GCP,最多 15 个,覆盖大多数用途。GCP 坐标以百万分之一度(×10⁻⁶)存储,源码中通过nLat / 1000000.0还原为度。测试 autotest/gdrivers/sar_ceos.py 中的 ALOS-2 L1.5 用例即验证了GetGCPCount() == 15。

ASF 产品:从投影/设施记录读取角点

对于来自 Alaska Satellite Facility(ASF)的产品,驱动改为读取角点坐标:

  • ScanSAR 产品:从地图投影记录(Map Projection Record)读取四角;
  • 非 ScanSAR 产品:从设施数据记录(Facility Data Record)读取四角。

ScanForMapProjection()(sar_ceosdataset.cpp#L1624-L1761)会依次尝试标准 Map Projection Record、JERS 变体、ASF Map Projection Record、ASF Facility Data Record,并依据不同记录类型采用不同的 GCP 顺序(标准记录为 UL→UR→LR→LL,ASF 设施记录为 UL→LL→UR→LR,ASF 投影记录为 LL→LR→UR→UL),最终映射到图像的四角像素位置。

无 GCP 的例外情况

  • ALOS-2/ALOS-4 的 SLC(单视复数)产品(CEOS_VOLSET_ID以ALOS2 SAR或ALOS4 SAR开头,且波段类型为GDT_CFloat32)不生成 GCP——这主要是性能考虑,避免在读取 zip/网络归档时因 GCP 扫描而整卷读取。测试用例test_sar_ceos_alos2_L1_1与test_sar_ceos_alos4_L1_1均断言GetGCPCount() == 0。
  • 若扫描行前缀数据不足(ImageDataStart < 192)或 ASF L1 产品的经纬度字段无效,也会回退到ScanForMapProjection()。

极化数据的波段组织(SIR-C 与 PALSAR)

SAR_CEOS 驱动对 SIR-C 与 PALSAR 极化数据提供了专门支持。

SIR-C:压缩散射矩阵(CCP)

SIR-C 格式将极化数据存储为压缩散射矩阵形式。GDAL 在读取时实时解压,输出 4 个GDT_CFloat32复波段,分别对应 HH、HV、VH、VV 四个散射矩阵元素(CCPRasterBand构造中设置POLARIMETRIC_INTERP元数据,sar_ceosdataset.cpp#L331-L351),并在波段数为 4 时给数据集写入MATRIX_REPRESENTATION=SCATTERING(Open())。

其解压公式(来源为源码注释引用的 JPL dcomp 文档)为:

ysca = sqrt{ [ (Byte(2) / 254) + 1.5 ] * 2^Byte(1) } // 2^Byte(1) 查 256 项幂表 afPowTable Re(SHH) = Byte(3) * ysca / 127 Im(SHH) = Byte(4) * ysca / 127 Re(SHV) = Byte(5) * ysca / 127 Im(SHV) = Byte(6) * ysca / 127 Re(SVH) = Byte(7) * ysca / 127 Im(SVH) = Byte(8) * ysca / 127 Re(SVV) = Byte(9) * ysca / 127 Im(SVV) = Byte(10) * ysca / 127

即每个像素 10 个有符号字节构成一组,CCPRasterBand::IReadBlock()(sar_ceosdataset.cpp#L379-L480)在读取块时逐像素完成上述解算。

PALSAR:3×3 厄米协方差矩阵

PALSAR 格式(PALSAR-1/2/3,即 ALOS/ALOS-2/ALOS-4)的波段与 3×3 厄米协方差矩阵的元素几乎一一对应(完整描述见 ERSDAC-VX-CEOS-004A 文档,像素存储见其 193 页;当前仓库源码注释引用的是 PALSAR-2 与 PALSAR-3 的官方产品格式说明 PDF)。GDAL 在读取时将其转换为复数浮点协方差矩阵波段,波段与散射矩阵元素 HH、HV(=VH)、VV 的对应约定如下(注意:非对角元素为复数,对角元素为实数,但统一以复波段表示):

波段含义类型公式
Band 1Covariance_11Float32HH·conj(HH)
Band 2Covariance_12CFloat32√2·HH·conj(HV)
Band 3Covariance_13CFloat32HH·conj(VV)
Band 4Covariance_22Float322·HV·conj(HV)
Band 5Covariance_23CFloat32√2·HV·conj(VV)
Band 6Covariance_33Float32VV·conj(VV)

波段身份同时反映在元数据中:PALSARRasterBand构造函数为每个波段设置POLARIMETRIC_INTERP(依次为Covariance_11 / Covariance_22 / Covariance_33 / Covariance_12 / Covariance_13 / Covariance_23,sar_ceosdataset.cpp#L492-L515);当波段数为 6 时,数据集写入MATRIX_REPRESENTATION=SYMMETRIZED_COVARIANCE(Open())。

源码中PALSARRasterBand::IReadBlock()的注释(sar_ceosdataset.cpp#L581-L596)明确了各波段的换算逻辑:

Covariance_11 = HH*conj(HH) —— 原样 Covariance_22 = 2*HV*conj(HV) —— 乘 2 Covariance_33 = VV*conj(VV) —— 原样 Covariance_12 = sqrt(2)*HH*conj(HV) —— 乘 sqrt(2) Covariance_13 = HH*conj(VV) —— 原样 Covariance_23 = sqrt(2)*HV*conj(VV) —— 取共轭后乘 sqrt(2)

对应实现(sar_ceosdataset.cpp#L598-L636):Band 2 实部与虚部整体乘 2;Band 4 乘 √2(四舍五入);Band 6 的实部乘 √2、虚部取反后乘 √2(即共轭后放大 √2)。

实战:如何使用 SAR_CEOS 驱动

1. 检查数据可读性

使用gdalinfo查看影像基本信息、GCP 与元数据:

gdalinfo ottawa_patch.img # 或通过虚拟文件系统直接打开 zip 内的 ALOS-2 SLC 影像: gdalinfo /vsizip//vsicurl/https://example.com/ud2_L1.1_CEOS/IMG-HH-ALOS2403684200-200620-UBSL1.1__D

输出中将包含CEOS_系列元数据、GCP Projection = WGS84、15 个(或 0 个)GCP 列表,以及影像尺寸与波段数。

2. 查看极化波段

对于 PALSAR 极化产品(6 波段协方差矩阵),可用gdalinfo -stats或 Python 查看各波段类型与POLARIMETRIC_INTERP:

gdalinfo -mdd all PALSAR_image.dat

3. 转换与地理配准

gdal_translate可直接将 SLC/复数影像转换为 GeoTIFF 等格式(复数波段请选用支持复数的目标格式,如 GeoTIFF 的 CFloat32):

gdal_translate -of GTiff -ot Float32 ottawa_patch.img out.tif

若需利用 GCP 做地理配准,可配合gdalwarp使用(GCP 位于 WGS84 经纬度,需先转换为可用的地理参考):

gdalwarp -t_srs EPSG:4326 -order 1 -r bilinear ottawa_patch.img georef.tif

4. Python 绑定用法

通过osgeo.gdal打开(示例路径来自测试数据 autotest/gdrivers/data/sar_ceos):

from osgeo import gdal ds = gdal.Open("autotest/gdrivers/data/sar_ceos/ottawa_patch.img") print("Driver:", ds.GetDriver().ShortName) # SAR_CEOS print("Size:", ds.RasterXSize, "x", ds.RasterYSize) print("Bands:", ds.RasterCount) print("GCPs:", ds.GetGCPCount()) for k, v in sorted(ds.GetMetadata().items()): print(k, "=", v) band = ds.GetRasterBand(1) print("DataType:", gdal.GetDataTypeName(band.DataType))

测试与验证

SAR_CEOS 驱动有专门的自动化测试 autotest/gdrivers/sar_ceos.py,可作为理解驱动行为的最佳参考:

  • test_sar_ceos_app_1:用 ottawa_patch.img 验证打开;
  • test_sar_ceos_asf_2:用 ASF 产品 R1_26161_FN1_F164.D 验证 ASF 命名与 GCP 逻辑;
  • test_sar_ceos_alos2_L1_1/test_sar_ceos_alos2_L1_5/test_sar_ceos_alos4_L1_1:标注@pytest.mark.network的网络测试,通过/vsizip//vsicurl/从 JAXA 官方示例数据站点远程打开 ALOS-2 L1.1(CFloat32 SLC,无 GCP)、ALOS-2 L1.5(UInt16 地理编码产品,15 GCP)与 ALOS-4 L1.1(CFloat32 SLC,无 GCP)产品,并逐项断言全部CEOS_元数据字典——这是校验驱动元数据提取正确性的黄金基准。

另外,frmts/ceos2/ceosrecipe.c 中的配方表(Recipe)定义了不同产品(Radarsat、JERS、ScanSAR、SIR-C、PALSAR-ALOS)在影像记录内各字段的偏移与类型,是理解驱动"如何从二进制记录中解析出影像描述"的关键;frmts/ceos2/ceos.h 则定义了 CEOS 记录头(12 字节)、文件角色常量、交错方式与数据类型常量。

小结

SAR_CEOS 驱动是 GDAL 中处理 CEOS 格式星载 SAR 数据的主力入口:它对 Radarsat、JERS-1、ALOS-2(PALSAR-2)、ALOS-4(PALSAR-3)与 ERS 的 SLC/地理编码产品提供只读支持,通过自动多套命名规则定位五类卷文件,从各头文件中提取丰富的CEOS_*元数据,按扫描行采样或按 ASF 记录生成 GCP,并为 SIR-C 与 PALSAR 极化数据提供散射矩阵/协方差矩阵层面的实时解译。使用时可仅传入主影像文件,配合 gdalinfo、gdal_translate、gdalwarp 与 Python 绑定即可完成查看、转换与配准,官方文档与自动化测试文件是进一步深入的最佳参考。

  • GIS
  • 遥感
  • 数据工程

【免费下载链接】gdal

GDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.

项目地址:https://gitcode.com/gh_mirrors/gd/gdal
点击查看免费下载
上一篇:DirectX-Headers多平台支持:Windows、Linux与WSL开发全攻略
下一篇:AutoGen多智能体框架全攻略:从架构到实践

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询