GDAL 矢量数据分区指南:用 `gdal vector partition` 按字段值、几何类型、要素数与文件大小拆分矢量数据集

发布时间:2026/10/12 16:32:09
GDAL 矢量数据分区指南:用 `gdal vector partition` 按字段值、几何类型、要素数与文件大小拆分矢量数据集 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 vector partition是 GDAL 3.12 引入的矢量处理命令它会把一个矢量数据集中的要素按照用户指定的属性字段值或几何类型以及可选的每文件要素数上限、文件大小上限分发写入到多个输出文件。本文基于 GDAL 官方文档gdal_vector_partition.rst并结合仓库源码gdalalg_vector_partition.cpp与测试test_gdalalg_vector_partition.py完整讲解其分区方案、全部命令行参数、文件名模式、管线集成方式与底层实现原理帮助你把大规模矢量数据快速切分为适合存储、查询与分布式处理的文件集合。命令概述与核心能力:program:gdal vector partition将要素分发到不同文件中分发依据有三类可按需组合按分区字段的值用户指定一个或多个属性字段或几何字段要素按其在这些字段上的取值被路由到不同输出文件按每文件最大要素数--feature-limit当某个分区的要素数超过上限时自动拆分为多个 part 文件按每文件最大文件大小--max-file-size当估算的文件大小超过上限时自动拆分。其中按字段分区是可选的从 GDAL 3.13 起--field不再是必填参数但不指定--field时必须指定--feature-limit和/或--max-file-size该约束在源码的AddValidationAction校验中强制执行见 gdalalg_vector_partition.cpp。输出目录为必填参数--output源码中通过SetRequired()标记见 gdalalg_vector_partition.cpp。默认情况下输出格式沿用输入数据集的驱动前提是能够判定且该驱动支持写入否则必须通过--format显式指定。此外gdal vector partition既可以独立运行也可以作为gdal vector pipeline管线的最后一步使用源码中CanBeLastStep()返回true见 gdalalg_vector_partition.h。两种分区方案hive 与 flat命令提供两种分区方案通过--scheme选择默认是hive常量定义见 gdalalg_vector_partition.h。hive默认嵌套目录分区hive 方案对应 Apache Hive 的分区约定每个分区字段对应一层嵌套目录。例如一个图层含有字段 continent 和 country二者都被选为分区字段那么 continent 取值为 Europe 且 country 取值为 France 的所有要素会被写入输出目录下的continentEurope/countryFrance/子目录中。实际目录布局含图层名层级为out_directory/ └── percent-encoded 图层名/ └── continentEurope/ └── countryFrance/ └── part_0000000001.gpkghive 目录命名遵循以下规则与源码BuildKey与PercentEncode逻辑一致见 gdalalg_vector_partition.cpp分区字段的NULL 值编码为目录名中的__HIVE_DEFAULT_PARTITION__非 ASCII 字符、空格、等号以及不符合目录名约束的字符会被百分号编码percent-encoded例如空格编码为%20。源码中保留字符集合为c 32 c 127且不属于:、/、\、、%、其余一律编码为%XX。测试 test_gdalalg_vector_partition.py 中可以直接看到这类布局的实际产物例如out/test/str_fieldone/part_0000000001.gpkg out/non%20spatial/str_field__HIVE_DEFAULT_PARTITION__/part_0000000001.gpkg其中图层名 non spatial 中的空格被编码为non%20spatialNULL 字段值目录为str_field__HIVE_DEFAULT_PARTITION__。flat平铺文件flat 方案下文件直接写在输出目录下无嵌套子目录默认文件名模式为{LAYER_NAME}_{FIELD_VALUE}_%010d。当没有分区字段时使用{LAYER_NAME}_%010d对应源码常量DEFAULT_PATTERN_FLAT_NO_FIELD见 gdalalg_vector_partition.cpp。例如out/test_one_0000000001.gpkg out/test_two_0000000001.gpkg完整参数说明程序专属参数Program-Specific Options参数说明--feature-limit FEATURE-LIMIT每个文件的最大要素数默认不限。超过该限制时自动创建多个 part 文件。源码中该参数最小值为 1SetMinValueExcluded(0)见 gdalalg_vector_partition.cpp。--field FIELD-NAME用于分区的属性或几何字段可重复指定多个。仅允许String、Integer、Integer64类型的属性字段顺序决定目录层级第一个字段是最外层目录。从 GDAL 3.14 起可指定几何字段名第一个几何字段的通用名是_ogr_geometry_按几何类型分区适用于单图层仅允许单一几何类型的文件格式如 Shapefile。旧的OGR_GEOMETRY名称已弃用源码中会输出弃用警告见 gdalalg_vector_partition.cpp。从 GDAL 3.13 起该参数不再必填。字段类型不合法时源码会报Field xxx not valid for partitioning. Only fields of type String, Integer or Integer64, or geometry fields, are accepted。--max-file-size MAX-FILE-SIZE每个文件的最大文件大小默认不限支持MB、GB后缀源码用CPLParseMemorySize解析见 gdalalg_vector_partition.cpp且最小不得低于 1 MB。超过限制时自动拆分。注意该值只是提示性上限不保证严格满足——因为写入过程中无法可靠获取真实文件大小命令基于启发式规则估算要素占用空间尤其是不假设任何压缩因此对压缩格式而言实际文件可能远小于设定值。--omit-partitioned-field是否从输出图层定义中剔除分区字段。对Parquet 输出 hive 分区时自动开启源码中bParquetOutput m_scheme SCHEME_HIVE强制置位见 gdalalg_vector_partition.cpp。--output OUTPUT-DIRECTORY输出目录根路径必填。--pattern PATTERN文件名模式支持替换变量详见下文文件名模式小节。默认值hive 方案为part_%010dflat 方案为{LAYER_NAME}_{FIELD_VALUE}_%010d。--scheme hive\|flat分区方案默认hive。标准选项Standard Options这些选项与 GDAL 其他矢量工具保持一致官方文档通过 include 引入对应文件均位于 gdal_options 目录--append以追加模式打开输出目录。要求目录已存在且输出格式支持追加写入源码检查驱动的GDAL_DCAP_UPDATE或GDAL_DCAP_APPEND能力见 gdalalg_vector_partition.cpp。该模式适合向已有分区数据集增量补充新要素追加时要素 FID 会被重置为OGRNullFID见 gdalalg_vector_partition.cpp。-f, --of, --format, --output-format OUTPUT-FORMAT输出矢量格式。可用值可通过gdal --formats | grep vector | grep rw | sort查询详见 of_vector.rst。--if, --input-format format输入驱动名用于跳过自动驱动探测可重复指定多个候选驱动详见 if.rst。--co, --creation-option NAMEVALUE数据集创建选项可重复具体选项依驱动而定详见 co_vector.rst。--lco, --layer-creation-option NAMEVALUE图层创建选项可重复详见 lco.rst。--oo, --open-option NAMEVALUE数据集打开选项格式相关可重复详见 oo.rst。--overwrite允许覆盖已存在的目标目录。默认若目标已存在则报错并提示使用--overwrite或--append详见 overwrite.rst。--skip-errorsGDAL 3.12忽略写入要素时的失败转为告警继续详见 skip_errors.rst。注意该选项会把事务单元降为每次一个要素向数据库写入时可能显著变慢。另外还有两个隐藏参数源码中SetHidden()标记见 gdalalg_vector_partition.cpp--max-cache-size N同时保持打开状态的最大数据集数量LRU 缓存默认 4000 表示不限--transaction-size N每个事务包含的最大要素数默认 65536仅对使用事务的格式生效。文件名模式--pattern详解--pattern接受用户自定义字符串支持以下替换替换符含义{LAYER_NAME}被替换为图层名必要时做百分号编码。{FIELD_VALUE}被替换为分区字段值必要时做百分号编码。多分区字段时各值以下划线_连接空字符串替换为__EMPTY__NULL 字段替换为__NULL__。%[0?][0-9]?[0]?dC 风格整数格式化符用于 part 编号。合法值例如%d、%05d。模式中必须且只能有一个part 编号占位符。默认值hive 方案为part_%010dflat 方案为{LAYER_NAME}_{FIELD_VALUE}_%010d。源码对--pattern的校验非常严格见 gdalalg_vector_partition.cpp模式中必须包含%字符且只能有一个%%之后必须紧跟合法的整数格式说明以d结尾即形如%[0][1-9][0]d编号位数必须在[1,10]范围内超过 10 位会报错Number of digits in part number specification should be in [1,10] range。例如patternmy_{LAYER_NAME}_%d_{FIELD_VALUE}会生成类似out/my_test_1_one.gpkg的文件名测试见 test_gdalalg_vector_partition.py 的 flat 方案用例。当某个分区文件达到限制后part 编号会递增如part_0000000001.gpkg、part_0000000002.gpkg源码中通过nFileCounter管理且在追加模式下会扫描目录中已有的最大编号继续递增见 gdalalg_vector_partition.cpp。实战示例官方文档提供了 5 个示例全部可直接运行示例 1按 continent 与 country 两个字段建立 hive 分区输出 Parquet$ gdal vector partition world_cities.gpkg out_directory --field continent,country --format Parquet注意--field传continent,country逗号分隔。hive 方案下会生成out_directory/layer/continentEurope/countryFrance/part_0000000001.parquet这样的层级。Parquet 输出会自动省略分区字段并在图层目录下生成_metadata文件源码中通过driver parquet create-metadata-file算法生成见 gdalalg_vector_partition.cpp使整个分区目录可作为一个 Arrow Dataset / Parquet 数据集被上层直接读取。示例 2按 country 分区并过滤人口大于 100 万的城市使用 flat 方案接入 pipeline$ gdal pipeline ! read world_cities.gpkg ! filter --where pop 1e6 ! partition out_directory --field country --format GPKG --scheme flat这里partition作为gdal pipeline的末步前面的filter步骤先完成条件过滤partition再对过滤后的要素流分区写出。测试test_gdalalg_vector_partition_preexisting_filter验证了 filter 与 partition 串联时输出正确见 test_gdalalg_vector_partition.py。示例 3按几何类型切分 GeoPackage生成多个 Shapefile$ gdal vector pipeline ! read input.gpkg ! set-geom-type --multi ! partition out_directory --scheme flat --field _ogr_geometry_ --format ESRI Shapefile--field _ogr_geometry_表示按第一个几何字段的几何类型分区GDAL 3.14。set-geom-type --multi先把单形single几何统一提升为多形multi从而把 POLYGON 与 MULTIPOLYGON、LINESTRING 与 MULTILINESTRING 归并到同一分区正好满足 Shapefile 单图层只能容纳单一几何类型的限制。测试test_gdalalg_vector_partition_geometry与test_gdalalg_vector_partition_geometry_multi_geom_fields覆盖了按 POINT / POLYGON / POINTZ / POINTM / POINTZM 及多几何字段分区的情况见 test_gdalalg_vector_partition.py。示例 4按要素数拆分文件每文件最多 100,000 个要素$ gdal vector partition world_cities.gpkg out_directory --feature-limit 100000 --scheme flat --format Parquet--feature-limit不指定--field也可单独使用GDAL 3.13。测试test_gdalalg_vector_partition_no_fields验证了无字段、仅按feature-limit分区时会生成part_0000000001.gpkg、part_0000000002.gpkg等多个文件见 test_gdalalg_vector_partition.py。示例 5先空间排序再按要素数拆分$ gdal vector pipeline read world_cities.gpkg ! sort ! partition out_directory --feature-limit 100000 --scheme flat --format Parquet先对要素做空间排序再按 100,000 个要素切分可得到空间上大致连续的分块利于分块索引与范围查询。输出格式的选择与限制默认沿用输入格式不指定--format时使用输入数据集的驱动作为输出驱动前提是该驱动声明了可识别的文件扩展名GDAL_DMD_EXTENSIONS。若无法推断例如内存数据集 MEM命令会报错Cannot infer output format. Please specify output-format argument测试见 test_gdalalg_vector_partition.py。输出驱动必须具备矢量创建能力源码要求驱动带GDAL_DCAP_VECTOR与GDAL_DCAP_CREATE能力见 gdalalg_vector_partition.cpp。追加模式要求驱动支持GDAL_DCAP_UPDATE或GDAL_DCAP_APPEND否则报错Driver xxx does not support update。输出格式会尽量保留输入图层的FID 列源码会检测驱动的FID图层创建选项并透传源 FID 列名见 gdalalg_vector_partition.cpp测试中断言了输出 GPKG 的GetFIDColumn() my_fid。与 gdal vector pipeline 的集成gdal vector partition是gdal vector pipeline中仅有的几种可作末步的步骤之一其余为read、concat、info、write、export-schema等见 gdal_vector_pipeline.rst。在管线内使用时语法为partition OUTPUT-DIRECTORY [选项...]例如gdal vector pipeline ! read in.gpkg ! partition out --field a,b。它支持**非物化on-demand**的要素流转——上游步骤过滤、排序、改几何类型后的要素流直接进入分区写出流程。注意该步骤自身不参与流式执行IsNativelyStreamingCompatible()返回false见 gdalalg_vector_partition.h因为它需要先获知全部可能的分区键。底层实现原理源码剖析分区键partition key的构造对每条要素命令按用户指定的字段顺序构造分区键字符串osKey见 gdalalg_vector_partition.cpp属性字段percent-encoded 字段名值String 字段值做百分号编码Integer/Integer64 按十进制写出NULL 用__HIVE_DEFAULT_PARTITION__标记几何字段按getGeometryName()输出几何类型名如POINT、POLYGON带 Z/M 维度时追加Z/M如POINTZ、POINTZM无几何为__HIVE_DEFAULT_PARTITION__多个字段用/连接正好映射为 hive 的嵌套目录层级。两遍扫描与 LRU 缓存分区前命令需要知道全部可能的分区键以便预创建输出文件。对不支持追加的格式源码会执行第一遍若只有单个非几何字段用SELECT DISTINCT field FROM layer [WHERE ...]的 SQL 高效收集去重值并保留上游属性过滤条件见 gdalalg_vector_partition.cpp否则遍历整个图层收集分区键到std::set。当去重键数超过max-cache-size默认 400时输出层数据集无法全部同时打开命令会分多遍处理源图层每遍只允许写入当前缓存容量内的一批分区键直到所有键处理完毕见 gdalalg_vector_partition.cpp。这也是max-cache-size直接决定内存占用与扫描遍数的原因。文件大小估算启发式--max-file-size的实现基于GetEstimatedFeatureSize()见 gdalalg_vector_partition.cpp每个要素按基础 16 字节 每字段 4 字节头 按类型估算的载荷计算文本格式按十进制字符数、二进制格式按sizeof估算几何按 WKB 大小计入并对 GPKG / FlatGeoBuf 的空间索引开销做了额外补偿见 gdalalg_vector_partition.cpp。文件大小从最小 65536 字节MIN_FILE_SIZE起累加。因此该参数是启发式近似值文档明确说明它可能不被严格满足——压缩格式的实际产物通常明显小于设定上限。事务与格式差异GPKG 与 SQLite 输出默认启用事务bUseTransactions每transaction-size个要素提交一次其他格式按需处理--skip-errors会禁用大事务并逐要素提交。Parquet 输出还会为每个分区目录生成_metadata文件汇总该目录下所有 parquet 文件的 schema 信息使得ogr.Open(PARQUET:out/test)可以像打开单个数据集一样查询整个 hive 分区目录测试见 test_gdalalg_vector_partition.py。覆盖保护--overwrite删除已有输出目录前会做安全校验确认其确实是由本工具生成的目录hive 方案要求存在含的一级分区子目录flat 方案要求无子目录否则拒绝删除并提示手动清理见 gdalalg_vector_partition.cpp。常见错误与注意事项速查场景错误信息处理建议未指定--field且未指定--feature-limit/--max-file-sizeWhen fields argument is not specified, feature-limit and/or max-file-size must be specified至少指定一种切分依据指定了不存在的字段Cannot find field xxx in layer xxx检查字段名--field支持命令补全字段类型不支持Field xxx not valid for partitioning...仅可用 String / Integer / Integer64 或几何字段无法推断输出格式Cannot infer output format. Please specify output-format argument显式使用--format目标目录已存在xxx already exists. Specify --overwrite or --append二选一追加或覆盖追加但格式不支持更新Driver xxx does not support update换用支持追加的格式--max-file-size小于 1 MBmax-file-size should be at least one MB增大取值--pattern缺少编号格式符Missing % character in pattern/pattern value must include a single %[0]?[1-9]?[0]?d part number specification模式中必须包含唯一一个%...d使用注意分区字段的值会进入目录名/文件名hive 方案要求字段值经百分号编码后仍满足文件系统约束对大基数分区字段取值种类极多建议结合max-cache-size评估内存与扫描开销--max-file-size是启发式提示不适用于需要严格按字节切分的场景。延伸阅读命令官方文档gdal_vector_partition.rst算法实现gdalalg_vector_partition.cpp、类定义 gdalalg_vector_partition.h自动化测试test_gdalalg_vector_partition.py管线集成gdal_vector_pipeline.rst通用选项co_vector.rst、lco.rst、oo.rst、if.rst、of_vector.rst、overwrite.rst、skip_errors.rst赞分享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 gdal vector edit 完全指南不改动要素地编辑矢量数据集的 CRS、几何类型与元数据GDAL gdal vector edit 完全指南不改动要素地编辑矢量数据集的 CRS、几何类型与元数据 gdal vector edit 是 GDAL 3GIS遥感数据工程GDAL Python Vector API 完全指南osgeo.ogr 矢量数据模型与实操GDAL Python Vector API 完全指南osgeo.ogr 矢量数据模型与实操 本文是 GDAL 仓库官方 Python 矢量 API 参考页GIS遥感数据工程GDAL OGR 特殊字段机制RFC 6 如何在 SQL 查询中按几何类型、WKT 与样式过滤矢量数据GDAL OGR 特殊字段机制RFC 6 如何在 SQL 查询中按几何类型、WKT 与样式过滤矢量数据 本篇围绕 GDAL/OGR 的 RFC 6GeomeGIS遥感数据工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询