GDAL `--no-create-empty-layers` 选项详解:在矢量转换与矢量管道中避免输出空图层
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),仅供参考

相关新闻

用DEV C++实现《我的世界》核心玩法:从零搭建体素游戏原型

用DEV C++实现《我的世界》核心玩法:从零搭建体素游戏原型

简介:一份基于DEV C环境实现的简化版《我的世界》游戏源码,面向对C游戏开发感兴趣的编程爱好者,展示沙盒游戏核心机制的落地方法。资源共5个文件,压缩包仅14KB,包含C主程序、说明文档、网页预览及相关配置文件&#xf…

2026/10/12 1:22:44 阅读更多 →
Mininet实验课设指南:从环境搭建到报告撰写

Mininet实验课设指南:从环境搭建到报告撰写

简介:《计算机网络Mininet实验详解》是一份面向高校计算机网络课程实验与课设的PDF资料,适合正在学习网络协议、拓扑构建与OpenFlow控制器交互的学生使用。内容从需求分析与Mininet环境搭建讲起,完整覆盖VMware虚拟机安装、Xming与PuTTY图形界…

2026/10/12 1:22:44 阅读更多 →
ArkTS语法速成:TypeScript开发者迁移避坑指南

ArkTS语法速成:TypeScript开发者迁移避坑指南

从 TypeScript 转过来的朋友,第一次打开 DevEco Studio 建 ArkTS 工程时,心情大概和我一样:这玩意看着就是 TS,写起来却处处绊脚。报错信息一半是 ArkTS 编译器在提醒你"这里不许 dynamic"、"那里不许 any"&a…

2026/10/12 1:21:44 阅读更多 →

最新新闻

JanusGraph 核心能力与存储后端选型:从超大规模图处理到 CAP 权衡

JanusGraph 核心能力与存储后端选型:从超大规模图处理到 CAP 权衡

图数据库分布式数据库后端 【免费下载链接】janusgraph JanusGraph: an open-source, distributed graph database 项目地址: https://gitcode.com/gh_mirrors/ja/janusgraph 点击查看 免费下载 导读:本文围绕 JanusGraph 官方文档《The Benefits of Ja…

2026/10/12 2:03:07 阅读更多 →
Langchain01_框架之模型的创建与调用

Langchain01_框架之模型的创建与调用

模型创建3种方式 1.使用特定的Model Class(最直接,但不好用) LangChain为一些大模型供应商提供了专门的Model类,导入对应的具体类(如 ChatOpenAI、ChatAnthropic、ChatDeepSeek、ChatOllama、ChatHunyuan、ChatTongy…

2026/10/12 2:03:07 阅读更多 →
ET高级定制版与睿排引擎:从智能排版到可打印的完整工程实践

ET高级定制版与睿排引擎:从智能排版到可打印的完整工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:03:07 阅读更多 →
SQL练习题全解析:从建表到嵌套查询的避坑指南

SQL练习题全解析:从建表到嵌套查询的避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:03:07 阅读更多 →
MySQL存储引擎深度对比:InnoDB与MyISAM的差异、调优与迁移实践

MySQL存储引擎深度对比:InnoDB与MyISAM的差异、调优与迁移实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:03:07 阅读更多 →
PaperSpine 执行效率方法论:精确复用、昂贵操作凭证与有界失败恢复的工程实践

PaperSpine 执行效率方法论:精确复用、昂贵操作凭证与有界失败恢复的工程实践

AI 技能AI 写作人工智能深度研究AI 应用 【免费下载链接】PaperSpine PaperSpine5 — local-first, evidence-bound paper research, writing, figures, review and delivery. Download: https://wubing2023.github.io/PaperSpine/v5/ 项目地址: https://gitcode.co…

2026/10/12 2:02:07 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →