ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

GISBox v2.1.5 核心功能:GeoParquet、批量任务与栅格裁剪

GISBox v2.1.5 核心功能:GeoParquet、批量任务与栅格裁剪 GISBox v2.1.5 的更新公告发出来当天我就把旧版本卸了直接换成新版。作为平时天天跟各种 GIS 数据格式打交道的从业者这个版本补上了几个我盼了很久的功能尤其有两个直接把日常工作里最挠头的工作流给缩短了一大截。这篇文章不打算照着官方更新日志复读一遍而是想把我升级后连着跑了几天实际项目观察到的新功能、具体怎么上手、以及踩过的坑都梳理出来给还在犹豫要不要升级的朋友一个参考。整体结论先说如果是 v2.0.x 的老用户v2.1.5 值得尽早升如果你是刚入行、正在找顺手 GIS 工具箱的新手直接从 v2.1.5 起步也没问题。1. v2.1.5 这次更新为什么值得专门写一篇先说版本定位。GISBox v2.1.5 不是那种只修了几个 bug 的小补丁版本而是把日常批量处理这条线彻底补全的一版。以往这种桌面级 GIS 工具箱最尴尬的地方在于功能点零零散散都有但真要用来跑批量任务要么需要去写脚本要么得配合命令行工具门槛一下就上来了。v2.1.5 这个版本把批量任务队列、断点续跑、按矢量裁剪栅格这几件事放到了图形界面里而且是能直接落地的程度。我在同一台笔记本上跑了 200 多个矢量文件的坐标转换和裁剪全程没有碰命令行这一点是旧版本做不到的。还有一点让我比较满意的是它对大文件的预览速度做了明显优化。以前打开一个 2GB 左右的 GeoTIFF就算只是缩放浏览也要等好几秒v2.1.5 里做了金字塔加速和分块读取之后拖动和缩放明显跟手了。这对经常需要先看一眼数据再决定怎么处理的场景非常有用省下来的时间看着零碎攒一个月就相当可观。从社区反馈和我的实测来看这个版本的定位很清晰它并非要跟重型 GIS 平台抢饭碗而是专门解决数据转换、坐标统一、切片发布这类重复性极高的脏活累活。如果你手头有大量 Shapefile、GeoTIFF、CAD 文件需要整理或者需要定期生成瓦片供 Web 地图使用v2.1.5 应该是目前效率提升最明显的一个版本。1.1 更新清单速览先用表格看清全貌把更新日志里的东西按实际区别感受重新整理了一遍列几个关键项。看了表格之后下面几节再逐个拆解。更新项版本前的体验v2.1.5 的变化对我工作的影响GeoParquet 读写不支持得装独立工具原生导入导出保留空间信息大数据量矢量文件传输、入库快了很多批量任务队列单任务排队失败要手动管支持并发、失败重试、断点续跑200 个文件可以一口气跑按矢量边界裁剪栅格要配 GDAL 命令行图形界面直接选边界文件裁剪和坐标转换可以在一个工程里完成大体积影像预览打开慢、拖动卡分块读取预览速度提升处理前快速目视检查更方便中文路径兼容部分场景乱码增加兼容选项存量项目直接打开不折腾当然这里列的是对我这种做地信数据处理的人最有感知的几项。如果你主要用 GISBox 做瓦片发布可能对分块切片性能提升的感受会更明显。说到底工具升级值不值得取决于它有没有戳中你的高频场景而不是看更新日志写了多少条。1.2 我的升级动因为什么劝你速更我判断一个软件该不该升级就看一个指标它能不能让我在同样的时间里少做一些重复劳动。v2.1.5 恰好踩中了这个点。它加入了真正的批量任务概念而不是之前的一个接一个手动点。老版本里我要处理一百个文件就得在文件列表里一个个添加、一个个确认设置然后等一个跑完再跑下一个。新版把这件事变成了导入一组数据、统一设置参数、启动队列、回来看结果。另外新版本里导入导出格式覆盖更完整了。我最近做项目时经常收到各种来源的数据除了传统的 Shapefile、GeoJSON越来越多上游方会直接给 Parquet 格式的表格数据里面带有空间字段。以前处理这种数据得先把它读进 Python用 GeoPandas 转换再导出来现在 GISBox 可以直接读写 GeoParquet等于把中间步骤砍掉了。这种改进不是那种看起来高大上但用不上的功能而是每天都会用到的刚需。所以从效率提升的角度这次升级没有什么好犹豫的。要担心的反而是怎么平滑过渡这一点我会在文章最后一节专门讲。2. 核心新功能拆解三个真正值得上手的功能把这次更新最打动我的三个功能挑出来分别讲讲它们解决什么问题、怎么用、以及我在使用中总结的细节。这三个功能分别是 GeoParquet 的读写、批量任务队列、按矢量边界裁剪栅格。2.1 GeoParquet 读写大数据量矢量文件的传输救星GeoParquet 简单说就是基于 Apache Parquet 的列式存储格式专门在文件里加了地理空间元数据能记录坐标系、几何类型这些信息。普通 Parquet 格式在数据分析和数据湖场景下已经很流行了列式存储的好处是查询时只读需要的字段整体压缩率高。GeoParquet 把这张表格的空间属性补上之后就成了处理大规模矢量数据的利器。举一个我实际遇到的例子之前一个项目里对方发来了 1.2GB 的 GeoJSON 文件里面是几百万个地块多边形。GeoJSON 是文本格式同样的数据如果用 GeoParquet 存体积能压到 300MB 左右加载速度也有质的提升。在 GISBox v2.1.5 里这个转换不需要额外配置直接把 GeoJSON 拖进去导出格式选 GeoParquet 就行。有个细节值得注意导出时可以选压缩方式默认是 snappy理论上 zstd 压缩率会更好一点但如果后面还要用 Spark 或旧版工具去读建议保持 snappy 兼容性更好。实操步骤很简单把源数据文件Shapefile、GeoJSON、DWG 等都行拖入 GISBox 输入列表。在输出设置里选择 GeoParquet输出目录自己定。如果源数据没有定义坐标系需要在数据属性里先指定坐标系再导出。点击执行生成文件后可以用 GISBox 自带的数据预览确认空间位置是否正确。另外一个常见做法是反过来把 GeoParquet 转成传统 GIS 格式。比如数据团队给了一大批 Parquet 文件需要转成 SHP 给外业同事用GISBox 同样直接支持。实测下来 100 万行左右的点数据转换只需要几十秒。要提醒一句GeoParquet 在字段类型上做了很多优化转回 SHP 后有些字段类型可能改变比如 Int64 变小或文本字段被截断这个问题我在第四节专门讲。2.2 批量任务队列并发、排队与断点续跑的配合批量任务队列是 v2.1.5 里我觉得最实用的一个改动。以前处理大量文件基本操作是选中一个文件 - 设置参数 - 执行 - 等它完成 - 下一个整个过程人必须盯着完全没有解脱。现在理论上一批任务设置好之后就可以干别的事去了。界面里把任务队列单独做了一个面板你可以在同一个输入列表里添加多个文件然后为每个文件指定独自的转换规则也可以一次统一规则。我刚开始用的时候犯了个错误以为批量就是所有文件用同一套参数结果发现每个文件其实可以单独设置甚至可以在列表里混合转 SHP和转 GeoParquet两种任务。这样灵活性更高适合处理一个目录下多种来源的数据。队列任务可配置的参数主要有三个在实际使用里非常关键并发任务数我实测在 8 核 16GB 内存的机器上默认值 2 最稳妥调到 4 会出现短暂的磁盘瓶颈但对 SSD 来说影响不大。笔记本用户建议保持默认台式机可以开到 3 到 4。失败重试次数如果数据源里偶尔有坏文件把重试次数设为 2配合任务跳过机制基本可以无人值守跑完全部任务。失败后继续勾选之后某个任务失败不会中断队列跑完后你只需要看日志和汇总列表。断点续跑是这次的大亮点。老版本在批量生成瓦片时如果中途断电之前生成的缓存基本全部作废只能从头再跑一遍。v2.1.5 会把已完成的任务标记成完成状态重启软件后你可以选择继续未完成队列已经生成好的分块直接跳过。上次我跑了将近 5 个小时的切片任务跑到一半电脑因为我关掉外部电源突然休眠重启后继续从断点开始硬是省了将近两个小时。2.3 按矢量边界裁剪栅格终于不用敲命令行这个功能对我这种人来说太实用了。以前用 GDAL 的 gdalwarp 按矢量边界裁剪栅格虽然能实现但每次写参数都小心翼翼尤其要处理缓冲区、NoData 值、输出类型这些细节稍不注意裁出来的影像边缘就出现黑边或锯齿。v2.1.5 把这个流程搬到了图形界面直接选一个矢量边界文件就能对单个或多个栅格进行裁剪。操作时需要注意的核心参数有这几个裁剪边界可以选正在处理的栅格对应的矢量范围也可以选另一个图层。如果你要把县域边界裁到遥感影像上直接选国标行政边界就行。外扩距离默认是 0也就是严格按边界裁切。但我建议在需要做影像镶嵌时把外扩设成 0.5 到 1 个像元相当于在边界处做一点羽化避免后续镶嵌出现白线。NoData 值一定要确认源文件的无效值是什么。如果设置不对裁剪出来的影像可能出现大块黑色区域。常见值有 0、255、-9999需要根据影像头信息填写。输出压缩方式大影像建议选 LZW 压缩在保持质量的同时能明显减小文件体积。一个使用里的细节是如果矢量边界和栅格影像坐标系不同v2.1.5 会自动做一次重投影。不过自动重投影偶尔会在边界处出现很小的偏移保险起见我习惯先统一坐标系再做裁剪。这个习惯帮我避免过好几次图层对不齐的问题。3. 实操记录用 v2.1.5 跑完一整套数据处理流程光说功能没意思我把上一周接到的项目当作案例串一遍。这个项目不算复杂但刚好覆盖了 v2.1.5 的大部分核心功能坐标统一、格式转换、按行政区裁剪、生成瓦片。整个过程我用 GISBox v2.1.5 完成没有开其他 GIS 软件。3.1 场景说明与数据准备项目需求是这样的我有约 200 个宗地 Shapefile 文件分别来自不同协作单位坐标系五花八门另外还有两幅约 3GB 的高分遥感影像需要按县级行政区边界裁剪最终把影像和宗地叠加后生成一套 Web 瓦片供内部系统浏览。在过去这个流程至少需要串联 QGIS、命令行 GDAL、以及瓦片生成工具而且大部分环节要手动干预。这次我想验证一下 GISBox 能否一体搞定。准备阶段先做了一遍检查把所有输入数据都放在一个干净的目录里然后打开 GISBox 新建工程。工程文件的好处是中途关了软件下次打开还能看到之前的任务列表和参数。这一步强烈建议做而不是每次临时拖文件。3.2 坐标统一与格式转换实操进入 v2.1.5 的主界面我把 200 个 Shapefile 全部添加到输入列表。这时能看到每文件的基础信息比如文件大小、要素数量、坐标系。发现大约有 30 个文件的坐标系显示为空我知道这通常是源文件没有写入投影文件导致的需要右键在数据属性里手动指定坐标系。这里有个经验在动手之前先用 GISBox 的预览功能看一眼数据落在哪里能判断我当时指定的坐标系是否合理。如果你完全不知道数据原始坐标系是什么但数据范围看起来像经纬度那很大概率就是 WGS84。手头这 30 个文件项目说明里写了来源我直接就选了项目使用的 CGCS2000 高斯投影。接下来设置输出目标选择导出为 GeoParquet目标坐标系设为统一的 CGCS2000 高斯投影然后启动批量队列。并发数我设为 3失败重试设成 2开着失败后继续。这 200 个文件总共跑了大约 18 分钟中途出现了 2 个文件因源数据几何错误导致的失败都被自动跳过。跑完在输出目录里检查失败任务在日志里标了原因其中一个是自相交多边形我后面在 GISBox 里用简化几何的工具处理了一下再重跑就成功了。3.3 按行政区边界裁剪两幅大影像矢量转换跑完接着处理遥感影像。把两幅 GeoTIFF 加入列表裁剪边界选择对应的县级行政区 Shapefile。因为影像范围比行政边界大不少裁剪前我先在预览视图里拉了一个大概框确认边界文件居中且无偏移。参数这里要注意两幅影像都有 NoData 值第一幅是 0第二幅是 -9999这个值如果不写对裁剪完会出现大片黑色区域。输出格式选了 GeoTIFF压缩设成 LZW。另外因为后续要做瓦片我没有对影像做重采样保持原始分辨率输出避免不必要的画质损失。裁剪过程的实际耗时是 7 分多钟比命令行 gdalwarp 稍慢一点但胜在不需要记参数而且一次能同时裁两幅。裁剪完成后做了个简单的目视检查行政边界处基本干净仅在复杂边界的一点位置看到轻微锯齿。这属于正常现象因为在矢量转栅格过程中边界必然涉及离散化。如果你对边界平滑有严格要求可以在 GISBox 里对输出栅格做一个轻微的高斯滤波。3.4 批量生成瓦片并验证最后一步是生成瓦片。我在 GISBox 里新建任务把裁剪好的两幅影像和之前的矢量结果加进去。输出设置为 XYZ 瓦片目录缩放级别根据项目需要选了 8 到 16 级。这里有个计算逻辑目标缩放级别 16 级对应约 0.6 米分辨率远超原始影像实际分辨率所以其实到 15 级就够了。我多设一级是为了在城市核心区放大时能看清建筑边界但这会让瓦片数量增加不少。如果你想控制瓦片总量建议先算一下原始影像分辨率和需要的显示精度不要盲目拉满。参数里还有一个比较关键的点是瓦片格式。v2.1.5 支持 PNG 和 JPEG带有透明背景的矢量叠加层建议用 PNG普通影像用 JPEG 会明显减少存储量。我的项目里两者都有于是分别用了两种格式。切片启动后我开了并发数 4切了 40 分钟左右完成。验证环节我用本地目录起了一个静态服务用 OpenLayers 简单加载生成的瓦片。图层叠加正常行政边界处的影像没有明显错位。整个流程从导入原始数据到看到瓦片效果大约花了不到一个半小时其中大半时间都是软件在自动跑。这在过去几乎不可能至少需要人工在不同工具间来回切换两到三次。4. 升级后的坑与排查方案没有任何版本是完美的。v2.1.5 解决了旧问题也带来了一些新场景下的脾气。把这些经常被问到的坑集中到一起按问题现象、原因分析、解决办法的顺序整理成速查表。问题现象可能原因解决办法批量任务卡在初始化不动上次任务非正常退出队列锁文件残留关闭 GISBox删除工程目录下的 .lock 文件后重开中文路径的文件导入后显示乱码工程默认编码与文件名不一致在设置里开启兼容中文路径名并重新导入GeoParquet 导出后字段类型变化列式存储对字段做了优化转换导出前在字段映射里手动确认类型必要时转为文本升级后原来自定义的插件消失插件目录权限或迁移异常检查用户目录下 extensions 文件夹重新注册插件瓦片边缘出现白线栅格 NoData 值设置错误在裁剪参数里显式指定源 NoData 值并开启边缘透明界面工具栏布局变化比较大新版本重新组织了功能区提前导出界面配置文件升级后重新导入4.1 任务队列卡住和锁文件问题这个问题在新版本刚升级那一周最容易碰到。你会发现任务列表一直停在正在初始化日志文件也不更新。原因通常是任务队列在上次执行时被强制终止留下了一个标记文件。解决办法很简单完全退出 GISBox到工程文件目录里删除名字类似 queue.lock 的文件再重新打开工程。如果还不行检查任务列表里是否有处于运行中的僵尸任务手动移除后重新排队。我自己上次遇到这个情况是在一次强制关机之后当时一度以为是软件 bug差点就想重装了。后来仔细看日志才发现只是锁文件残留。所以建议升级后的第一次批量任务先跑一个小文件试试队列是否正常不要直接一股脑丢进去 200 个。4.2 中文路径与乱码处理中文路径问题在旧版本里就有v2.1.5 增加了一个兼容选项但默认是关闭的。如果你从 QQ 或微信保存文件到本地或者数据文件名带有中文括号很容易触发。具体表现是数据能加载但中文属性值显示成乱码。处理方式是打开设置里的兼容中文路径然后重新导入数据。如果你有大量历史工程是旧版创建的可以直接编辑工程里的路径字段把编码参数改成 GBK。这个功能对国内用户非常重要如果你从来不设这一项迟早会在某个交付项目前被文件名坑一次。4.3 GeoParquet 导出的字段类型变化用 GeoParquet 导出后再用 GISBox 打开时某些字段类型会比原来小。比如从 SHP 导出的属性字段是 Int64GeoParquet 为了压缩把数值字段优化成了 Int32数值大的值就会被截断或转换。这种情况其实参数化处理后可以避免在导出设置里找到字段映射表把关键字段手动锁定为 Int64 或文本类型。特别需要注意的是 ID 字段如果涉及数据入库最好统一转成文本避免后续关联时类型不匹配。这个细节我一开始不知道导致后面在数据库里做连接时才发现一批 ID 变成了科学计数法花了不少时间回查。4.4 升级后插件与界面布局的恢复v2.1.5 改了不少界面的分组逻辑很多老用户升级第一眼会不习惯。如果你之前把常用工具按自己的习惯排了布局升级后可能需要重新调整。好在 GISBox 支持到处界面配置文件建议在升级前导出一次升级后导入基本能恢复原来的排列。插件方面v2.1.5 对扩展的加载机制做了调整旧版插件如果没有更新升级后被禁用属于正常现象。遇到这种情况先去官网插件仓库看看有没有对应版本。如果插件是你自己写的可以把开发依赖升级到新版 SDK 后重新编译通常只要改一下版本声明就行。最后再提一个我个人的使用习惯升级前备份整个工程文件目录包括 task 和 log 这些看起来不起眼的文件夹。GISBox 的任务列表和队列状态都记录在工程文件里备份好之后就算新版本出了什么问题也能马上回滚到旧版本继续干活。我上次升级时就因为提前备份了工程文件遇到锁文件问题时没有损失任何未完成的任务。希望这些经验能帮你顺利完成从旧版到 v2.1.5 的过渡把这几个新功能真正用到自己的项目里去。
返回列表