摘要: GDAL/OGR 3.8.0 已于近日发布。GDAL/OGR 是一个用于栅格和矢量文件格式、数据库和 Web 服务的 C++ 地理空间数据访问库。它包括多种语言的绑定以及各种命令行工具,网址:http://gdal.org/。 3.8.0 版本是一个新的功能...
GDAL/OGR 3.8.0 已于近日发布。GDAL/OGR 是一个用于栅格和矢量文件格式、数据库和 Web 服务的 C++ 地理空间数据访问库。它包括多种语言的绑定以及各种命令行工具,网址:http://gdal.org/。
3.8.0 版本是一个新的功能版本,具有以下亮点:
- 为 OGC 特征和几何 JSON 添加 JSONFG 读/写矢量驱动程序
- 为包含 MVT PBF 切片的 PMTiles v3 数据集添加 PMTiles读/写矢量驱动程序
- 为 S-102 测深产品添加 S102 光栅只读驱动程序(取决于libhdf5)
- 添加
gdal_footprint
实用程序:计算光栅文件的占用空间, 考虑到 nodata/mask band, 并生成与像素有效区域相对应的多边形/多边形 (#6264
) - Python 绑定:各种增强功能可减少与对象间所有权关系相关的“陷阱”数量, 以及一些语法糖增强功能
- 箭头接口:改进读取侧的空间和属性过滤; 使用 OGRLayer::WriteArrowBatch() 添加写入侧
- GeoPackage:空间索引创建速度更快(大约快 3-4 倍)
- ARG 驱动程序已弃用:将在 3.9.0 中删除
- 共享库主要版本的碰撞
以下是有关 3.8.0 版本中的新功能和修复的更多完整信息,也可访问(https://github.com/OSGeo/gdal/blob/v3.8.0/NEWS.md):
GDAL/OGR 3.8.0 发行说明
GDAL/OGR 3.8.0 是一个功能版本。这些注释包括自 GDAL 3.8.0 以来的更改,但尚未包含在 GDAL 3.7.x 错误修复版本中。
兼容性问题
请参阅 MIGRATION_GUIDE.TXT
(https://github.com/OSGeo/gdal/blob/release/3.8/MIGRATION_GUIDE.TXT)。
新的可选依赖项
libaec 在 GRIB 驱动程序中启用 CCSDS 自适应熵编码解压缩。
Build
- 当由于
OGR_BUILD_OPTIONAL_DRIVERS=OFF
而无法启用光栅驱动程序时, 发出更好的错误消息 - 改进 CURL 和 EXPAT 的静态链接
- Java 绑定:更改 JNI 共享库的默认安装目录并使用
GDAL_JAVA_JNI_INSTALL_DIR
控制 - 如果
-DOGR_ENABLE_DRIVER_GPKG=ON
,则自动启用 SQLite 驱动程序 - 如果禁用,请勿使用 libjpeg(且 libjpeg-turbo >= 3.0 可用)(
#8336
) gdal.pc
生成:使用CMAKE_INSTALL_INCLUDEDIR/CMAKE_INSTALL_LIBDIR
作为 includedir/libdir (#8012
)gdal-config
:添加--plugindir
开关 (#8012
)
GDAL 3.8.0 - 变更概述
Port
- 添加 third_party/fast_float 库以实现
CPLStrtodDelim()
的快速字符串->双重转换; - /vsimem/:使其在多线程场景下可以安全使用;
- /vsimem/:创建文件时隐式创建父目录;
CPLParseXML()
:不调用CPLErrorReset()
;- CPLJSon:为
uint64_t
添加设置器; - 添加具有原始类型的 CPLJSONArray::
AddNull()
和 CPLJSONObject 构造函数; - VSIUnixStdioHandle / VSIWin32Handle:使
Close()
可多次调用,以便与
VSIVirtualHandleUniquePtr 友好 - /vsicurl/: 避免从并发线程同时下载同一区域 (
#8041
) - /vsicurl/ / /vsicurl_streaming/:识别
IGNORE_FILENAME_RESTRICTIONS=YES
打开选 项以跳过任何基于扩展的过滤 (#8162
) - /vsicurl/:如果使用无效的
CPL_VSIL_CURL_CHUNK_SIZE
和
CPL_VSIL_CURL_CACHE_SIZE
值, 则会发出警告 (#8499
) - /vsicurl_streaming/:如果设置了
GDAL_HTTP_MAX_RETRY
,则实施重试策略 - /vsis3_streaming/ 等:通过转发到非流文件系统来实现
ReadDir()
(#8191
); - IVSIS3LikeFSHandler::
CopyFile()
:使用非流式源重试以提高稳健性; - /vsis3/ 和 /vsioss/:重定向/区域发现管理不易出错
- /vsiaz/:不要为从
.gdal_marker_for_dir
特殊文件推导的目录附加尾部斜杠 - /vsiaz/:实现从 /vsis3/、/vsigs/、/vsiadls/、/vsicurl/ 到 /vsiaz 的服务器端复制
- /vsiaz/:修复当源和目标都是 /vsiaz/ 但位于不同存储桶时的
CopyObject()
; - /vsiaz/:
GetSignedURL()
更新到版本 2020-12-06, 限制为 https 并使用 blob 资源类型; - /vsi 网络文件系统:通过在本地复制删除文件的初始内容, 支持
CPL_VSIL_USE_TEMP_FILE_FOR_RANDOM_WRITE=YES
下的 r+ 访问; VSISync()
网络到网络:实现 SyncStrategy::TIMESTAMP;- 添加
VSIGetCanonicalFilename()
; CPLvsnprintf()
:处理'%.*f'
格式;- VSIFilesystemHandler:从
ReadDir()
中删除“虚拟”限定符, 现在将其转发到ReadDirEx()
;修改所有实现以实现ReadDirEx()
; - 添加/vsicached?虚拟文件系统,作为与
VSICreateCachedFile()
/VSI_CACHE=YES
相同的另一种方法; - VSIFilesystemHandler:
CopyFile()
:检测源文件大小的错误目标文件大小; - /vsi7z/:接受 ArcGIS Pro 项目包扩展;
cpl_vsil_win32
:检查FlushFileBuffers()
的返回值, 仅当 access=w 或 wb 时才使用;- GENERIC_WRITE 打开文件;
cpl_vsil_win32
:实现WRITE_THROUGH=YEs
选项以传递给VSIFOpenEx2L()
;
Core
GDALIdentifyDriverEx()
和 GDALDriver::QuietDelete()
:不调用
CPLErrorReset()
;- GDALDataset::
Open()
:考虑OF_SHARED
模式的打开选项 (#7824
) - PAM .aux.xml:从 Esri GeodataXform.CoeffX/CoeffY 元素读取地理变换 (
qgis/ QGIS#53125
); - 添加 DCAP_FLUSHCACHE_CONSISTENT_STATE 功能, 并修复 GeoJSON、JSONFG、GPKG 驱动程序来实现;
- 概述/RasterIO 重采样:使用 Float64 作为 Float64 输入数据的工作数据类型 (
#8187
) - 添加 GDALRegisterPlugins 函数来注册所有/仅插件 (
#8447
); - GDALDriver::DefaultCreateCopy():在非严格模式下, 将(忽略的)错误视为警告,并且不将其静音;
- 添加 GDALPamDataset::
SetDerivedDatasetName()
方法,并使用它能够保存 GDALMDArray::AsClassicDataset()
返回的数据集的统计信息; - 添加
GDALGetSubdatasetInfo()
及相关函数 (#8155
);
多维 API
- 添加
Rename()
方法,在 MEM、netCDF、Zarr 驱动程序中实现; - 添加
DeleteGroup()
、DeleteMDArray()
、DeleteAttribute()
方法, 在 MEM、netCDF(用于属性)和 Zarr 驱动程序中实现; - GDALDatasetFromArray:修复写入/更新支持;
- GDALMDArrayMask:在构造时考虑属性;
GetMask()
:添加UNMASK_FLAGS
选项;- GDALMDArray::
ComputeStatistics()
:添加选项以在计算统计数据时在 netCDF 和 Zarr 中 设置实际范围 - GDALMDArray::
AsClassicDataset()
:添加LOAD_EXTRA_DIM_METADATA_DELAY
选项, 并将其公开在 Zarr 驱动程序中; - GDALMDArray::
AsClassicDataset()
:允许使用BAND_METADATA
选项将波段索引数组映 射为波段元数据项; - 添加 GDALGroup::
SubsetDimensionFromSelection()
算法
- 扭曲平均重采样:使用加权增量算法平均值来实现数值稳定性;
- Warper:合理时自动启用
OPTIMIZE_SIZE
扭曲选项 (#7761
); - Geoloc 转换器:如果输入数据集的宽度或高度大于 geoloc 数组,则会发出警告 (
#7751
); GDALCreateGenImgProjTransformer2()
:处理反子午线周围 GCP 的不连续性
(#8371
);- TPS 转换器:使用迭代方法来细化逆变换 (
#8572
);
光栅驱动程序
AAIGRID 驱动程序:
- 写作:删除每行的前导空格(
#8344
)
ARG 驱动程序:
- 将其标记为已弃用,计划在 GDAL 3.9 中删除(
#7920
)
BAG 驱动程序:
- 提高从细化网格获取深度和不确定性值的效率
- 使用低分辨率网格作为
MODE=RESAMPLED_GRID
中的最后一个概览级别 - 添加
MODE=INTERPOLATED
模式,主要使用细化网格节点的双线性插值
COG 驱动器:
- 如果指定了
IGNORE_COG_LAYOUT_BREAK=YES
打开选项,则仅更新模式 (#7735
) - 添加
STATISTICS=AUTO/YES/NO
创建选项并将gdal_translate -stats
转发给它 (#8169
) - Lerc:添加
MAX_Z_ERROR_OVERVIEW
创建选项以单独控制全分辨率图像之一的概览的错误阈 值
ENVI 驱动程序:
如果将不同的节点数据值分配给不同的波段,则会发出警告 支持 Int 64和 UInt 64
ESRIC 驱动程序:
- 实现 ESRI Tile Package (
.tpkx
) 支持 (#7799
)
GRIB 驱动程序:
- 允许打开具有无效地球形状的文件 (
#7811
) - 实施CCSDS自适应熵编码解压缩。需要 libaec (
#8092
) - 当存在尾随字节时,仅发出
CPLDebug()
而不是标准输出上的消息 (#8574
) - GRIB2 SRS 编写:添加对旋转 LatLong 网格的支持(修复
#8536
)
GTiff 驱动程序:
- 性能改进:在写入整个块时避免使用块缓存(在某些情况下最多快两倍)
- GTiff 多线程阅读器:捕获工作线程中发出的错误并在主线程中重新发出它们
- 内部 libtiff:WebP 编解码器:创建无损文件时打开精确模式, 以避免更改 alpha=0 区域中的 R、G、B 值 (
#8038
) - Lerc:添加
MAX_Z_ERROR_OVERVIEW
创建选项以单独控制全分辨率图像之一的概览的错误阈值 - SRS 编写器:在
.aux.xml
中编写作为伪复合构建的投影 3D - 内部 libtiff 和 libgeotiff:与上游重新同步
HDF5 驱动程序:
- 优化
RasterIO()
的代码路径,无需重新采样 - multidim:加速
IRead()
非常慢的情况
ISG 驱动程序:
- 使其能够读取 > 1024 字节的标头
- 纳入ISG格式2.0
JPEG 驱动程序:
- 允许质量降至 1
- 将 JPEG“输出消息”重定向到 GDAL 调试消息
- 只考虑找到的第一个 Exif 目录
MBTiles 驱动程序:
- 添加 WEBP 支持 (#8409)
MEM 驱动程序:
- 为带交错数据分配单个缓冲区
netCDF 驱动程序:
- 读取时,以按需方式设置
NETCDF_DIM_xxx
带元数据项(有助于网络访问) - 出于性能原因,不要为网络访问上无限维度的变量设置
NETCDF_DIM_xxxx_VALUES
数据集元数 据项 - 无法从 /vsi 读取时出现更好的错误消息(
#8398、#8378
) - 重新标准化 CRS 并将地理转换为公制,通常适用于 EUMETSAT OSI SAF 产品。添加
PRESERVE_AXIS_UNIT_IN_CRS=YES/NO
打开选项 - 添加对 EMIT 带数据排序和地理位置数组的支持(使用
glt_x/glt_y
进行多维 API)
NITF 驱动程序:
- 添加对来自 GLAS/GFM SDE 的 CSCSDB(通用传感器协方差支持数据)DES 的支持
OpenFileGDB 栅格:
- 添加对 FileGDB v9 栅格数据集的支持
- 添加带有 RasterDataset 名称的
RASTER_DATASET
元数据项 (#8427
)
PDF 驱动程序:
- PDFium 后端:更新以支持(并要求)PDFium/5952
- Poppler 后端:通过调整 DPI 值实现概览 (
#8233
) - PoDoFo 后端:添加对 PoDoFo >= 0.10.0 的支持 (
#8356
) - 增加阈值来检测图块大小和带数(
#8236
、#8240
) - 各种稳健性修复
PRF 驱动器:
- 添加关联的 PRJ 文件读取
Sentinel2 驱动程序:
- 附加元数据 (
#8379
)
TileDB 驱动程序:
- 添加读/写多维支持(需要 libtiledb >= 2.15)
- TileDBRasterBand::IRasterIO():使用正确的带索引
- 读/写 Int8、Int64 和 UInt64
- 添加读取任意(即不是由 GDAL 创建的)2D/3D 密集数组的功能(前提是它使用 uint64 维度)
- 添加对 TileDB 2.17 的支持
VRT 驱动程序:
- 添加norm_diff(
#8081
) min 和 max 像素函数 (#8292
) - 根据记录和预期,当存在外部
.vrt.ovr
时忽略 - vrt:// 连接字符串:添加projwin, projwin_srs, tr, r, srcwin, a_gt, oo, scale, unscale, a_coord_epoch, nogcp, eco, epo
- VRRTComplexSource(通常缩放):确保考虑
RasterIO()
中 VRTRasterBand 数据类型的约束(而不仅仅是考虑输出缓冲区数据类型) IRasterIO()
:使用非最近重采样进行下采样时避免源边界处的边缘效应- VRTMDArraySourceFromArray:修复时考虑到 relativeToVRT=1
- 允许包含 2D 多维数组的元素作为 VRTRasterBand 源, 并通过使用可以通过切片、转置、重采样、网格化等从 3D 或多维数组创建 2D 数组
- VRTCplexSource:性能改进:仅在 Byte/UInt16/Int16 数据类型的 NODATA 时添加专门化
- VRTSimpleSource::
GetFileList()
:不要发出stat()
, 因为它在网络驱动器上可能会很慢 - VRTSourcedRasterBand::
GetMinimum/GetMaximum()
:迭代源时最大限制为 1 秒 - VRTSourcedRasterBand::
GetMinimum/GetMaximum()
:首先使用STATISTICS_MINIMUM/ MAXIMUM
元数据
WCS 驱动程序:
从“DescribeCoverage”请求中删除非标准“FORMAT”参数 (#8381
)
Zarr 驱动程序:
- 允许经典模式下的更新支持
- Zarr V3:更新到当前规范(破坏向后兼容性)
- 实现 GDALDriver::
Rename()
、Delete()
和CopyFiles()
- 读取图块数据文件时忽略文件名限制 (
#8162
) - 添加
MULTIBAND=YES/NO、DIM_X
和 DIM_Y 打开选项 (#8237
) - 经典栅格 API:将多波段数据集写入 Zarr 3D 数组(可以使用
SINGLE_ARRAY=NO
创建选项将 它们写入 GDAL 3.7 中的多个 2D 数组) - 修复写入部分图块的问题