GIS遥感数据工程【免费下载链接】gdalGDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.项目地址https://gitcode.com/gh_mirrors/gd/gdal点击查看免费下载导读本文围绕 GDAL 3.13 新增的共享命令行选项--no-create-empty-layers展开它用于在gdal vector convert、gdal vector pipelinewrite 步骤等矢量输出流程中跳过那些经过过滤或查询后不再产生任何要素的图层避免在输出数据集中生成空图层。读完本文你将掌握该选项的适用命令、使用语法、基于源码的预读缓冲实现原理以及它的限制与触发警告的条件能够直接将其用于实际的数据处理流程。一、选项定义与来源该选项的正式定义位于 no_create_empty_layers.rst全文核心内容如下.. option:: --no-create-empty-layers .. versionadded:: 3.13 Avoid creating layers to which no features will be written.即避免创建不会写入任何要素的图层。它是一个无参数取值的布尔开关从 3.13 版本开始提供。发行说明 NEWS.md 中对应的条目为gdal vector pipeline: add --no-create-empty-layers argument (#13921)在 GDAL 文档体系中doc/source/programs/gdal_options/目录下的.rst文件是共享选项片段会被多个程序的主文档通过.. include::机制引用。与本文档同目录的 append_vector.rst、overwrite.rst 等均为同一模式。--no-create-empty-layers由此被统一嵌入到多个矢量命令的标准选项章节中。二、适用命令与使用场景从文档 include 关系与源码注册位置可以确认该选项在以下命令中可用命令说明依据gdal vector convert矢量格式转换是最主要的应用入口文档 gdal_vector_convert.rst 的 Standard Options 章节源码 gdalalg_vector_convert.cpp 中SetNoCreateEmptyLayersArgument(true)gdal vector pipelinewrite 步骤矢量管道最后一步写出数据集源码 gdalalg_vector_write.cpp 中SetNoCreateEmptyLayersArgument(true)gdal vector check-coverage面覆盖检查仅独立命令模式注册源码 gdalalg_vector_check_coverage.cpp 中SetNoCreateEmptyLayersArgument(standaloneStep)gdal vector check-geometry几何有效性检查仅独立命令模式注册源码 gdalalg_vector_check_geometry.cpp 中SetNoCreateEmptyLayersArgument(standaloneStep)需要特别说明两点gdal vector check-coverage/gdal vector check-geometry的注册条件从源码看这两个算法以standaloneStep作为SetNoCreateEmptyLayersArgument(...)的入参即只有以独立命令方式而非作为管道中间步骤运行时才注册该参数。典型使用场景默认情况下矢量转换或管道写出时会为输入数据集的每个图层在输出中创建对应图层。当源图层经过--where属性过滤、空间过滤、--active-layer图层选择或 SQL 查询后不再产生任何要素时输出数据集中仍会出现一个空图层。--no-create-empty-layers正是为消除这类无效空图层而设计使输出数据集只包含真正有数据的图层。三、命令行用法与示例3.1 在gdal vector convert中使用gdal vector convert [--no-create-empty-layers] [-if input_format] [-of output_format] [--where sql] src_dataset dst_dataset例如将一个含多个图层的数据集转换为 GPKG同时跳过过滤后无要素的图层gdal vector convert --no-create-empty-layers --where EAS_ID1234567 \ input.shp output.gpkg当EAS_ID1234567在某个图层中不存在任何匹配要素时该图层将不会出现在output.gpkg中。3.2 在gdal vector pipeline的 write 步骤中使用矢量管道以!分隔各步骤--no-create-empty-layers作为write步骤的参数追加在目标路径之后gdal vector pipeline read src.gpkg \ ! filter --active-layer poly_1 --where EAS_ID1234567 \ ! write dst.gpkg --no-create-empty-layers该场景正是仓库自动化测试 test_gdalalg_vector_pipeline.py 所验证的源数据src.gpkg含poly_1、poly_2两个图层经filter步骤活动图层poly_1 不存在的属性值过滤后poly_1无要素最终输出dst.gpkg中仅保留poly_2图层及其 10 个要素图层数为 1。3.3 参数注册位置该参数由矢量管道步骤的公共基类GDALPipelineStepAlgorithm统一注册位于 gdalalg_pipeline.cppif (m_constructorOptions.addNoCreateEmptyLayersArgument) { AddArg(no-create-empty-layers, 0, _(Avoid creating layers to which no features will be written), m_noCreateEmptyLayers) .SetAvailableInPipelineStep(false); }其中参数值个数为 0表明它是无参布尔开关成员变量m_noCreateEmptyLayers默认值为false见 gdalpipelinestepalgorithm.h。四、底层实现原理预读缓冲机制从源码结构看--no-create-empty-layers的实现并非简单地写入时判断是否为空而是在写出前对源数据集做一次预读read-buffered包装核心代码位于 gdalalg_vector_write.cpp由两个内部类协作完成。4.1OGRReadBufferedLayer图层级预取该类的构造函数在初始化时立即调用一次GetNextFeature()将第一个要素缓存在内部OGRReadBufferedLayer(OGRLayer srcLayer) : m_srcLayer(srcLayer), m_poFeature(nullptr) { m_poFeature.reset(m_srcLayer.GetNextFeature()); }同时通过PeekNextFeature()暴露是否至少有一个要素的判定接口gdalalg_vector_write.cpp。若没有任何要素PeekNextFeature()返回nullptr。其GetNextFeature()走的是OGRGetNextFeatureThroughRaw模板先释放预取要素再补充读取下一个。4.2GDALReadBufferedDataset数据集级过滤GDALReadBufferedDataset在构造时遍历源数据集的所有图层只保留预取到至少一个要素的图层for (int i 0; i srcDS.GetLayerCount(); i) { auto poLayer std::make_uniqueOGRReadBufferedLayer(*srcDS.GetLayer(i)); if (poLayer-PeekNextFeature()) { m_layers.push_back(std::move(poLayer)); } }这样空图层在进入写出环节之前就被剔除了。GetLayerCount()/GetLayer()均基于过滤后的图层集合返回。4.3 写入主流程中的处理分支在 RunStep 中当m_noCreateEmptyLayers为真时if (m_noCreateEmptyLayers) { if (poSrcDS-TestCapability(ODsCRandomLayerRead)) { CPLError(CE_Warning, CPLE_AppDefined, Source dataset supports random-layer reading, but this is not compatible with --no-create-empty-layers. Attempting to read features by layer, but this may fail if the source dataset is large.); } poReadBufferedDataset std::make_uniqueGDALReadBufferedDataset(*poSrcDS); if (m_format stream) { m_outputDataset.Set(std::move(poReadBufferedDataset)); return true; } poSrcDS poReadBufferedDataset.get(); }有两个关键分支值得注意警告分支若源数据集声明支持ODsCRandomLayerRead随机图层读取能力例如 OSM 驱动及部分数据库驱动则发出CE_Warning提示该选项与随机图层读取不兼容将改为按图层顺序读取要素且在大数据集上可能失败。stream 分支当输出格式为stream管道中间流式传递的虚拟格式时预读缓冲数据集直接被设置为输出不再走后续的GDALVectorTranslate写盘流程。若输出为实际文件格式过滤后的缓冲数据集会作为GDALVectorTranslate的源最终只创建非空图层。五、测试用例验证仓库中的自动化测试从正反两面验证了该选项的行为test_gdalalg_vector_convert_no_create_empty_layerstest_gdalalg_vector_convert.py构造内存数据集复制poly.shp得到poly_1、poly_2两个图层对第一层设置不存在的属性过滤EAS_ID1234567使poly_1无要素启用no-create-empty-layers后断言输出GetLayerCount() 1。该测试以stream和MEM两种输出格式为参数化输入分别验证了流式分支与常规写出分支。test_gdalalg_vector_pipeline_no_create_empty_layerstest_gdalalg_vector_pipeline.py使用真实 GPKG 文件走read ! filter ! write --no-create-empty-layers管道断言输出图层数、图层名与要素数仅poly_210 个要素。test_gdalalg_vector_pipeline_no_create_empty_layers_random_layer_read_warningtest_gdalalg_vector_convert.py使用 OSM 驱动支持随机图层读取作为源启用该选项后断言产生CE_Warning错误文本为 Attempting to read features by layer与源码中的警告分支完全对应。这些测试证明了空图层确实被跳过、非空图层完整保留、支持随机读取的源会触发警告。六、注意事项与限制综合源码与测试使用该选项时有以下几点需要留意成本代价实现需要为每个源图层预取第一个要素每个图层至少一次GetNextFeature()调用因此对图层数量极多的数据集会引入额外读取开销。与随机图层读取源不兼容对于声明ODsCRandomLayerRead能力的数据源典型如 OSM该选项会触发CE_Warning级别的警告并退化为按图层顺序读取若数据集很大按图层顺序扫描可能失败需结合数据规模评估是否启用。行为语义该选项只影响是否创建空图层不影响图层过滤本身源图层因过滤无要素是正常前置条件若希望先剔除空图层再转换可组合--where、--active-layer等过滤参数使用。版本前提该选项需要 GDAL 3.13 及以上版本见 no_create_empty_layers.rst 的versionadded标记旧版本命令解析器不认识该参数。命令覆盖范围它以共享选项形式集成在gdal vector convert、gdal vector pipelinewrite 步骤中对于gdal vector check-coverage、gdal vector check-geometry仅在独立命令模式下生效。七、延伸阅读共享选项定义no_create_empty_layers.rstwrite 步骤完整实现gdalalg_vector_write.cpp管道参数注册gdalalg_pipeline.cpp主命令文档gdal_vector_convert.rst、gdal_vector_check_coverage.rst、gdal_vector_check_geometry.rst自动化测试test_gdalalg_vector_convert.py、test_gdalalg_vector_pipeline.py赞分享GIS遥感数据工程【免费下载链接】gdalGDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.项目地址https://gitcode.com/gh_mirrors/gd/gdal点击查看免费下载相关推荐GDAL 矢量算法 GDALG 输出将 gdal 命令序列化为 JSON实现按需流式矢量数据集GDAL 矢量算法 GDALG 输出将 gdal 命令序列化为 JSON实现按需流式矢量数据集 GDALGGDAL ALGorithm输出格式允许把GIS遥感数据工程GDAL gdal convert 命令详解一次调用自动完成栅格与矢量格式转换GDAL gdal convert 命令详解一次调用自动完成栅格与矢量格式转换 gdal convert 是 GDAL 3.11 起引入的顶层转换命令它本身GIS遥感数据工程GDAL --append 矢量图层追加详解从命令行到源码实现GDAL append 矢量图层追加详解从命令行到源码实现 导读 本文聚焦 GDAL 新版命令行体系3.11 起引入的 gdal vector 系列子命令GIS遥感数据工程上一篇AutoUnipus智能教育时代的学习效率革命下一篇MaiBot Dashboard 深度指南基于 React 19 TypeScript Vite 的 WebUI 管理面板架构与开发实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考