信息速览
ESA WorldCover 是一个让人不太舒服的答案:它不给你光谱,不给你影像,只给一个数字。每十米一格,十一选一,选完就结束了。你打开一块瓦片,看到的是一片由十一种颜色组成的马赛克,没有任何地方写着「这里其实是七成农田三成林地」。
它的价值正在这个取舍里。遥感界喊了二十年「全球十米地表覆盖」,真正做出来的自由开放产品屈指可数,而它是目前覆盖最完整、被引用最多的一份。十米意味着一个足球场大小的地块单独成为一格,也意味着每一格都必须给出一个不属于灰色的结论。
麻烦同样从这个取舍里长出来。当一块地横跨两种地物,产品不告诉你它犹豫,只告诉你它最终选了哪边。大多数误用的起点,都是忘了这一层:这是一张已经做完的判断书,不是一份可以重新判断的证据。
| 项目 | 数值 | 来源 |
|---|---|---|
| 全名 | ESA WorldCover 10 m(2020 v100 / 2021 v200) | 产品手册 V2.0 |
| 空间分辨率 | 10 m(赤道处),网格步长 1/12000° | 手册 §3.4.1 |
| 类别数 | 11(FAO LCCS 编码 10–100) | 手册表 3 |
| 瓦片数 | 2651(每块 3°×3°) | 手册 §3 |
| 单瓦片像素 | 36000×36000 | 瓦片 TIFF 头 |
| 发布版本 | 2020 v100、2021 v200 | 手册表 1 |
| 输入传感器 | Sentinel-1 GRD 与 Sentinel-2 L2A | 手册 §2.1 |
| 分类器 | CatBoost 梯度提升树,115 维特征 | 手册 §2.1 |
| 全球总体精度 | 2021 版 76.7%,2020 版 74.4% | 手册 §6 / 验证报告 |
| 许可 | CC BY 4.0 | 手册 §5.1 |
| 主分发 | AWS 公共桶、Zenodo、Terrascope | 手册 §5.3 |
§1 速览:它是什么,以及它刻意不是什么
1.1 一句话定义
WorldCover 是一份已经执行完毕的全球分类判断:用 2020 年或 2021 年一整年的 Sentinel-1 与 Sentinel-2 观测,对地球每一块陆地、每十米见方的地方,判定它属于十一种地表覆盖类型中的哪一种,然后把结果切成 2651 块瓦片公开。
它既是一个产品,也是一个「基线」。说它是产品,因为可以直接当图层叠加到任何 GIS 工程里;说它是基线,因为五年十年后人们评估新方法时,会拿它的精度数字当参照系。
1.2 它与影像数据集的分工是根本性的
站内已经有一篇 EuroSAT,讲的是 Sentinel-2 影像瓦片如何被裁成 64×64 的小方块用于十类图像分类。那篇讲的是「题目」:给你一张影像,猜它是什么。这一篇讲的是「答案」:地图上这十米,已经被判成了什么。
两者的关系可以用一句话说清——EuroSAT 是机器学习里的 X,WorldCover 是 y。前者是被观察的对象,后者是观察得出的结论。把两者搞混是最常见的错位:有人下载 WorldCover 之后想训一个分类器,却发现它本身就是分类结果,没有可以学习的输入特征。
这个分工还有一个更深的含义。影像数据集的价值在于「未标注」,你可以用任何新方法去重新解释它;产品数据集的价值在于「已标注」,你只能选择接受、部分接受,或者把它当作待检验的假设。前者给的是自由,后者给的是地基。
1.3 三十秒决策卡:你的处境,它能帮你什么
| 你的处境 | 它能帮你什么 |
|---|---|
| 要给一批地理坐标配上「这里是什么地」的背景变量 | 直接按经纬度取值,一个像元一个类别码,不需要任何遥感处理 |
| 想给自己的分类模型找一个现成的标签来源做弱监督 | 可作为伪标签来源,但要先按质量图层筛掉观测稀少的区域 |
| 需要一份全球统一的、类别口径一致的底图做面积统计 | 类别定义挂在 FAO 的 LCCS 体系上,与多数国际报告的口径可以对上 |
| 要做城市扩张、耕地变化之类的两年对比 | 可以,但必须承认两版算法不同,差异不等于变化 |
| 想验证「雷达加光学比单光学强」这个说法 | 手册写明算法里同时训了三个模型(全特征、去 S1、去 S2),正好是可以对照的实验设定 |
| 需要一个十米级的真值来评估自己的分割模型 | 不合适,它的官方精度只有 76.7%,当基准会把你的模型误差与它的误差混在一起 |
| 想知道某城市某街区的具体地物 | 十米一格,一个街区里可能只有十几个格,噪声会把结论吃光 |
1.4 不适合谁
如果任务是精细地物识别,比如区分不同作物品种、不同树种、屋顶材质,WorldCover 给不了。十米一格,一公顷等于一百格,格内是什么它不回答。
如果任务是变化检测,它给的是一个非常容易踩坑的表面答案。2020 与 2021 两版由不同算法版本生成,手册 §2.2 的原话是「两张图之间的大部分变化来自所用算法的变化」。直接相减得到的图层里,真实地物变化与算法改进混在一起,无法分离。
如果任务是水体或海岸线提取,虽然永久水体类别的精度在十一类中排前列,但手册 §4 明列了一条:冰川消融区和山体阴影有时被误判成水体。高山地区拿它当水体制图会得到错误结论。
如果任务是混合像元分解,这从根上就做不到。产品已把每格归入单一类别,混合信息在生成阶段被丢弃,事后无法恢复。
1.5 贯穿本文的案例:埃及西部那一片「凭空多出来」的耕地
产品手册 §2.2 用了两张图来说版本差异,其中一张的取景位置写得很具体:东经 31.35 度、北纬 23.00 度,埃及西南部靠近利比亚边界的一片荒漠绿洲带。手册对这张图的说明里写了两件事混在一起:一是永久水体与耕地在这两年之间发生了真实变化,二是 2021 版对耕地的识别更好了,漏判变少了。
这句话的价值在于它把两种完全不同的东西摆在了同一句话里——地上真的变了,和看图的方法变了。任何拿到两版数据想做对比的人,都必须在这两件事之间做出区分,而官方在同一个案例里明确告诉你:这两件事在这张图上同时发生了。
本文会反复回到这片坐标。讲产品结构时用它说明瓦片怎么切,讲版本时用它说明为什么不能相减,讲精度时用它说明为什么全球均值掩盖了局部差异。
§2 数据构成:一份被切成两千多块的全球判断
2.1 全量规模:三个数字与它们的边界
官方口径最稳的三个数字是:10 米分辨率、11 个类别、2651 块瓦片。产品手册 §3 的开头一句就是「产品按 3×3 度的瓦片提供,总计 2651 块」,这句话在手册的「交付机制」一节又完整重复了一次,两处一致。
| 维度 | 数值 | 怎么得到 | 注意 |
|---|---|---|---|
| 瓦片数 | 2651 | 手册 §3 与 §5.3 | 2020 与 2021 两版都是这个数 |
| 单瓦片像素 | 36000 × 36000 | 瓦片 GeoTIFF 头的宽度与高度字段 | 3 度 × 12000 像素/度 |
| 单瓦片边长 | 3° × 3° | 手册 §3 | 南北固定约 333 公里,东西随纬度收缩 |
| 类别数 | 11 | 手册表 3 | 编码不连续,见 §2.3 |
| 主图层像素类型 | uint8 单波段 | 手册 §3.2 | 取值只有十一种可能 |
| 质量图层分辨率 | 1/2000°(约 60 米) | 手册 §3.4.1 | 比主图层粗六倍 |
| 主图层压缩后总量 | 约 124 GB | 桶内 2651 个主图层文件大小求和 | 官方文字口径是「约 117 GB」 |
最后一行需要单独说明。产品手册与 readme 都写「约 117 GB」,而把桶里 v200/2021/map/ 下 2651 个 .tif 的字节数逐个加起来是 124,027,923,380 字节,约合 124 GB(按十进制)或 116 GiB(按二进制)。117 是 GiB 口径,124 是 GB 口径,两者指的是同一批文件。写作时若不加区分,会出现「官方说 117,实际是 124」这种看似矛盾的表述。本文一律用「约 116 GiB」对应官方数字,用「约 124 GB」对应按字节求和。
2.2 2651 这个数是怎么来的
全球陆地按 3 度一格切,理论上需要多少块?经度方向 360 度除以 3,是 120 列;纬度方向 90 度除以 3,是 60 行。满格应该是 7200 块。实际只有 2651 块,不到四成。
差值来自三类排除:海洋格整块不要;南极洲整块不要,手册 §3.4.2 明写「除南极洲以外的全部陆地」;北界到 82.75 度为止,更北的格不要。剩下的是那些真正含有 Sentinel-2 观测过的陆地的格子。
于是瓦片编号出现了第一处反直觉的地方:格子编号的起点不是 N00E000。用前缀查询 N00E000 会得到 0 条结果,第一块编号为 N00E006 的瓦片覆盖东经 6 到 9 度、北纬 0 到 3 度,落在加蓬与赤道几内亚一带的陆地上;而 0 到 6 度之间跨的是几内亚湾,整片是海水,因而不存在这一格。同理,经度 0 到 3 度、纬度 0 到 3 度这一格,赤道横穿、大部分是海,也没有。
这条性质有一个实践后果:不能假设瓦片编号是连续的,也不能用编号做等差推算。要按区域取数,正确的做法是下载桶里的网格 GeoJSON(esa_worldcover_grid.geojson),用它和你的感兴趣区域做空间相交,得到实际存在的瓦片列表。
2.3 十一个类别:编码不连续是刻意的
手册表 3 给出的编码是 10、20、30、40、50、60、70、80、90、95、100。中间跳过了 95 到 100 之间的规律——95 是红树林,100 是苔藓与地衣,这两个是后期单独插进来的。
| 编码 | 类别 | LCCS 代码 | 判定门槛 | 官方色(RGB) |
|---|---|---|---|---|
| 10 | 乔木覆盖 Tree cover | A12A3 // A11A1 等 | 树木覆盖 ≥10% | 0,100,0 |
| 20 | 灌丛 Shrubland | A12A4 // A11A2 | 天然灌木覆盖 ≥10%,树覆盖 <10% | 255,187,34 |
| 30 | 草地 Grassland | A12A2 | 天然草本覆盖 ≥10%,木本 <10% | 255,255,76 |
| 40 | 耕地 Cropland | A11A3(A4)(A5) | 一年内至少收获一次的农田 | 240,150,255 |
| 50 | 建成区 Built-up | B15A1 | 建筑、道路等人造结构 | 250,0,0 |
| 60 | 裸地与稀疏植被 | B16A1(A2) // B15A2 | 全年植被覆盖从不超过 10% | 180,180,180 |
| 70 | 雪与冰 Snow and ice | B28A2(A3) | 常年被雪或冰川覆盖 | 240,240,240 |
| 80 | 永久水体 | B28A1(B1) // B27A1(B1) | 一年中超过九个月有水 | 0,100,200 |
| 90 | 草本湿地 | A24A2 | 天然草本覆盖 ≥10%,常年或定期被淹 | 0,150,160 |
| 95 | 红树林 Mangroves | A24A3C5-R3 | 潮间带的耐盐树种 | 0,207,117 |
| 100 | 苔藓与地衣 | A12A7 | 以地衣或苔藓为主 | 250,230,160 |
这张表里有三处容易被忽略的细节。
第一,编码不连续意味着不能用编码做算术。30 与 40 之间不是「差 10」,差 10 在数值上没有意义。任何把类别码当作有序变量、计算「平均覆盖类型」的做法都是错的。要做回归,只能做十一维的 one-hot;要做距离,只能在类别空间上定义。
第二,门槛是覆盖比例,不是绝对面积。乔木覆盖类是「树覆盖 ≥10%」,灌丛类是「灌丛 ≥10% 且树 <10%」。这意味着草原上散生着几棵树的地方,仍然归草地,只要树的覆盖不到十分之一。草原疏林是这份产品里最容易与林地互换的一类。
第三,红树林和苔藓的编码是插进去的。这两个类别在面积上极小,却各自占了产品里最难做的一角:红树林是全球热带海岸线的关键碳库,苔藓覆盖是北方针叶林带与苔原的指示物。给它们单独编码,说明产品优先保住的是这几类在生态报告里的独立地位,而不是分类器自身的难度。
2.4 类别来自 FAO 的 LCCS,而不是自己编的
手册 §3.3.1 明确写了:离散分类图使用联合国粮农组织开发的土地覆盖分类体系(LCCS)定义。这一点在实践中的价值是把 WorldCover 与其他国际产品放到了同一张语义底图上——如果某份报告说「全球森林覆盖率」,WorldCover 的乔木覆盖类可以按 LCCS 的定义直接对进去,不需要再做一次类别映射的争议。
但也要看清 LCCS 是层级式的。同一个大类在不同层级可以细分成不同的小类;WorldCover 选的是其中一档,不是最细一档。手册原话说 LCCS「允许按可用信息量调整图例的主题细节」,反过来说就是:它能提供的细节上限,由输入信息量决定。
2.5 一块瓦片里到底装了什么
| 层面 | 内容 | 使用者要注意什么 |
|---|---|---|
| 文件名 | ESA_WorldCover_10m_2021_v200_S48E036_Map.tif |
四段信息:年份、版本、瓦片号、图层名 |
| 图层名 | Map 或 InputQuality |
两类图层同名同格,靠最后一段区分 |
| 尺寸 | 36000 × 36000 | 一次读进内存需要 1.3 GB 未压缩 |
| 像素类型 | uint8(Map)/ uint16(InputQuality) | Map 无缩放无偏移,值即类别 |
| 分块 | 1024 × 1024 | 支持按窗口读取,不必整块加载 |
| 压缩 | DEFLATE | 压缩后单块约 40 至 60 MB 量级 |
| 金字塔 | 2、4、8、16、32、64 共六层 | 缩略浏览时不必读原始层 |
| 坐标参考 | EPSG:4326 | 经纬度,不是投影坐标 |
| 时间 | 仅年份 | 无月份、无过境日期 |
这是一张非常典型的 COG 结构表。其中最后两行决定了这份数据的使用方式:没有投影,所以拿来做面积统计时,每个像元代表的实际面积随纬度变化,直接数像元会高估高纬地区的面积;没有月份,所以任何「植被季相分析」在这份产品上都无从下手。
2.6 质量图层:三根通道回答「你凭什么这么判」
InputQuality 图层是三波段 uint16,按 1/2000 度(约 60 米)的网格存放。三个通道的定义在手册 §3.3.2:
| 波段 | 含义 | 用法 |
|---|---|---|
| 1 | 参与分类的 Sentinel-1 GAMMA0 观测数 | 为零意味着这一格完全没有雷达输入 |
| 2 | 参与分类的 Sentinel-2 L2A 观测数 | 数量少意味着光学证据薄弱 |
| 3 | 被丢弃的无效 Sentinel-2 观测百分比 | 数值高意味着常年多云或被雪污染 |
手册给了第三个通道的用途说明:把第二与第三通道组合,可以反推该处 Sentinel-2 的总观测数。这个反向推算在做区域研究时很实用——它能告诉你,某片区域到底是数据本身就不足,还是分类器在该处失灵。
2.7 三个版本号的含义
瓦片名里的 v200 不是随意的版本标记,手册 §3.1 给出了拆法:vMmr,其中 M 是主版本号,m 是次版本号,r 是生产运行编号。v200 意味着主版本 2、次版本 0、运行编号 0。
这条规则的实践意义在于:如果将来出现 v201 或 v210,它能告诉你改动的量级。运行编号变化可能是重跑同一套算法;主版本变化则意味着算法本身换了。
§3 版本层:v100 与 v200 是两个答案,不是两次修订
3.1 版本差异不是补丁,是重新作答
产品手册 §2.2 的第一句话就是警告:「由于 2020 与 2021 年的地图使用了不同的算法版本(分别为 v100 与 v200),两图之间的变化应当谨慎对待,因为它们同时包含了真实的地表覆盖变化与算法导致的变化。」紧接着一句更狠:「事实上,两图之间的大部分变化来自所用算法的变化。」
这句话如果只读一遍,很容易被当成免责声明滑过去。读第二遍会发现问题比想象的大:2272 块瓦片、每块十亿级像元、两年时间,官方的判断是——你看到的大部分差异不是地上发生的,是天上看到的和地上算出来的过程变了。
差异的量化证据在手册表 1:
| 算法版本 | 用于生成的年份产品 | 训练位置数 | 特征数 |
|---|---|---|---|
| v100 | WorldCover 2020 | 259,734 | 131 |
| v200 | WorldCover 2021 | 319,415 | 115 |
两栏都变了,而且变化方向相反:训练位置多了六万个,特征数少了十六个。这不是「修 bug」,这是重做了一遍建模。
3.2 特征从 131 减到 115 意味着什么
特征数量减少通常意味着两件事之一:要么删掉了没用的特征,要么换了构造特征的方式。手册 §2.1 列出了 v200 的 115 维特征构成:
| 来源 | 维数 | 内容 |
|---|---|---|
| Sentinel-2 | 64 | 各波段与植被指数的 10 分位、50 分位、90 分位与四分位距 |
| Sentinel-1 | 12 | VV 与 VH 后向散射时间序列的同组统计量 |
| 高程 | 2 | 来自 Copernicus 全球 30 米 DEM 的海拔与坡度 |
| 位置与生态区 | 23 | 经纬度本身,加上来自 Ecoregions2017 的生物群区与生态域 |
| 气象 | 14 | TerraClimate 七个变量的年均值与标准差 |
这张表的第二行是理解这份产品最关键的一处:雷达数据参与的方式,是把时间序列压成四组分位数。不是把雷达影像当图像喂给卷积网络,而是把一年里每次过境的 VV、VH 后向散射堆成序列,取分位数。这意味着雷达提供的信息是「这一格在过去一年里的散射行为有多稳定、有多极端」,而不是「这一格在某天长什么样」。
第四行同样值得停一下。经纬度本身是特征之一。这份产品在分类时直接告诉模型「你正在判断的这个像元位于哪里」,再叠加生态区划分。这是一个非常强的先验:模型因此知道赤道附近不该出现苔原,知道北纬六十度以南的针叶林带该长什么样。
这条设计选择解释了两件事。第一,它为什么能做到全球统一精度而不需要为每个大洲单独训模型——位置特征让一个模型能在大范围内自适应。第二,它为什么在某些跨区边界上会产生硬伤:当两个生态区交界时,位置特征会发生跳变,而这正是手册 §4 记录的那类「硬边界」伪影的来源之一。
3.3 埃及那一片:同一坐标上的两种解释
回到 §1.5 的案例。手册用东经 31.35 度、北纬 23.00 度这一片来展现版本差异,原因是它同时具备两种可比较的差异:
一是真实的覆盖变化。这一带是埃及西南部的绿洲农业区,地下水灌溉使得水体和耕地在年际间确有扩张与收缩。手册直接写「显示 2020 与 2021 之间永久水体与耕地类别的差异(即真实的地表覆盖变化)」。
二是算法改进带来的识别度提升。手册写「以及 2021 年对耕地更好的制图(即算法变化),相比 2020 年漏判更少」。
两句话放在一起,等于告诉使用者:在这片坐标上,如果你把两版相减,得到的那一堆红色像素里,有一些是真的多了水,有一些只是以前没认出来。在单张差值图上,你看不出哪是哪。
这不是一个可以靠后处理修补的问题。要分离两者,需要回到原始 Sentinel-2 观测,用同一套方法对两年数据重新分类,或者引入外部的高分辨率影像人工判读。产品本身不提供这个能力,因为它在生成阶段就把两年的观测各自压缩成了一组分位数,原始影像不在包里。
3.4 连续性问题:没有 2022 版
产品手册 V2.0 定稿于 2022 年 10 月 24 日,正文里只描述 2020 与 2021 两版。官方数据获取页当前的表述也停留在「2020 v100」与「2021 v200」两个产品,并说明 2021 版「更新了」2020 版。
这意味着做时序分析时,WorldCover 能提供的只有两个时点,中间隔一年,两端都停住了。想要第三条时间线,只能转向其他产品序列,而其他产品的类别口径未必能对齐——这正是 §6 要处理的问题。
3.5 版本选择的实操规则
| 你的需求 | 选哪版 | 理由 |
|---|---|---|
| 做最新的静态底图 | v200(2021) | 精度更高,类别精度全面提升 |
| 复现 2021 年前后发表的论文 | 按论文原版 | 混用会造成数字不可比 |
| 做两年对比 | 两版都要,但必须声明算法不同 | 官方明示差异主要来自算法 |
| 做历史基线 | v100(2020) | 它是被独立验证过的第一版 |
| 需要类别精度最高 | v200 | 手册 §6 写明建成区、草本湿地、苔藓较 v100 显著提升 |
§4 精度层:76.7% 这个数字该怎么读
4.1 验证是怎么做的
精度不是一个数字,是一套抽样设计的结果。验证报告 V2.0 写得相当细:
- 采用 CEOS 验证指南的第 4 阶段(Stage 4),是国际上要求最高的一档
- 验证数据来自为 Copernicus 全球土地服务 100 米产品开发的通用验证集,按 2021 年重新审阅更新
- 21,624 个初级抽样单元(PSU),按分层随机抽样布设在七个子大洲
- 每个 PSU 是 100 米 × 100 米,切成 10×10 共 100 个次级单元(SSU),每个 SSU 对应一个 Sentinel-2 的十米像元
- 合计 2,162,366 个 SSU 参与统计
- 参考类别由 30 位区域专家通过 Geo-Wiki 平台目视判读,全部经过复核
这个设计的规模值得单独说一句:两百多万个十米像元被逐个判读,判读依据是高分辨率影像而非 Sentinel-2 本身。这是「独立验证」在字面意义上的实现——参考数据的来源与产品的输入不同源。
4.2 全球总体精度 76.7%
手册 §6 与数据获取页一致给出:全球总体精度 76.7 ± 0.5%。前一版 2020 v100 是 74.4%。
76.7% 是在 95% 置信水平下的区间估计,误差限是 ±0.5 个百分点。这个数字的含义要拆开看:
它是在所有类别上平均的命中率,按面积加权。也就是说,如果地球上 30% 的面积是森林,那么森林的判对率对总体的贡献就是三成。
它不是「每一类都有 76.7% 的正确率」。恰恰相反,类别之间的差距极大,下面就是。
它也不代表你的应用能拿到 76.7%。如果你的应用只关心建成区,而建成区在你的研究区占比很小,你的实际体验会与这个数字有明显出入。
4.3 类别之间的差距,比总体数字重要得多
验证报告 §3.1 的文字结论是:乔木覆盖、雪与冰、耕地、水体、裸地与稀疏植被这几类的精度较高;草地与建成区中等;灌丛、湿地、苔藓与地衣在全球尺度上相对较低。
报告同时给出了几个可引用的具体数字(用户精度,即「产品说是这一类的地方,有多少真是这一类」):
| 类别 | 用户精度 | 直白解读 |
|---|---|---|
| 裸地与稀疏植被 | 92.1% | 说是裸地,九成以上真是裸地 |
| 雪与冰 | 93.0% | 最可靠的一类 |
| 永久水体 | 89.4% | 制图用途可以放心 |
| 耕地 | 80.6% | 可靠,但漏判多于误判 |
| 乔木覆盖 | 80.0% | 误判多于漏判,倾向于「多加树」 |
| 红树林 | 74.1% | 面积小,误差区间极宽 |
| 草地 | 71.9% | 中等,常年与灌丛、苔藓混淆 |
| 建成区 | 65.9% | 中等偏下 |
| 苔藓与地衣 | 57.5% | 偏低 |
| 灌丛 | 49.1% | 不到一半 |
| 草本湿地 | 30.5% | 十次判断里对三次 |
最后一行需要特别警觉。草本湿地的用户精度是 30.5%,也就是产品标为湿地的像元里,只有三成真是湿地。验证报告正文也印证了这一点:湿地与草地、耕地之间在全球范围内都存在严重混淆。原因写在验证报告与产品手册的已知局限里——灌溉农田与草本湿地在 Sentinel-2 与 Sentinel-1 的观测特征上高度相似。§1.5 的案例里那片绿洲农田,正好同时是耕地与湿地两种判断的争夺对象,两版图在同一地点给出不同答案,很大程度就源于这条混淆。
这条事实直接改变了使用方式:在任何报告中把 WorldCover 的湿地面积当作湿地面积,都会高估。而相反方向——湿地的漏判——同样严重。这是一个双向都不准的类别。
4.4 大洲之间的差距同样明显
| 大洲 | 总体精度 | 误差限 |
|---|---|---|
| 亚洲 | 82.1% | ±1.0 |
| 欧洲 | 77.9% | ±1.0 |
| 南美洲 | 77.9% | ±1.1 |
| 非洲 | 76.5% | ±1.3 |
| 北美洲 | 74.6% | ±1.2 |
| 欧亚(俄罗斯与中亚) | 72.5% | ±1.3 |
| 大洋洲 | 72.5% | ±1.3 |
最高与最低差将近十个百分点。验证报告给了低分区的解释:大洋洲的低分来自澳大利亚开阔疏林地中灌丛、草地、乔木三者互相混淆;欧亚的低分来自西伯利亚温带苔原区灌丛与乔木、草地与乔木的混淆。
也就是说,误差不是均匀分布的,它集中在植被过渡带。这一条与 §7 要讲的「尺度效应」是同一件事的两个侧面。
4.5 把 76.7% 翻译成一句可执行的话
如果只能带走一句,应该是这句:这份产品适合当背景变量,不适合当真值标签。
当作背景变量,意思是把它作为一个输入特征或者一个分层依据。比如研究某种疾病的分布时,用每个行政区的耕地占比作为协变量——即使这个占比有三成误差,它仍然携带真实信号,回归系数会小于真实值,但方向对。
当作真值标签,意思是拿它去训练或评估另一个模型。这时它的 23.3% 误差会直接进入你的模型的误差项,而你无法区分「我的模型错了」和「标签错了」。评估场景下这会双向污染:你的模型学会了产品的系统性偏差,而你的指标反映的是产品与你的模型的一致性,不是与真实地表的一致性。
4.6 验证本身也有局限
验证报告没有回避自己的问题:
参考数据来自目视判读,判读依据的高分辨率影像(Google、Bing、ESRI)本身存在地理配准误差,在十米尺度上,几米的偏移就足以让边界上的像元判错。
2020 版验证时,为了减少判读歧义,剔除了周边地物不一致的孤立 SSU——要求一个 SSU 至少有两个同类邻居才纳入。这条规则剔掉了约一万个 SSU 中的一部分,使得验证样本更偏向均质区域。
这带来一个不易察觉的口径问题:2020 与 2021 两版的精度数字(74.4 与 76.7)不是在同一套样本上算出来的。手册把两者的提升描述为改进,这是有依据的——但严格来说,这个提升里包含了一部分验证设计的变化,而不是全部来自产品本身。
§5 工具层:怎么拿到、怎么切、怎么算
5.1 五条获取路径,各有代价
手册 §5.3.2 列了五条下载路径。它们不是等价的,选错会浪费时间。
| 路径 | 是否需要注册 | 覆盖面 | 适合 |
|---|---|---|---|
| AWS 公共桶 | 不需要 | 主图层 | 全量或按区域批量取数 |
| Zenodo | 不需要 | 60° 宏瓦片整包 | 一次性拿全量、需要 DOI 引用 |
| 官方 viewer 下载 | 需要 Terrascope 账号 | 可按多边形或行政区 | 只要一小片区域 |
| Terrascope Python 客户端 | 需要账号 | 可按几何筛选 | 脚本化取子集 |
| Google Earth Engine | 需要账号 | 全部 | 在平台上直接做统计 |
主图层五条路都通,质量图层只有前两条(viewer 与 Terrascope 客户端)。手册明文写了这条限制。要拿质量图层却走 S3,会空手而归。
5.2 用 S3 匿名取:一条命令跟一个校验
AWS 桶是公开的,不需要任何凭据,只要在请求里明确表示「不签名」。
#-- 期望:把 2021 年主图层同步到本地,两条命令都应返回 exit 0
#-- 第一步:只列出、不下载,确认你要的数量对不对(应看到 2651 个 .tif)
aws s3 ls --no-sign-request s3://esa-worldcover/v200/2021/map/ | grep -c '\.tif$'
#-- 第二步:同步(124 GB 量级,务必确认磁盘)
aws s3 sync --no-sign-request s3://esa-worldcover/v200/2021/map/ ./worldcover_v200_map/
--no-sign-request 是关键参数。漏了它,AWS CLI 会去找凭据,找不到就报错,报错信息指向「凭据缺失」而不是「权限问题」,会把人引到错误方向。用 curl 时同理:直接 GET 对象 URL 即可,不要加任何签名头。
5.3 先取网格,再取瓦片
因为瓦片编号不连续(§2.2),按经纬度找瓦片要靠官方网格文件。
#-- 期望:给定一个经纬度范围,输出覆盖它的瓦片编号列表
import json
import urllib.request
GRID = "https://esa-worldcover.s3.eu-central-1.amazonaws.com/esa_worldcover_grid.geojson"
def tiles_for(west, south, east, north):
with urllib.request.urlopen(GRID) as r:
grid = json.load(r)
hit = []
for feat in grid["features"]:
name = feat["properties"]["ll_tile"]
lon = int(name[4:7]) * (-1 if name[3] == "W" else 1)
lat = int(name[1:3]) * (-1 if name[0] == "S" else 1)
if lon < east and lon + 3 > west and lat < north and lat + 3 > south:
hit.append(name)
return sorted(hit)
print(tiles_for(31.0, 22.5, 32.5, 23.5))
#-- 期望:包含 N21 或 N24 附近的瓦片号,覆盖东经 31.35、北纬 23.00 这一点
这段代码只判断瓦片号与范围是否相交,没有做真实的空间相交。对于一块 3 度见方的格子,这种做法在绝大多数场合够用;如果要精确到不规则多边形,应下载 GeoJSON 后用 geopandas 做 intersects。
5.4 按窗口读,不要整块读
一块瓦片 36000×36000,uint8 未压缩是 1.3 GB。读一小片区域却加载整块,是新手最常犯的浪费。COG 的分块是 1024×1024,用 GDAL 的窗口参数可以直接跳过无关块。
#-- 期望:只读取埃及那片区域对应的 2000×2000 窗口,耗时秒级
from osgeo import gdal
## 打开远端 COG,不做本地缓存
ds = gdal.Open("/vsicurl/https://esa-worldcover.s3.eu-central-1.amazonaws.com/"
"v200/2021/map/ESA_WorldCover_10m_2021_v200_N21E030_Map.tif")
## 经纬度换算成像素:行列号 = (坐标 - 左上角) / 步长
step = 1 / 12000
x0 = int((31.30 - 30.0) / step)
y0 = int((24.0 - 23.05) / step)
arr = ds.ReadAsArray(x0, y0, 2000, 2000)
print(arr.shape, sorted(set(arr.ravel().tolist())))
#-- 期望:(2000, 2000) 与一组取自 {10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 100} 的值
注意瓦片号与窗口的对应关系:N21E030 指瓦片左下角在南纬还是北纬 21 度、东经 30 度。经纬度 31.35、23.00 落在这块瓦片内部,所以行列号要用左下角做基准往回算。
5.5 统计面积:不能数像元
这是整节最容易被忽略的一步。产品在 EPSG:4326 上,每个像元的经度宽度固定为 1/12000 度,但纬度宽度随纬度收缩。在赤道,一个像元约 10×10 米;在北纬 40 度,同样一个像元的实际面积只有赤道的 0.766 倍。
#-- 期望:把像元数正确换算成面积(平方公里)
import numpy as np
def pixel_area_km2(lat_center_deg, n_lon=12000, n_lat=12000):
# 每个像素的经度跨度与纬度跨度都是 1/12000 度
d = 1.0 / 12000
earth = 6371.0088
lat = np.deg2rad(lat_center_deg)
# 经度方向长度 = R * cos(lat) * d;纬度方向长度 = R * d
lon_len = earth * np.cos(lat) * np.deg2rad(d)
lat_len = earth * np.deg2rad(d)
return lon_len * lat_len
print(pixel_area_km2(0), pixel_area_km2(40))
#-- 期望:赤道约 8.6e-5 平方公里(即 86 平方米),北纬 40 度约 6.6e-5
赤道上一个像元不是 100 平方米,而是 86 平方米左右——因为 1/12000 度在赤道折算成经线方向约 9.26 米,而手册写的「约 10 米」是四舍五入的说法。在高纬度的面积统计里,如果直接乘以 100 平方米,误差会达到数十个百分点。
5.6 用 xarray 一次性读一个区域
如果分析规模不大,用 rioxarray 直接按坐标切片更省事。
#-- 期望:得到一个小型 Dataset,值域限定在 11 个类别码内
import rioxarray as rxr
url = ("https://esa-worldcover.s3.eu-central-1.amazonaws.com/"
"v200/2021/map/ESA_WorldCover_10m_2021_v200_N21E030_Map.tif")
da = rxr.open_rasterio(url, masked=True).squeeze()
sub = da.sel(x=slice(31.30, 31.40), y=slice(23.05, 22.95))
print(float(sub.mean()), sub.shape)
#-- 期望:形状为 (1, 1200, 1200),均值落在 10 到 100 之间
squeeze() 把单波段维度压掉,否则后面所有操作都会带着一个长度为 1 的轴。这是处理单波段 COG 时最常忘的一行。
5.7 质量图层的正确读法
#-- 期望:得到三个波段的观测数,用于判断输入是否可靠
import rioxarray as rxr
q = rxr.open_rasterio(
"https://esa-worldcover.s3.eu-central-1.amazonaws.com/"
"v200/2021/inputquality/ESA_WorldCover_10m_2021_v200_N21E030_InputQuality.tif",
masked=True)
s1_n = q.sel(band=1)
s2_n = q.sel(band=2)
invalid_pct = q.sel(band=3)
print(s1_n.shape, s2_n.max().item(), invalid_pct.max().item())
#-- 期望:边长约为 Map 图层的一半,第三波段最大值不超过 100
第三波段的取值上限是 100(百分比),如果读出来的数远超 100,说明把波段顺序搞错了。质量图层只有三个波段,手册 §3.3.2 给出的顺序是 S1 观测数、S2 观测数、无效百分比。
5.8 在 Earth Engine 里做一次类别统计
如果分析在平台上完成,不需要下载任何文件。
#-- 期望:算出某个矩形内耕地类别的面积(平方公里)
import ee
ee.Initialize()
wc = ee.ImageCollection("ESA/WorldCover/v200").first()
region = ee.Geometry.Rectangle([31.30, 22.95, 31.40, 23.05])
cropland = wc.eq(40).rename("cropland")
area = cropland.multiply(ee.Image.pixelArea()).reduceRegion(
reducer=ee.Reducer.sum(), geometry=region, scale=10, maxPixels=1e9)
print(area.getInfo())
#-- 期望:{'cropland': 数值},单位为平方米
ee.Image.pixelArea() 会按投影自动处理面积换算,这就绕开了 §5.5 的手工计算。代价是它给出的是平台重投影之后的面积,与在原始经纬度网格上算出的数值会有细微差异。
5.9 做两版对比之前的必做检查
在做 §3 说的两版相减之前,有一件事必须先做:确认两版在同一地区都有有效输出。
#-- 期望:输出的两个掩膜形状一致,且无数据区域的交集不为空
import rioxarray as rxr
def load_ver(year, ver, tile):
base = f"https://esa-worldcover.s3.eu-central-1.amazonaws.com/{ver}/{year}/map/"
return rxr.open_rasterio(f"{base}ESA_WorldCover_10m_{year}_{ver}_{tile}_Map.tif",
masked=True).squeeze()
a = load_ver(2020, "v100", "N21E030")
b = load_ver(2021, "v200", "N21E030")
print(a.shape, b.shape, a.shape == b.shape)
#-- 期望:两个形状相同,均为 (36000, 36000)
形状相同是两版能直接相减的前提。两个产品版本在网格定义上是同一个,这一点手册 §2.2 已经写明:「产品描述(文件名、文件格式、产品内容与产品特性)在两版之间完全相同」。形状一致但含义不同,正是那节的核心警告。
§6 与库内条目的关系:它在数据生态里占的位置
6.1 库内遥感家底只有寥寥几条
站内与遥感直接相关的条目目前不多:EuroSAT(Sentinel-2 影像瓦片分类基准)、Landsat(五十年的陆地影像档案)、哥伦比亚多模态公共卫生数据集(以城市街区为单位的地面观测)。再加上 SoilGrids 这类全球土壤栅格,以及 Overture Maps 这类矢量地图,构成了一个很小的「地球观测」邻域。
在这个邻域里,WorldCover 的位置是明确的:它是唯一一个「成品分类图」。
6.2 与 EuroSAT 的分工
| 维度 | EuroSAT | WorldCover |
|---|---|---|
| 数据性质 | 待分类的影像 | 已完成的分类 |
| 空间单元 | 64×64 像素瓦片 | 10 米单个像元 |
| 标签来源 | 人工核对 | 算法生成加专家规则 |
| 用途 | 训练分类器 | 当背景图层与弱标签 |
| 地域 | 欧洲 34 国 | 全球陆地 |
| 类别 | 10 类(含公路、工业区等细分) | 11 类(按 FAO 体系) |
这两者最容易被混淆的地方是类别名。EuroSAT 有 Forest,WorldCover 有「乔木覆盖」,名字看着相近,判定规则完全不同:EuroSAT 的森林是一张 640 米见方的图整体被判定为森林,WorldCover 的乔木覆盖是单个十米格内树冠覆盖超过一成。
它们能配合使用,但方向只有一个:用 WorldCover 给未标注影像打弱标签,再用 EuroSAT 这类人工核对的小样本去校准。反过来不行——WorldCover 的精度不足以教一个模型认细节。
6.3 与 Landsat 的分工
Landsat 是三十米分辨率的原始影像档案,五十年不间断。它是「X」,WorldCover 是「y」。若要做历史地表覆盖重建,Landsat 提供影像序列,WorldCover 提供 2020 与 2021 两个锚点。两者分辨率不同,八倍面积差,直接叠加时需要做重采样并接受精度损失。
6.4 与 SoilGrids 的角色对照
SoilGrids 提供的是全球 250 米土壤属性栅格,每个格有四个分位数。它是一个连续的属性场,而 WorldCover 是离散的类别场。两者在建模里常被并列使用:土壤属性解释「为什么这里是农田」,覆盖类别回答「这里现在是什么」。它们同为全球栅格产品,但一个是原因的代理,一个是结果的状态。
6.5 检索路径建议
要找「全球尺度的地表状态图层」,从 WorldCover 出发;要找「可训练的分类样本」,从 EuroSAT 出发;要找「原始影像时间序列」,从 Landsat 出发。三条路径互不重叠,交叉检索时只需要记住一件事:分类产品的精度天然低于影像,因为它在影像之上又加了一层判断。
§7 质量与已知问题:它不该按什么标准评价
7.0 阅读本节前需要知道的一件事
看一份分类产品,最常见的评价错位是拿它去与「真值」比。地表覆盖没有真值,只有不同的人在不用尺度上做的不同判断。WorldCover 的 76.7% 不是「错了 23.3%」,而是「在与另一套独立判断比较时,有 76.7% 的十米格给出了相同的答案」。
这个区分很关键。两套判断都可能有错,一致性高不代表都正确,一致性低也不代表只有一个错。因此本节讨论的不是「它准不准」,而是「它在哪些情形下会偏离,偏多少,偏离的方向是哪边」。
7.1 官方承认的四类局限
产品手册 §4 列了一份「非穷尽清单」,每条都给了具体坐标。这是产品文档里很少见的坦率,值得逐条读。
| 局限 | 手册给的示例坐标 | 机制 | 对使用者的含义 |
|---|---|---|---|
| 高云量地区的云伪影 | 东经 7.38、北纬 1.58(西非) | 即使有雷达,持续云覆盖区仍会残留伪影 | 热带雨林区慎用 |
| 硬边界 | 东经 31.40、北纬 13.20(苏丹) | 模型推断对相邻区域输入量敏感,轨道边界与分块边界可见 | 拼接时会出现不自然的直线 |
| 冰川与山体阴影被判为水体 | 西经 73.28、南纬 49.89(巴塔哥尼亚) | 阴影区与消融区在特征上与水体相近 | 高山与冰川区的水体图不可信 |
| 农田与湿地混淆 | 西经 56.73、南纬 27.28(南美) | 灌溉农田与草本湿地光谱高度相似 | 这正是草本湿地 30.5% 用户精度的来源 |
第二条「硬边界」值得多说两句。它的成因来自 §3.2 讲的特征设计:相邻瓦片或相邻 Sentinel-2 轨道的观测次数不同,输入到模型的特征就不同,同一种地物在边界两侧可能被分到不同类。这类伪影是算法结构的产物,不是数据质量问题。它在地图上表现为一条笔直的线,而自然地表很少长成直线。
7.2 尺度效应:十一选一这件事本身
十米一格只有一个答案,这是产品的定义方式,不是缺陷。但它有一个必然的后果:混合景观的比例信息被抹平。
一块林田交错的农业区,真实构成可能是六成农田四成林地。在十米格上,每一个格大概率还是单一地物——十米很小,大多数格子在物理上是纯的。但只要格子刚好压在地类边界上,它就必须二选一,而选择的标准是分类器在那一点的特征。
这个问题的真实规模取决于景观的破碎程度。在北美大平原的连片麦田里,边界极少,几乎每格都纯;在东南亚的梯田与林地交错带,边界密度极高,可能有三成以上的格子处在过渡位置。
对使用者的实践含义:在小区域统计里,产品的误差不是随机的,而是随景观破碎度上升。同一套产品,在连片草原上算面积比在丘陵农业区上算面积可靠得多。
7.3 输入质量的空间不均等
质量图层的存在本身就是官方承认分布不均的证物。三个通道里最有信息量的是第三个:被丢弃的无效 Sentinel-2 观测百分比。
手册给了组合公式:第二通道与第三通道组合可以反推总观测数。总观测数少、无效比例高的地方,就是分类器证据最薄弱的地方。这些地方的误差会显著高于全球均值,而全球 76.7% 把它们平均掉了。
这也解释了为什么雷达没有解决所有问题。雷达的优势是穿透云层,能提供光学拿不到的样本;但雷达的观测几何与地表散射机制不同于光学,在两套信号都很弱的地方——比如常年积雪的极地、频繁暴雨的热带雨林——联合输入也只能给出概率性的判断。
7.4 DAIMS 二十四项对照
DAIMS 是 Data Documentation Initiative 提出的数据质量评估框架,原本面向社会科学调查数据。借它的二十四项检查点,可以把这份产品的成熟度摊开来看。
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 宽格式 | ❌ | 栅格不是表格,没有行列结构,须先聚合才能进表格工具 |
| 2 | 唯一标识 | ✅ | 瓦片号全球唯一且语义明确,年份与版本在文件名里 |
| 3 | 特殊字符 | ✅ | 文件名全为 ASCII,无空格 |
| 4 | 重复行 | ⚠️ | 瓦片不重叠,但跨瓦片的地类边界会出现相同地物被多次编码 |
| 5 | 缺失编码 | ⚠️ | 海洋与南极直接不出图,没有显式的「无数据」占位说明 |
| 6 | 标签标识 | ✅ | 十一个编码与 FAO LCCS 的映射在手册表 3 给出 |
| 7 | 罕见类分组 | ⚠️ | 红树林与苔藓各自成类,面积小导致精度区间极宽 |
| 8 | 偏倚评估 | ✅ | 官方验证报告按七个大洲分别给出精度 |
| 9 | 数据字典 | ✅ | 手册表 2、表 3 给出图层与类别定义 |
| 10 | 信息性缺失解释 | ⚠️ | 质量图层给出输入数量,但不解释某处为何被判定为某一类 |
| 11 | 设备记录 | ✅ | Sentinel-1 GRD 与 Sentinel-2 L2A 的预处理流程在手册 §2.1 完整 |
| 12 | 共线性 | ⚠️ | 115 维特征中植被指数与波段分位数高度相关,无官方共线性报告 |
| 13 | 编码映射 | ✅ | 类别码与 LCCS 的对照表公开 |
| 14 | 时间戳处理 | ⚠️ | 只有年份粒度,没有月份或过境日期 |
| 15 | 划分建议 | ❌ | 产品不是训练集,不提供训练与验证划分 |
| 16 | 泄漏讨论 | ❌ | 官方未讨论把产品自身当标签训练模型时的循环论证风险 |
| 17 | 标签分布 | ✅ | 类别面积在官方 viewer 可按行政区查,未在文档中汇总 |
| 18 | 测量偏倚 | ✅ | 验证报告专章讨论混淆方向与偏差方向 |
| 19 | 外部验证建议 | ✅ | 遵循 CEOS 第四阶段验证规范,独立第三方抽样 |
| 20 | 版本记录 | ✅ | 版本号有明确语义规则,两版各有 DOI |
| 21 | 预处理脚本 | ❌ | 无公开的生成流水线代码,方法只在手册中描述 |
| 22 | 合规要求 | ✅ | CC BY 4.0,附注 attribution 文本模板 |
| 23 | 多模态对齐 | ✅ | 雷达与光学在 Sentinel-2 网格上对齐,手册写明了做法 |
| 24 | 去标识化 | ⚠️ | 产品无个人数据,但十米建成区图可被反向用于识别特定设施 |
DAIMS 评分:17 / 24。按 ✅ 计 1 分、⚠️ 计 0.5 分、❌ 计 0 分,十四个满项、五个半分项、五个零分项。
评分解读:分数明显高于多数遥感数据产品,满项集中在验证、许可、版本、类别定义这些「产品级文档」维度。零分集中在「不是训练集」这一根因上——划分建议、泄漏讨论、预处理脚本三项,对一个产品而言本就不适用。这份产品被设计成一张图,而不是一套实验方案。
对你意味着什么:把它当产品用,几乎不会踩到文档缺口;把它当训练集用,就会撞上那三个零分项。缺划分、缺泄漏讨论、缺生成代码,意味着你无法复现它的标注过程,只能接受。
7.5 逐条局限,按影响排序
第一,类别精度极不均衡。灌丛与草本湿地的用户精度不足五成,而雪与冰接近九成三。把十一类当成一个整体来报告精度,会掩盖这个结构性差异。
第二,版本差异与真实变化不可分离。官方明说大部分差异来自算法。任何跨年对比必须把这一条写进方法学限制。
第三,混合像元信息不可恢复。生成阶段就做了硬判,事后无法分解。
第四,高纬面积计算陷阱。EPSG:4326 下像元实际面积随纬度收缩,不校正会系统性高估。这一点和 §1.5 的案例正好相反:案例区靠近北纬 23 度,校正量不足一成,忽略它看不出来;换到北欧或西伯利亚,同一份懒惰的代码会让面积多出三成以上。
第五,热带的残留云伪影。雷达能缓解但未消除。
第六,硬边界的视觉污染。分块边界与轨道边界会在地图上显现为直线,制图时必须检查。
第七,没有 2022 及以后版本。时序分析只能做两个时点。
7.6 外部验证与泛化
WorldCover 的验证由瓦赫宁根大学负责统计精度,IIASA 负责空间精度,两者独立于产品生成方。这一分工在遥感产品的验证里是比较严格的做法。
但独立验证只回答「与参考判断的一致性」,不回答「在你的任务里够不够用」。后者需要一个额外的、针对具体任务的验证步骤:在你的研究区、你的关注类别上,抽一批点人工判读,算出这个产品在你这里的精度。工程上的做法是抽两百到五百个点,覆盖主要类别,这一步的工作量远比想象中小,却能避免把 76.7% 当成自己任务的精度。
§8 生态与版本:它靠什么活下去
8.1 版本时间线
| 时间 | 事件 | 依据 |
|---|---|---|
| 2017 | WorldCover 大会召开,四百余人参加,计划由此酝酿 | 手册 §1.1 |
| 2019 | WorldCover 项目启动 | Terrascope 案例页 |
| 2021 年 10 月 | 2020 版 v100 发布,全球总体精度 74.4% | 手册 §1.1、验证报告 |
| 2022 年 10 月 24 日 | 产品手册 V2.0 定稿,描述 2021 版 | 手册版本记录 |
| 2022 年 10 月 28 日 | 2021 版 v200 发布,全球总体精度 76.7% | 验证报告 §1.1 |
| 2023 年 3 月 | 桶内网格文件(GeoJSON 与 FlatGeobuf)更新 | 对象最后修改时间 |
从项目启动到第一版发布不到两年,这是项目目标中明确写出的时间约束。速度快是有代价的:某些类别(湿地、灌丛)的精度在当时就没做上去,到第二版也仍是最弱的两类。
8.2 它在生态中的位置
全球地表覆盖产品这条线上,WorldCover 不是第一个,也不是唯一一个。按分辨率排,它处在十米这一档,比 100 米级的旧产品细十倍,比 30 米的 Landsat 派生产品细三倍。
它的独特定位在于三点同时成立:十米、全球、开放。多数十米级产品是区域性的;多数全球产品在 30 米或更粗;多数十米级产品需要商业许可。三者齐备的产品极少。
8.3 谁在依赖它
从产品手册与验证报告透露的线索看,它的使用者分为几类:做生物多样性评估的(生态区划分被直接用作输入特征)、做粮食安全的(耕地面积核算)、做碳评估的(林地与湿地的面积基数)、做气候建模的(陆面参数的下垫面分类)。
这几类用户的共同点是:需要一个全球统一口径的类别图层,且能接受 20% 量级的误差。这两条正好排除了一批对精度要求极高的用户,比如地籍测量、精细农业。
8.4 它为什么能持续
第一,有官方机构背书。ESA 是欧洲空间局,产品由 VITO 牵头的联盟执行,项目有合同编号(4000128231/19/I-LG)。这种组织形态保证了它不是某个实验室的一次性产出。
第二,有 DOI 与引用模板。两版各自登记了 Zenodo DOI,手册给出了完整的引用格式与地图署名文本。这一条对一个学术基础设施来说,比任何技术指标都重要——能被规范引用,才会被持续使用。
第三,有明确的方法可继承。整个流水线的前身是 Copernicus 全球土地服务的 100 米产品算法,手册明确写了这一点。这意味着它不是从零发明的方法,而是一条已经运行多年的技术路线的升级。
第四,有反馈闭环。官方 viewer 内置了反馈工具,用户可以标注伪影与误判。手册 §4 在列出四类局限之后,专门写了这一句。这条机制让产品的错误有地方去,而不是散落在论文的讨论部分。
8.5 引用与许可的准确写法
许可在手册 §5.1 原文是「WorldCover 产品免费提供,使用不受限制,完整许可信息见知识共享署名 4.0 国际许可」,并给出了 Creative Commons Attribution 4.0 International License 的表述。桶内 readme 与数据获取页的表述与此一致。因此许可可以明确写为 CC BY 4.0。
署名文本的官方模板是:© ESA WorldCover project [year] / Contains modified Copernicus Sentinel data ([year]) processed by ESA WorldCover consortium,年份填 2020 或 2021。
引用格式两版不同,2021 版的作者列表与 2020 版并不相同(新增了 Daems、Kirches、Xu 等人,减少了 Wevers 之外的部分作者),混用会出错。做正式引用时,从手册 §5.2 原样抄录,不要凭记忆拼。
§9 使用指引:三种角色,三条路径
9.1 三种角色
| 角色 | 目标 | 该做什么 | 该避免什么 |
|---|---|---|---|
| 分析者 | 把地表覆盖当协变量 | 按坐标取值,用质量图层筛样本,按纬度校正面积 | 把它当精确分类 |
| 建模者 | 用它做弱标签或预训练目标 | 只用高置信区域(质量图层观测数高的地方),并做人工抽检 | 直接用全球全量训练 |
| 评估者 | 用它当参照 | 先在自己的研究区抽点验一遍它的精度 | 用 76.7% 当自己任务的精度 |
9.2 在 AI 流水线中的位置
WorldCover 在流水线里的位置通常有两个。一个是上游的标签源:当你有一批无标注影像,想快速得到一批带噪声的标签做预训练,它是现成的一层。另一个是下游的验证基准:当你的模型输出了一张分类图,想与人家的结果对一下,它是一个全球可比的对象。
两个位置都不该出现在「真值」这一栏。它更像是一个参考系,而不是一根标尺。
9.3 一份最小可跑的实现
下面这段代码只用 numpy 与 rasterio,把「读一块瓦片的窗口、算类别比例、按纬度校正面积」串成一条完整链路。目的是把最常出错的三步显式写出来:窗口读、面积校正、类别筛选。
#-- 期望:输出埃及样本区的耕地与水体面积(平方公里)
import numpy as np
import rasterio
from rasterio.windows import from_bounds
URL = ("https://esa-worldcover.s3.eu-central-1.amazonaws.com/"
"v200/2021/map/ESA_WorldCover_10m_2021_v200_N21E030_Map.tif")
def area_km2(count, lat_deg, step_deg=1 / 12000, r=6371.0088):
lon_m = r * np.cos(np.deg2rad(lat_deg)) * np.deg2rad(step_deg) * 1000
lat_m = r * np.deg2rad(step_deg) * 1000
return count * lon_m * lat_m / 1e6
with rasterio.open(URL) as ds:
win = from_bounds(31.30, 22.95, 31.40, 23.05, ds.transform)
arr = ds.read(1, window=win)
lat_c = 23.00
vals, counts = np.unique(arr, return_counts=True)
for v, c in zip(vals, counts):
print(int(v), int(c), round(area_km2(c, lat_c), 3))
#-- 期望:仅出现 10/20/30/40/50/60/70/80/90/95/100 中的若干值
这段代码有三处值得注意的写法。from_bounds 用的是经纬度边界而不是像素坐标,省去了手工换算行列号。np.unique 带计数一次性拿到类别直方图,比循环统计快得多。area_km2 把纬度作为参数传入,因为在这块 0.1 度的窗口里,纬度变化很小,用中心纬度足够;如果窗口跨几个纬度,需要按行分别计算。
9.4 评估时最少要报的三件事
| 要报的 | 为什么 | 怎么报 |
|---|---|---|
| 用的是哪一版 | 两版算法不同,精度差 2.3 个百分点 | 写明 v100 或 v200 与年份 |
| 用了哪个子集 | 全球均值与你的研究区差异可能很大 | 给出研究区的大洲与主要类别 |
| 是否做了面积校正 | EPSG:4326 下不校正会高估 | 写明换算方法与所用纬度基准 |
§10 AI 使用声明
| 项目 | 内容 |
|---|---|
| 数据集性质 | 公开全球地表覆盖分类产品,非医疗数据,无个人数据 |
| 建议用途 | 背景协变量、弱标签来源、面积统计基线、方法对照 |
| 不建议用途 | 作为真值标签训练或评估模型、精细地物识别、变化检测的唯一依据 |
| 伦理注意 | 十米建成区图层可被反向用于识别特定设施,避免与敏感位置关联发布 |
| 引用要求 | 按年份引用对应 DOI,并附官方署名文本 |
| 版本锁定 | 明确写明年份与算法版本号,跨越两版时说明算法差异 |
| 许可 | CC BY 4.0 |
| 页面状态 | 已发布,最后核对 2026-10-30 |
常见误读
| 常见说法 | 实际情况 | 证据 |
|---|---|---|
| 「它是一套遥感影像数据集」 | 它是已完成的分类产品,无光谱波段可学 | 手册 §3.2:Map 为单波段 uint8 类别码 |
| 「精度 76.7%,差不多可以直接当真值」 | 类别间差距极大,湿地用户精度仅 30.5% | 验证报告 V2.0 §3.1 与混淆矩阵 |
| 「两版相减就是一年内的地表变化」 | 官方明说大部分差异来自算法 | 手册 §2.2 原文 |
| 「它有 2022 和 2023 版」 | 官方文档只描述 2020 与 2021 两版 | 手册 V2.0 与数据获取页 |
| 「十一类编码是连续的数字,可以取平均」 | 编码不连续(…90、95、100),无序数意义 | 手册表 3 |
| 「面积统计时数像元乘 100 平方米」 | 网格为经纬度,像元实际面积随纬度收缩 | 手册 §3.4.1,EPSG:4326 |
| 「质量图层和主图层一样是十米」 | 质量图层为 1/2000 度,约 60 米 | 手册 §3.4.1 |
| 「瓦片编号是连续的,0 到 6 度那格应该有」 | 无 N00E000,编号按实际含陆地的格子生成 | 桶内前缀查询返回 0 条 |
| 「许可不明,需要申请」 | 手册 §5.1 与 readme 均为 CC BY 4.0 | 手册 §5.1 与桶内 readme |
| 「它用深度学习做的」 | 用的是 CatBoost 梯度提升树,逐像元 115 维特征 | 手册 §2.1 |
| 「全球任何地方精度都差不多」 | 亚洲 82.1%,大洋洲与欧亚 72.5% | 手册表 4 |
| 「红树林与苔藓是装饰类别,可以忽略」 | 两者编码单列,正是产品有意保留的独立类别 | 手册表 3 |
附录 A 速查卡
| 键 | 值 |
|---|---|
| 瓦片边长 | 3° × 3° |
| 瓦片像素 | 36000 × 36000 |
| 网格步长 | 1/12000° |
| 类别数 | 11 |
| 主图层类型 | uint8 单波段 |
| 质量图层类型 | uint16 三波段,1/2000° |
| 坐标参考 | EPSG:4326 |
| 北界 | 82.75°N |
| 排除区域 | 南极洲、海洋 |
| 全球总体精度 | 2021 版 76.7%,2020 版 74.4% |
附录 B 版本对照
| 版本 | 年份 | 算法 | 训练位置 | 特征数 | 精度 | 手册 |
|---|---|---|---|---|---|---|
| v100 | 2020 | 初版 | 259,734 | 131 | 74.4% | PUM V1.0 |
| v200 | 2021 | 改进 | 319,415 | 115 | 76.7% | PUM V2.0 |
附录 C 术语表
| 术语 | 含义 |
|---|---|
| 地表覆盖(land cover) | 地表物理状态,如森林、水体 |
| 土地利用(land use) | 人类对土地的功能安排,与覆盖相关但不等同 |
| LCCS | 联合国粮农组织的土地覆盖分类体系,层级式 |
| COG | 云优化 GeoTIFF,支持按窗口读取与金字塔缩略 |
| GRD | Sentinel-1 的地距探测产品,经地形校正后为 GAMMA0 后向散射 |
| L2A | Sentinel-2 经大气校正的地表反射率产品 |
| GAMMA0 | 雷达后向散射的标准化表达,适合跨时相比较 |
| CatBoost | 一种梯度提升决策树实现,对类别特征友好 |
| Sentinel-2 网格 | Sentinel-2 产品的标准瓦片网格,本产品将雷达对齐到该网格 |
| 宏瓦片 | 60° × 60° 的整包,一个包里含若干 3° 瓦片 |
| PSU / SSU | 验证中的初级与次级抽样单元,前者 100 米见方,后者 10 米见方 |
| CEOS | 地球观测卫星委员会,其验证指南是国际通行标准 |
| 用户精度 | 产品判为某一类的地方,实际属于该类的比例 |
| 生产者精度 | 实际属于某一类的地方,被产品判为该类的比例 |
| 分位数特征 | 把时间序列压成统计量的做法,本产品用 10/50/90 分位与四分位距 |
| 硬边界 | 因输入量差异导致同种地物在相邻区域判为不同类的伪影 |
| 混合像元 | 一个像元内包含多种地物的情况 |
| 面积校正 | 在经纬度网格上按纬度换算像元实际面积 |
| attribution | 使用地图时必须附带的署名文本 |
| Ecoregions2017 | 全球生态区划分图层,本产品用作位置特征之一 |
| TerraClimate | 全球气象数据,本产品取七个变量作特征 |
附录 D 常见误读 FAQ
问:WorldCover 和 EuroSAT 能直接互换吗?
不能。EuroSAT 是影像,WorldCover 是分类结果。前者是输入,后者是输出。要一起用,方向只能是 WorldCover 提供弱标签、EuroSAT 提供人工核对样本。
问:它到底有多少张「图」?
2651 块瓦片,每块 36000×36000 像元。两版各 2651 块,合计 5302 个主图层文件。说「它有 2651 张图」是对的,但每张图都是一个十二亿像元的巨大栅格。
问:为什么官方说 117 GB,按字节算是 124 GB?
口径不同。117 是 GiB(二进制进位),124 是 GB(十进制进位),同一批文件。
问:为什么没有 N00E000 这块瓦片?
那一格跨几内亚湾,整片是海,不含陆地,产品只发布含陆地的格子。
问:能拿它做机器学习的训练集吗?
可以,但它是标签而不是特征。做法是用它给影像打弱标签,再训模型,且要按质量图层筛掉观测稀少的样本。
问:2020 和 2021 两版哪个更好?
2021 版包括建成区、草本湿地、苔藓在内的多个类别精度提升明显,全球总体精度从 74.4% 提到 76.7%。但复现旧论文时应沿用原版。
问:它是在 Google Earth Engine 上训练的吗?
不是。它用 CatBoost 在自有流水线上训练,Earth Engine 只是分发渠道之一。
问:为什么湿地那么不准?
灌溉农田与草本湿地的观测特征高度相似,无论用光学还是雷达都难以分开,官方把这一点列为已知局限。
问:它覆盖海洋吗?
不覆盖。范围是除南极洲以外的陆地,北界 82.75 度。
问:能不能用它算全球森林面积?
可以算,但报告时必须说明这是「乔木覆盖」而非「森林」,且要接受 80% 左右的用户精度与漏判偏多的倾向。
编辑说明
核对时间 2026-10-30。主要依据为产品手册 V2.0(WorldCover_PUM_V2.0.pdf,2022-10-24 定稿)、产品验证报告 V2.0(WorldCover_PVR_V2.0.pdf)、ESA WorldCover 数据获取页与 AWS 公共桶内的 readme 与对象清单。
瓦片数 2651 与主图层文件字节数,通过公共桶的 ListObjectsV2 分页查询逐页累加得出,2020 与 2021 两版结果一致;官方文字口径的「约 117 GB」与按字节求和的 124,027,923,380 字节在二进制与十进制进位下一致,正文中已按两种口径分别标注。单瓦片 36000×36000 像素、单波段 8 位、1024 分块,读自瓦片 GeoTIFF 头。
验证报告混淆矩阵的百分比数值在横纵方向与边际合计上存在内部不自洽,正文因此只引用报告文字描述与各类用户精度、生产者精度的单一数值,不引用矩阵格内的交叉数值。2020 与 2021 两版精度(74.4% 与 76.7%)的验证样本存在设计差异,2020 版曾剔除孤立次级抽样单元,正文已在 §4.6 说明。
未覆盖内容:官方 viewer 的交互功能未逐一试用;Terrascope 客户端与 Google Earth Engine 的取数路径未实际跑通,仅按手册描述;跨瓦片拼接与硬边界的实际视觉检查未做。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- soilgrids — 共享标签:多模态 / 评测基准 / 图像分类
- nasa-exoplanet-archive — 共享标签:多模态 / 评测基准 / 图像分类
- randolph-glacier-inventory — 共享标签:多模态 / 评测基准 / 图像分类
- gaia-dr3 — 共享标签:多模态 / 评测基准 / 图像分类
- cern-cms-opendata — 共享标签:多模态 / 评测基准 / 图像分类
- sdss-dr20 — 共享标签:多模态 / 评测基准 / 图像分类
- opentme — 共享标签:多模态 / 评测基准 / 图像分类
- alma-archive — 共享标签:多模态 / 评测基准
- biomedica — 共享标签:多模态 / 评测基准 / 图像分类
- plip — 共享标签:多模态 / 评测基准 / 图像分类
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

