GIS遥感数据工程【免费下载链接】gdalGDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.项目地址https://gitcode.com/gh_mirrors/gd/gdal点击查看免费下载PDS4NASA Planetary Data System Version 4是美国国家航空航天局NASA用于存储和分发太阳系、月球及行星影像数据的标准格式。本文基于 GDAL 官方驱动文档与仓库源码系统讲解 PDS4 驱动的数据组织方式、栅格/矢量双模态读写能力、全部打开与创建选项、子数据集机制并给出可直接复制的 gdalinfo、gdal_translate、ogr2ogr 实战命令。读完本文你将能够在 GDAL 生态中无缝处理 PDS4 行星数据产品。PDS4 格式与驱动概览PDS4 是 NASA 行星数据档案的主流通用格式其核心组织方式是一个.xml标签label文件引用一个独立的原始影像数据文件。GDAL 的 PDS4 驱动在 frmts/pds/pds4dataset.cpp 中实现对 PDS4 影像数据提供完整的读写read-write支持并且支持影像存储在独立未压缩 GeoTIFF 文件中条带strip组织与原始影像文件兼容读写地理参考信息georeferencing、坐标系信息以及部分头部元数据为每个源波段附加一个掩膜波段mask band当像素值等于某个缺失常量missing constant时掩膜值为 0支持将 ASCII 定宽、二进制定宽以及分隔符CSV表格作为 OGR 矢量图层读取和写入从 GDAL 3.14 开始额外支持以只读方式打开使用 PNG 或 GeoTIFF/COG 图像的 browse 产品browse products。该驱动的初始实现由美国地质调查局USGS资助开发。PDS4 是包含 PDSPDS3与 ISIS3 的兄弟格式家族中的一员相关驱动文档见 PDS 驱动 与 ISIS3 驱动。从驱动能力声明见 pdsdrivercore.cpp 中的PDS4DriverSetCommonMetadata()可以确认PDS4 驱动同时具备栅格与矢量能力支持 CreateCopy、Create、CreateLayer/CreateField/DeleteField、虚拟文件系统Virtual IO、Z 几何GDAL_DCAP_Z_GEOMETRIESYES以及子数据集创建GDAL_DCAP_CREATE_SUBDATASETSYES。驱动可创建的数据类型包括Byte Int8 UInt16 Int16 UInt32 Int32 UInt64 Int64 Float32 Float64 CFloat32 CFloat64矢量字段支持Integer Integer64 Real String Date DateTime Time及Boolean子类型。文件识别与解析流程PDS4 驱动的识别逻辑位于 pdsdrivercore.cpp 的PDS4DriverIdentify()。判定一个文件是否为 PDS4 产品需要同时满足两个条件根元素为Product_Observational、Product_Ancillary、Product_Browse或Product_Collection之一内容中出现 PDS4 模式命名空间字符串://pds.nasa.gov/pds4/pds/v1。源码会分两轮检测如果首轮只命中其中一个条件且文件头不足 8192 字节会通过poOpenInfo-TryToIngest(8192)读取更多头部内容后再次判定避免因标签文件前 1024 字节未包含关键信息而误判。打开 XML 标签文件后pds4dataset.cpp 依次尝试定位Product_Observational、Product_Ancillary、Product_Collection根元素若最终匹配到Product_Browse则转入OpenBrowse()只读路径。在解析过程中File_Area_Observational、File_Area_Ancillary、File_Area_Inventory中的File节点给出实际影像文件名驱动据此定位原始数据文件Array系列元素Array、Array_2D*、Array_3D*被识别为栅格数组Table_Character、Table_Binary、Table_Delimited及Inventory被识别为矢量表标签中声明的missing_constant被映射为波段 NoData 值其余特殊常量special constants用于生成掩膜波段详见下文“掩膜波段”一节标签中的Display_Settings.Display_Direction会被读取vertical_display_direction为Bottom to Top或horizontal_display_direction为Right to Left时驱动会自动进行上下/左右翻转保证影像显示方向正确。元数据xml:PDS4 域PDS4 标签label的完整 XML 内容可以通过xml:PDS4元数据域获取。在Open()阶段驱动会将整个 XML 标签文件内容通过GDALDataset::SetMetadata(..., xml:PDS4)挂载到数据集上见 pds4dataset.cpp 中约第 2596-2605 行因此可以很方便地拿到序列化后的完整标签进行二次处理。反过来在创建数据集时也可以向SetMetadata()接口的xml:PDS4元数据域传入一个源模板标签source template label驱动会以此为基础生成输出标签。栅格数据掩膜波段与缺失值PDS4 标签中的missing_constant元素定义了数据缺失时使用的特殊像素值。GDAL 驱动将其映射为波段的 NoData 值同时每个源波段都会附带一个掩膜波段掩膜值为0 表示该像素等于某个缺失常量不可用255 表示正常像素。该机制的实现位于 pds4dataset.cpp 的PDS4MaskBand类掩膜波段数据类型固定为GDT_UInt8尺寸与源波段一致FillMask()模板函数将源波段每个像素值与所有特殊常量逐一比对命中则写 0否则写 255掩膜波段并非无条件创建当存在至少一个非missing_constant的特殊常量即“至少两个常量”或“仅一个常量但未设置 NoData”时才会实例化也可以通过配置项PDS4_FORCE_MASKYES强制生成掩膜见 pds4dataset.cpp 第 2561-2571 行。测试 autotest/gdrivers/pds4.py 中的test_pds4_read_hexadecimal_missing_constant与test_pds4_write_missing_constant分别覆盖了十六进制缺失常量读取与写回场景。因此在处理 PDS4 影像时建议始终结合掩膜波段或 NoData 值进行数据统计与分析避免把缺失值当作有效观测。打开选项矢量PDS4 驱动的打开选项仅作用于矢量表格数据通过-oo传入。这些选项在 pdsdrivercore.cpp 的GDAL_DMD_OPENOPTIONLIST中声明选项默认值说明LATLatitude包含纬度值的字段名LONGLongitude包含经度值的字段名ALTAltitude包含高程值的字段名WKTWKT包含 WKT 编码几何的字段名KEEP_GEOM_COLUMNSNO可选YES/NO是否将原始 x/y/geometry 列作为普通字段暴露这些选项在 pds4vector.cpp 中由CPLFetchBool(m_poDS-GetOpenOptions(), KEEP_GEOM_COLUMNS, false)等调用实际读取用于控制把经纬度列转换为 OGR Point 几何后是否保留原列。典型用法ogr2ogr out.shp my_pds4.xml -oo LATmy_lat_column -oo LONGmy_long_column栅格创建选项PDS4 驱动通过CreateCopy()与Create()接口支持创建新数据集并支持对已有数据集影像进行更新update。当使用CreateCopy()、gdal_translate或gdalwarp执行 PDS4 到 PDS4 的转换时驱动会尽可能保留原始标签内容可通过USE_SRC_LABELNO关闭该行为。全部创建选项在 pdsdrivercore.cpp 的GDAL_DMD_CREATIONOPTIONLIST中声明可归为“仅栅格”与“栅格矢量”两类。仅栅格Raster only创建选项取值默认值说明APPEND_SUBDATASET——向已有 PDS4 数据集追加新的子数据集详见“子数据集/多图像支持”一节IMAGE_FILENAMEfilename—覆盖默认的外部影像文件名IMAGE_EXTENSION—imgRAW/tifGEOTIFF覆盖外部影像文件的默认扩展名IMAGE_FORMATRAW、GEOTIFFRAW影像文件格式。RAW 将影像写入主文件名.img后缀的原始文件GEOTIFF 写入独立的.tifGeoTIFF 文件INTERLEAVEBSQ、BIP、BILBSQ影像文件的像素组织方式。BSQ 为按波段顺序Band SeQuential、BIP 为按像素交错Band Interleaved per Pixel、BIL 为按行交错Band Interleave per Line。BIL 不适用于IMAGE_FORMATGEOTIFFUSE_SRC_LABELYES、NOYESPDS4 到 PDS4 转换时是否使用源标签ARRAY_TYPEArray、Array_2D、Array_2D_Image、Array_2D_Map、Array_2D_Spectrum、Array_3D、Array_3D_Image、Array_3D_Movie、Array_3D_SpectrumArray_3D_Image设置定义数组类型的 XML 元素。多波段影像不支持Array_2D*使用Array_2D*时INTERLEAVE将被忽略ARRAY_IDENTIFIERstring—写入 Array 元素的标识符identifierUNITstring—Element_Array.unit的内容未提供时从源栅格波段复制其单位若源波段带单位CREATE_LABEL_ONLYYES、NONO若为YES且源数据集是 ENVI、GeoTIFF、ISIS3、VICAR、FITS 或 PDS3布局与 PDS4 支持的原始二进制格式兼容时只生成标签 XML 文件并引用源数据集的原始二进制文件。此时IMAGE_FILENAME、IMAGE_FORMAT、INTERLEAVE选项被忽略关于INTERLEAVE的三种模式可参考 GDAL 数据模型文档 doc/source/user/raster_data_model.rst 中 “Multiband pixel organization (INTERLEAVE metadata item)” 一节raster_data_model_interleave_mode锚点BIP 模式下同一像素的所有波段值连续存放如 3 波段影像排列为R1 G1 B1 R2 G2 B2 R3 G3 B3BSQ 模式则按波段顺序整块存放。从 GDAL 3.5 开始若源数据集是多波段且声明了INTERLEAVE元数据项而创建时未显式指定INTERLEAVE选项驱动会自动采用源数据集的交错方式。栅格与矢量通用Raster and vector创建选项取值默认值说明VAR_*string——若指定形如VAR_XXXXyyyy的选项模板标签中的任何{XXXX}字符串都会被替换为yyyyTEMPLATEfilename内置模板使用的模板标签。若未指定且不是从既有 PDS4 文件创建则使用 frmts/pds/data/pds4_template.xml 文件GDAL 工具要找到该默认模板需要在环境中定义 GDAL 数据目录Windows 构建尤其如此LATITUDE_TYPEPlanetocentric、PlanetographicPlanetocentriclatitude_type的值LONGITUDE_DIRECTIONPositive East、Positive WestPositive Eastlongitude_direction的值RADIIsemi_major_radius,semi_minor_radius—覆盖 SRS 中的半径值。注意第一个值semi_major_radius用于设置pds:semi_major_radius与pds:semi_minor_radiusXML 元素第二个值semi_minor_radius用于设置pds:polar_radius元素BOUNDING_DEGREESwest_lon,south_lat,east_lon,north_lat—手动设置包围盒PROPAGATE_SRC_METADATAYES、NOYES是否传播特定元数据域如json:ISIS3。为YES默认且IMAGE_FORMATGEOTIFF时这些元数据还会写入 GeoTIFF 文件默认模板与参数化变量默认模板 frmts/pds/data/pds4_template.xml 是一个标准的Product_Observational标签骨架其中以${VARIABLE}形式预留了可替换占位符包括${LOGICAL_IDENTIFIER}、${TITLE}Identification_Area${INVESTIGATION_AREA_NAME}、${INVESTIGATION_AREA_LID_REFERENCE}Investigation_Area${OBSERVING_SYSTEM_NAME}Observing_System${TARGET}、${TARGET_TYPE}Target_Identification同时构造urn:nasa:pds:context:target:${target_type}.${target}的 LID 引用。在命令行中这些变量通过-co VAR_xxx...形式填充源码中的VAR_*选项会执行{XXXX}→ 值的替换。图层创建选项矢量/表数据集从 GDAL 3.0 开始创建 PDS4 矢量数据集或向已有数据集追加新表时可使用以下图层创建选项-lco声明于 pdsdrivercore.cpp 的GDAL_DS_LAYER_CREATIONOPTIONLIST实现在 pds4vector.cpp 中图层创建选项取值默认值说明TABLE_TYPEDELIMITED、CHARACTER、BINARYDELIMITED创建的 PDS4 表类型。DELIMITED为 CSV 表文件逗号字段分隔符CHARACTER为定宽 ASCII 表BINARY为定宽二进制表。定宽表中 String 字段若在 OGR 字段定义中未显式设定宽度则使用 64 字节。只有DELIMITED支持将任意几何编码为 WKT 字符串另两种类型只支持以地理坐标LAT、LONG表示的点LINE_ENDINGCRLF、LFCRLF行结束符序列。仅当TABLE_TYPE为DELIMITED或CHARACTER时生效GEOM_COLUMNSAUTO、WKT、LONG_LATAUTO几何编码方式。AUTO模式下对DELIMITED表若输入几何为带地理 CRS 的 Point 图层则创建 LONG 与 LAT 列存储坐标其他几何类型使用 WKT 列。也可用WKT强制创建 WKT 列。定宽表类型只支持AUTO与LONG_LAT源码中GEOM_COLUMNSWKT only supported for delimited/CSV tablesCREATE_VRTYES、NOYES仅DELIMITED表是否在.csv文件旁生成 OGR VRTXML文件LAT—Latitude含纬度值的字段名。仅当几何来自带地理 CRS 的 Point 图层时使用LONG—Longitude含经度值的字段名。同上ALT—Altitude含高程值的字段名。同上WKT—WKT含 WKT 几何值的字段名表文件与 XML 文件位于同一目录并以 XML 文件名为前缀命名。例如创建foo.xml的 PDS4 数据集与bar图层将生成foo_bar.dat文件DELIMITED类型时为foo_bar.csv。子数据集与多图像支持若 PDS4 标签中存在多个 Array 对象它们会被报告为独立的子数据集subdataset通常主数据集是 Array3D而 backplane辅助平面以 Array2D 呈现。子数据集的命名格式由 pds4dataset.cpp 定义PDS4:xml_filename:file_area_index:array_index对应描述SUBDATASET_N_DESC形如Image file image_filename, array array_name。自 GDAL 3.0 起支持通过APPEND_SUBDATASETYES创建选项创建带子数据集的新数据集。一个重要限制PDS4 XML 标签中的地理参考信息对整数据集是全局的因此所有子数据集必须共享相同的地理参考信息——即坐标系、地理配准与分辨率必须一致。追加操作对 RAW 与 GEOTIFF 栅格均支持在追加模式下大多数创建选项被忽略仅INTERLEAVE针对 GeoTIFF 输出影像、ARRAY_TYPE与ARRAY_IDENTIFIER生效。对应测试包括 autotest/gdrivers/pds4.py 中的test_pds4_append_subdataset、test_pds4_append_subdataset_not_same_gt、test_pds4_append_subdataset_not_same_srs——后者明确验证了“追加子数据集时地理变换或 SRS 不一致会报错”的限制行为。栅格实战示例以下命令均来自驱动官方文档并经源码验证可直接运行。1. 列出波段与子数据集$ gdalinfo b0011_p237201_01_01v02.xml Driver: PDS4/NASA Planetary Data System 4 Files: b0011_p237201_01_01v02.xml b0011_p237201_01_01v02.qub Size is 512, 512 Coordinate System is Image Structure Metadata: INTERLEAVEBAND Subdatasets: SUBDATASET_1_NAMEPDS4:b0011_p237201_01_01v02.xml:1:1 SUBDATASET_1_DESCImage file b0011_p237201_01_01v02.qub, array Spectral_Qube_Object SUBDATASET_2_NAMEPDS4:b0011_p237201_01_01v02.xml:1:2 SUBDATASET_2_DESCImage file b0011_p237201_01_01v02.qub, array iof_r2 ... SUBDATASET_20_NAMEPDS4:b0011_p237201_01_01v02.xml:1:20 SUBDATASET_20_DESCImage file b0011_p237201_01_01v02.qub, array approx_phase_angle Corner Coordinates: Upper Left ( 0.0, 0.0) Lower Left ( 0.0, 512.0) Upper Right ( 512.0, 0.0) Lower Right ( 512.0, 512.0) Center ( 256.0, 256.0) Band 1 Block512x1 TypeInt16, ColorInterpUndefined Offset: 0.146998785514825, Scale:4.48823844390647e-06gdalinfo默认展示的是第一个子数据集SUBDATASET_1_NAME的信息。2. 查看指定子数据集$ gdalinfo PDS4:b0011_p237201_01_01v02.xml:1:23. 将指定子数据集转换为 GeoTIFF$ gdal_translate PDS4:b0011_p237201_01_01v02.xml:1:2 iof_r2.tif4. 转换全部子数据集$ gdal_translate -sds b0011_p237201_01_01v02.xml b0011_p237201_01_01v02.tif该命令会生成b0011_p237201_01_01v02_X.tif文件其中X1,...,N。5. 使用默认模板创建新 PDS4 数据集并填充参数化变量$ gdal_translate input.tif output.xml -of PDS4 \ -co VAR_TARGET_TYPESatellite \ -co VAR_TARGETMoon \ -co VAR_OBSERVING_SYSTEM_NAMELOLA \ -co VAR_LOGICAL_IDENTIFIERLunar_LRO_LOLA_DEM_Global_64ppd.tif \ -co VAR_TITLELRO LOLA Digital Elevation Model (DEM) 64ppd \ -co VAR_INVESTIGATION_AREA_NAMELunar Reconnaissance Orbiter \ -co VAR_INVESTIGATION_AREA_LID_REFERENCEurn:nasa:pds:context:instrument_host:spacecraft.lro6. 用 --optfile 文件管理长命令行当VAR_*参数过多导致命令行过长时可以把选项写入文本文件。先创建myOptions.txt#This is a comment #Conversion parameters for the LRO LOLA dataset -co VAR_TARGET_TYPESatellite -co VAR_TARGETMoon -co VAR_OBSERVING_SYSTEM_NAMELOLA -co VAR_LOGICAL_IDENTIFIERLunar_LRO_LOLA_DEM_Global_64ppd.tif -co VAR_TITLELRO LOLA Digital Elevation Model (DEM) 64ppd -co VAR_INVESTIGATION_AREA_NAMELunar Reconnaissance Orbiter -co VAR_INVESTIGATION_AREA_LID_REFERENCEurn:nasa:pds:context:instrument_host:spacecraft.lro #end of file然后执行gdal_translate input.tif output.xml -of PDS4 --optfile myOptions.txt--optfile的完整语义定义在 doc/source/programs/raster_common_options.rstraster_common_options_optfile锚点文件内容被读入并替换进命令行选项列表以#开头的行被忽略多词参数可用双引号括起也支持--optfile file1 --optfile file2多次使用。7. 使用非默认模板支持 HTTP 远程模板$ gdal_translate input.tif output.xml -of PDS4 \ -co TEMPLATEhttp://example.com/mytemplate.xmlTEMPLATE选项不仅支持本地文件名也支持 HTTP(S) 地址结合 GDAL 的/vsimem/内存文件机制见下例模板加载非常灵活。8. 从源 PDS4 数据集创建并做窗口裁剪将源 PDS4 数据集的 XML 文件作为隐式模板进行子集subsetting转换$ gdal_translate input.xml output.xml -of PDS4 -projwin ullx ully lrx lry9. Python 方式定制模板后创建数据集在 Python 中可以先用lxml修改模板内容再通过/vsimem/内存文件传给TEMPLATE选项from osgeo import gdal from lxml import etree # Customization of template template open(template.xml, rb).read() root etree.XML(template) ns {http://pds.nasa.gov/pds4/pds/v1} identifier root.find(.//{ns}Identification_Area/{ns}logical_identifier.format(nsns)) identifier.text new_identifier # Serialize the modified template in a in-memory file in_memory_template /vsimem/template.xml gdal.FileFromMemBuffer(in_memory_template, etree.tostring(root)) # Create the output dataset gdal.Translate(out.xml, in.tif, formatPDS4, creationOptions[TEMPLATE in_memory_template]) # Cleanup gdal.Unlink(in_memory_template)10. 向既有 PDS4 数据集追加新影像子数据集$ gdal_translate new_image.tif existing_output.xml -of PDS4 \ -co APPEND_SUBDATASETYES \ -co ARRAY_IDENTIFIERmy_new_image11. 为既有 ISIS3 数据集附加 PDS4 标签GDAL ≥ 3.1$ gdal_translate dataset.cub dataset.xml -of PDS4 -co CREATE_LABEL_ONLYYESCREATE_LABEL_ONLY的适用源格式ENVI、GeoTIFF、ISIS3、VICAR、FITS、PDS3在 autotest/gdrivers/pds4.py 中均有对应测试test_pds4_createlabelonly_envi、test_pds4_createlabelonly_gtiff、test_pds4_createlabelonly_isis3、test_pds4_createlabelonly_vicar、test_pds4_createlabelonly_fits、test_pds4_createlabelonly_pds3以及test_pds4_createlabelonly_gtiff_error验证不兼容布局会报错。需要注意的是GeoTIFF 场景下要求源文件具备与 PDS4 原始二进制兼容的布局且会通过PREEXISTING_BINARY_FILE注释标记见 pds4dataset.cpp 第 1980-1984 行使生成的标签直接引用源二进制文件。矢量实战示例1. 查看含表的 PDS4 数据集内容$ ogrinfo -al my_pds4.xml2. 指定经纬度列转换为 shapefile$ ogr2ogr out.shp my_pds4.xml -oo LATmy_lat_column -oo LONGmy_long_column3. 将 shapefile 转换为 CSV 分隔表隐式 WKT 列存储几何$ ogr2ogr my_out_pds4.xml in.shp默认TABLE_TYPEDELIMITED、GEOM_COLUMNSAUTO点且带地理 CRS 时生成 LONG/LAT 列其他几何类型自动使用 WKT 列同时默认生成配套的 OGR VRT 文件CREATE_VRTYES便于后续矢量操作。测试与源码导航核心实现frmts/pds/pds4dataset.cpp栅格读取/创建、子数据集、掩膜波段、browse 产品、frmts/pds/pds4vector.cpp矢量表读写、frmts/pds/pdsdrivercore.cpp驱动识别与全部选项声明。默认模板frmts/pds/data/pds4_template.xml。自动化测试autotest/gdrivers/pds4.py覆盖读取、UTM/投影 SRS 写入、经纬度 SRS、GeoTIFF 转换、子数据集追加、标签专用创建CreateLabelOnly、missing constant 读写、browse 产品PNG/TIFF、ISIS3 元数据传播等场景。相关格式驱动PDS 驱动、ISIS3 驱动。数据模型参考INTERLEAVE 三种像素组织方式的定义见 doc/source/user/raster_data_model.rst。小结PDS4 驱动是 GDAL 行星遥感生态中的关键一环对栅格它提供完整的读写、多子数据集、掩膜/缺失值处理、模板化标签生成与跨格式转换能力对矢量它支持三类表格式CSV、定宽 ASCII、定宽二进制与灵活的几何编码。掌握上述打开/创建选项与命令范式即可在 gdalinfo、gdal_translate、ogr2ogr 以及 Python 绑定中自如处理 PDS4 数据产品并为 LRO、MRO 等任务的行星影像分析流程构建可靠的数据管道。赞分享GIS遥感数据工程【免费下载链接】gdalGDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.项目地址https://gitcode.com/gh_mirrors/gd/gdal点击查看免费下载相关推荐Omaha服务器协议完全指南V2/V3版本对比与最佳实践Omaha服务器协议完全指南V2/V3版本对比与最佳实践 Omaha作为Google为Windows平台开发的更新框架其服务器协议是实现客户端与服务端高效通Apache MXNet RecordIO 数据格式完全指南图像数据集打包、读写与训练管线集成Apache MXNet RecordIO 数据格式完全指南图像数据集打包、读写与训练管线集成 导读 mxnet.recordio 是 Apache MXNe深度学习人工智能机器学习分布式训练gspread数据操作完全指南读写与格式化gspread数据操作完全指南读写与格式化 本文全面介绍gspread库在Google Sheets中的数据操作功能涵盖单元格数据读取与更新、批量操作与范围后端上一篇Kubeshark敏感数据过滤终极指南配置正则表达式屏蔽密码和Token下一篇DeepSpeed项目中CUDA设备端断言触发问题的分析与解决创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?