142 万片水面 — 湖深几乎全是推算的 HydroLAKES

一个湖一个多边形,21 列属性,10 公顷门槛;岸线是画出来的,深度是推出来的

来源 HydroSHEDS(WWF 与 McGill University 全球水文实验室) url: https://www.hydrosheds.org/products/hydrolakes发布时间: 2026-10-29最后更新: 2026-10-29 阅读 5
142 万片水面 — 湖深几乎全是推算的 HydroLAKES

信息速览

数据集名称142 万片水面 — 湖深几乎全是推算的 HydroLAKES
数据类型142 万个岸线多边形,10 公顷最小面积,21 列属性,WGS84 无投影,体积单位百万立方米,6,796 条挂上 GRanD,CC-BY 4.0,763 MB 起
规模不适用(全球湖泊面要素,无个体记录;计数单位是「一个湖」,即一个岸线多边形加一行属性)
接入方式HydroSHEDS(WWF 与 McGill University 全球水文实验室) url: https://www.hydrosheds.org/products/hydrolakes
AI 就绪度

HydroLAKES 是一份把全世界的湖画成多边形的图集。一个湖一行,一行 21 列,一个岸线一个几何。它不记录水位,不记录水温,不记录任何随时间变化的东西:同一片水,在表里只有一次出现的机会。

这件事决定了它的全部用法。它不是湖泊监测网,也不是湖泊清单的权威版本,而是一张底图——回答「这片水在哪、有多大、岸线有多曲折、水从哪个口子出去」这四个问题,并把答案固定成可以被 GIS 直接吞下的矢量。

它被引用得极多,被误读得也极多。误读几乎都集中在同一处:以为那 21 列里装着观测。实际上,面积来自影像与水系图的边界描摹,体积与深度来自回归外推,流量来自全球水文模型的降尺度结果。整张表里唯一接近「观测」的,是岸线的位置。

项目 数值 依据
多边形数 1,427,688 技术文档正文与点图层记录数
最小纳入面积 10 公顷(0.10 平方公里) 技术文档,全表面积最小值
属性列 21 列 点图层 dbf 头部字段表
合计水面 267 万平方公里(自然湖) 技术文档,约合全球陆地 1.8%
合计岸线 720 万公里 技术文档,约为全球海岸线四倍
合计蓄水 181,900 立方公里 技术文档,约为全球非冻陆地水 0.8%
体积来源 推算 1,420,699 条、水库报告 6,723 条、湖泊文献 266 条 Vol_src 字段计数
水体类型 湖 1,420,891、水库 6,687、受调控湖 110 Lake_type 字段计数
挂上 GRanD 6,796 条 Grand_id 非零计数
有名字 3,022 条 Lake_name 非空计数
坐标参考 WGS84 经纬度,未投影 技术文档与 .prj
许可 CC-BY 4.0 International 官方产品页原文
主引用 10.1038/ncomms13603 官方产品页参考文献

§1 速览:它是什么,也不是什么

1.1 一句话定义

HydroLAKES 是一份全球湖泊与水库的岸线多边形矢量库,由 HydroSHEDS 体系在 2016 年发布,覆盖面积不小于 10 公顷的全部水体,每个水体一个多边形、一行属性。

它的定位可以用一句话说清:把「世界上有哪些湖、它们长什么样」这件事,做成一张可以叠加、可以切分、可以挂到河网上的矢量底图。

1.2 三层身份

第一层是几何。142 万个多边形,WGS84 经纬度,没有投影。这意味着面积不能直接从几何算,必须读 Lake_area 列;也意味着跨高纬度做缓冲区时,一度经度对应的距离会缩水,任何基于几何的距离运算都要先转投影。

第二层是属性表。21 列里,七列是身份与归属(编号、名字、国家、洲、多边形来源、水体类型、GRanD 编号),五列是几何与地形(面积、岸线长、岸线发育度、高程、周边坡度),剩下九列是水文推算(体积、库容、体积来源标记、平均深度、流量、停留时间、流域面积、出水口经度与纬度)。

第三层是拓扑接口。每个湖有一个出水口,出水口落在 HydroSHEDS 河网的某个像元上;这个像元的上游汇流累积量被算成流域面积,出水口的流量被算成 Dis_avg。湖因此不是一个孤岛,而是河网上一个带面积的节点。

三层身份里,最容易被忽略的是第三层。多数人把它当一张湖泊分布图用,实际上它真正的设计目的是给全球水文模型提供「湖」这个对象——让水从上游流到湖里、在湖里停一段时间、再从出水口流出去这条链路,能在全球尺度上算得下去。

1.3 三十秒决策卡

你的处境 它能给你什么 你要自己补什么
要在流域模型里放湖泊的调蓄作用 每个湖的位置、面积、体积、停留时间、出水口坐标 水位—面积—库容曲线,它没有
要统计某国或某流域的湖泊数量与总面积 现成的多边形,按国家、洲、流域面积切分 阈值敏感性分析,10 公顷以下没有
要给河网模型标注「这段河上有湖」 出水口坐标,可以空间挂到河段上 河段编号要自己做空间相交
要做湖泊水质或富营养化建模 湖的几何与流域面积,作为分层与负荷的底数 营养盐、土地利用、人口,全部没有
要找水库做调度研究 被标为水库的记录,以及挂上 GRanD 编号的那一批 坝高、装机、调度规则,去 GRanD 取
要研究湖泊数量随时间的增减 无。只有一版 整个时间序列,得换数据源
要一份「全球有多少湖」的权威答案 一个特定门槛下的计数 门槛之外的答案,它给不了

1.4 不适合谁

不适合拿它做湖泊变化监测的人。它没有第二个时相,也没有任何一列带日期。想回答「这个湖十年里缩了多少」,这份数据只能提供起点的一半,终点要去别处找。

不适合需要单个湖的精确深度的人。表里那一列平均深度,对绝大多数湖是回归外推值,官方文档自己写着:单个湖的误差与不确定性可能很大,解读时应当谨慎。做航运、取水、水库设计这类需要真实水下地形的活,它顶多提供一个数量级。

不适合把湖泊数量当成自然事实的人。142 万这个数字是「10 公顷以上、被这八套源数据画出来、并通过了人工剔除」的水体数,不是地球上水体的总数。换一个门槛,数字会换一个量级。

1.5 贯穿本文的案例:乍得湖那 0.1 米

打开属性表,第 15 行是乍得湖。面积 18,751.52 平方公里,体积 2,400(单位是百万立方米,即 2.4 立方公里),平均深度 0.1 米,停留时间 25.6 天,流域面积 980,211.9 平方公里,出水口流量 1,085.078 立方米每秒。

三个数字放在一起,算式是自洽的:2.4 立方公里除以 18,751 平方公里,等于 0.000128 公里,也就是 0.13 米,四舍五入进一位小数就是 0.1 米。体积除以流量,2.4 立方公里除以 1,085 立方米每秒,约 25.6 天。每一步都对。

错的是这三步的输入不在同一个状态上。面积来自多边形,这个多边形是 2000 年前后某一次制图时的水面轮廓,而且它的来源标记是 Other,即团队自己描的,不是从国家水系图里拿的;体积来自文献报告值,报告的是一个水浅、面积小的年份。一个按丰水期画的边界,配一个按枯水期量的体积,商出来就是一个物理上不成立的平均深度:18,751 平方公里的水面只有 0.1 米深,等于一片 1.9 万平方公里的浅碟。

这个案例会在后面反复出现,因为它是这份数据全部陷阱的浓缩:几何是快照,属性是拼装,派生量忠实放大了拼装的裂缝。凡是要用 HydroLAKES 的体积、深度、停留时间做定量分析的人,都会在某一处遇到自己的乍得湖。

§2 数据构成:142 万个多边形是怎么拼出来的

2.1 两个图层,四种打包

产品以两个 GIS 图层发布。HydroLAKES_polys_v10 是多边形,HydroLAKES_points_v10 是出水口点。两者属性完全相同,只是几何一个是面、一个是点。官方把这层意思写在技术文档里:所有版本含有相同的属性信息,面与点的属性表列一致。

打包成四个压缩包:多边形 geodatabase 763 MB,多边形 shapefile 820 MB,出水口点 geodatabase 81 MB,出水口点 shapefile 79 MB。多出来的 57 MB 是两种容器对几何的存储方式不同——同一批坐标,geodatabase 的二进制块比 shapefile 的定长记录更省空间;点图层恰好相反,shapefile 版反而小两兆。

四个包里都夹了一份技术文档 PDF。这一点值得记一笔:数据包自带说明书,不需要再去网站上找。文件时间戳是 2016 年 12 月 13 日,与文档封面的 2016 年 12 月对得上。

2.2 八个来源拼成的一张图

源数据 覆盖区 原格式与比例尺 贡献多边形数
CanVec 加拿大全境 矢量,1:50,000 863,550
SWBD 56°S 至 60°N 栅格,1 弧秒(赤道约 30 米),矢量化后平滑 282,571
MODIS MOD44W 60°N 以北的俄罗斯 栅格,250 米,矢量化后平滑 167,435
美国 NHD 阿拉斯加全境 矢量,1:24,000 58,496
ECRINS 60°N 以北的欧洲与挪威全境 矢量,约 1:250,000 50,699
GLWD 全球 矢量,1:100 万 3,023
GRanD 全球 矢量,1:100 万或更精 1,133
团队自绘 全球 矢量,1:100 万或更精 781
合计 1,427,688

这张表解释了一件反直觉的事:全球湖泊数里,六成来自加拿大的一个国家水系图。加拿大有世界上最多的湖,也有少数几个把全国水体按 1:5 万画完的国家测绘项目,两个条件叠在一起,就把这份全球数据的重心压到了北美。

表里还有一处容易忽略的结构:SWBD 覆盖的是 56°S 到 60°N,不是全球。60°N 以北的俄罗斯用 MODIS 的 250 米掩膜补,欧洲北部用 ECRINS 补,加拿大整国用 CanVec 覆盖(包括 60°N 以北的部分)。所以「这份数据的分辨率」不是一个数,而是随经度纬度变化的一个谱。

2.3 十公顷这条线

10 公顷是 0.1 平方公里,相当于一个边长 316 米的正方形。这是纳入门槛,也是这份数据最硬的一条边界。

门槛的执行很彻底。全表面积最小值恰好是 0.10 平方公里,没有一条比它更小。而面积恰好写成 0.10 的记录有 106,083 条,占全表的 7.4%——这不是巧合,是截断造成的堆积:所有真实面积落在 0.095 到 0.105 平方公里之间的水体,四舍五入到两位小数之后都落在这一格上。

这条线决定的不是精度,是本体。小于 10 公顷的水体不叫「没画准」,叫「不在定义里」。一个 8 公顷的池塘,无论多重要,在这份数据里不存在;而一个刚好 10.2 公顷的水库,会以完整的多边形和全套属性出现。跨这条线做任何比较,比如「某地 1990 年有多少湖、2020 年有多少湖」,只要两期数据的门槛不同,结论就一半是水体变化、一半是门槛变化。

还有一条更细的线:湖内小于 3 公顷的岛屿在制图时被移除。所以一个多岛湖的岸线长度,是不含小岛的岸线长度;岸线发育度这个指标,也因此系统性地偏低。

2.4 三种比例尺共存

技术文档承认,最终分辨率无法严格定义——因为源数据比例尺从 1:24,000 到 1:100 万不等,中间又经过栅格化、缝隙清理、平滑、简化。

团队给出的最佳近似是:加拿大与阿拉斯加约 1:100,000(两地合计占全球湖泊数的三分之二);欧洲与 60°N 以南的其余地区约 1:250,000;北俄罗斯与格陵兰约 1:100 万。

这个梯度对使用者有直接后果。同一个 1 平方公里的湖,在加拿大可能被画成一个带十几个弯的轮廓,在北俄罗斯可能被画成一个近似椭圆。算岸线长度、算岸线发育度、算周长面积比,跨国比较得到的差异里有相当一部分是制图比例尺的差异,不是水体的差异。

2.5 密歇根与休伦为什么算两个湖

密歇根湖与休伦湖在水体上是连通的,中间只隔着一道宽而浅的咽喉。按水文连通性,它们可以算一个湖;按这份数据的约定,它们是两个。

技术文档把这件事专门写了出来:为了符合把两者当作独立单元的一般惯例,它们被拆成两个多边形。表里也能看到这个处理——密歇根的编号是 6,休伦是 8,中间夹着 7 号安大略湖。

这个细节的意义不在两个湖本身,而在它揭示的判据:这份数据的「一个湖」不是水文学定义,是制图惯例加人工判断。同样的模糊地带还有牛轭湖(洪水期变成河道)、季节性湿地(旱季变成草滩)、潟湖(与海隔一道沙嘴)。文档承认,湖、河、湿地的过渡带在任何数据集里都是高不确定区,这份数据只是选择了跟随源数据的既有分类,没有自己去做过程判别。

2.6 只有三千个湖有名字

142 万条记录里,Lake_name 非空的只有 3,022 条,占千分之二。

填充规则写在字段说明里:面积不小于 500 平方公里的湖;GRanD 里有名字的大型水库;GLWD 里有名字的较小湖泊。三条规则之外,一律留空。

于是出现一个使用上的硬约束:你不能靠名字找湖。想定位一个小湖,只能靠坐标、靠行政单元、靠与别的水体数据的空间相交。反过来,名字也不是可靠的唯一键——表里叫 Victoria 的至少有乌干达的维多利亚湖、加拿大的一处水库、澳大利亚的一处水库,三行同名不同湖。

2.7 一个湖一个多边形:溶解的代价

源数据里,一个湖常常被切成好几块:SWBD 按 1 度见方的瓦片分发,湖跨瓦片就被切断;CanVec 的部分省份把湖泊与连接河道画成一个大多边形。

以 SWBD 为主的那一部分,处理办法是先栅格化到 30 米,再在区域尺度上拼接成无缝栅格,用膨胀收缩把瓦片错位造成的细缝补上,最后重新矢量化并做简化平滑。跨瓦片的同一个湖因此被溶解成一个多边形。

代价是岸线被重新采样了两次。一次是栅格化,一次是矢量化。30 米像元的边界不可能比 30 米更精细,简化平滑又会削掉小尺度的曲折。这解释了为什么这份数据的岸线看起来「圆润」——它不是天然的圆润,是处理流程留下的手感。

§3 结构层:21 列属性怎么读

3.1 三组列

把 21 列按用途分组,比按文档顺序读更有用。

第一组是身份与归属:Hylak_id、Lake_name、Country、Continent、Poly_src、Lake_type、Grand_id。这七列回答「这是哪个湖、在哪、谁画的、什么类型、有没有对应的坝」。

第二组是几何:Lake_area、Shore_len、Shore_dev、Elevation、Slope_100。这五列描述形状与位置,其中前三列是纯几何量,后两列是地形量。

第三组是水文推算:Vol_total、Vol_res、Vol_src、Depth_avg、Dis_avg、Res_time、Wshd_area、Pour_long、Pour_lat。这九列是从几何加外部模型推出来的,全部带条件、全部有哨兵值。

分组的意义在于:第一组可以直接用,第二组可以用但要清楚它的制图来源,第三组每用一次都要先看来源标记。

3.2 Hylak_id 是行号,不是编码

Hylak_id 从 1 连续排到全表末号,无缺号。它不是按国家分段的编码,也不是哈希,就是行号。

编号靠前的若干行是人工编排的世界大湖:1 号里海,2 号大熊湖,3 号大奴湖,4 号温尼伯湖,5 号苏必利尔湖,6 号密歇根湖,7 号安大略湖,8 号休伦湖,9 号伊利湖,10 号拉多加湖,11 号贝加尔湖,12 号巴尔喀什湖,13 号大咸海,14 号卡拉博加兹戈尔湾,15 号乍得湖,16 号维多利亚湖,17 号坦噶尼喀湖,18 号马拉维湖。

这十八个编号看起来像按面积排序,实际上不是:7 号安大略湖面积 19,347 平方公里,排在 8 号休伦湖的 59,399 平方公里前面。更像是先按大洲与知名度人工列了一批,之后交给程序批量填。

对使用者来说,这意味着一件事:不要用 Hylak_id 的大小推断任何属性。它只是主键。19 号之后就是普通湖泊,编号大小与面积无关。

3.3 几何三列与岸线发育度

Lake_area 是多边形面积,单位平方公里,两位小数。它是团队在制图流程里算好写进表里的,不是 GIS 打开文件时现算的。这一点很要紧:同一个湖,用工具自带的面积字段量一遍,得到的是按经纬度当平面坐标算出来的平方度,两者不能混用。全球加总用这一列,得到的就是官方那个 267 万平方公里。

Shore_len 是岸线长度,单位公里,同样受制图比例尺影响。

Shore_dev 是岸线发育度,定义为岸线长度与同面积圆周长之比。正圆是 1,越曲折越大。这个指标的设计意图是剥离面积影响,让不同大小的湖可以比较形状复杂度。它有一个已知的性质:对同一片水,观测分辨率越高,量出来的岸线越长,发育度越大。所以跨数据源比较发育度,比的其实是分辨率。

Elevation 是湖面高程,单位米,取湖范围内出现次数最多的像元高程。Slope_100 是湖外 100 米缓冲带的平均坡度,单位度。

3.4 体积列的单位

Vol_total 的单位是百万立方米,一列注释写得很清楚:1 mcm 等于 0.001 立方公里。这是整张表最贵的一个坑。

一条记录的 Vol_total 写着 23,615,000,读成立方公里就是两千三百万立方公里,比全球淡水总量还多;除以一千得到 23,615 立方公里,才是贝加尔湖。

校验的办法很简单:拿面积乘深度,看能不能对上同一行的体积。贝加尔湖 31,967.85 平方公里乘以 738.7 米,得 23,614 立方公里,与 23,615,000 除以 1000 的结果一致。里海 377,001.91 平方公里乘以 200.5 米,得 75,589 立方公里,与 75,600,000 除以 1000 的 75,600 一致。

三列之间这种自洽性是一把好尺子:它能验证单位,但不能验证真值。§1.5 的案例就是自洽但失真的典型。

3.5 深度是商,不是观测量

Depth_avg 的定义写在字段说明第一句:平均水深等于总体积除以湖泊面积。

这句话很短,后果很长。它意味着深度不是独立测量,而是体积的派生量。体积错一千倍,深度跟着错一千倍;面积偏 5%,深度就偏 5%。任何对深度的怀疑,本质上都是对体积与面积的怀疑。

第二层后果是:深度不携带任何形状信息。一个碗形的湖和一个平底锅形的湖,只要体积与面积相同,平均深度就相同。做水温分层、做溶解氧模拟、做沉积物分布,真正需要的是水深分布,而这列只有一个数。

第三层后果与 §1.5 的案例直接相关:当面积与体积来自不同年份、不同来源时,它们的商没有物理意义。乍得湖那 0.1 米不是「湖很浅」,是「两个数不是同一时刻的」。

3.6 Lake_type 只有三档

类型字段的取值只有三个:1 是湖,2 是水库,3 是受调控的天然湖(有调节建筑物的天然湖)。

全表计数:1 有 1,420,891 条,2 有 6,687 条,3 只有 110 条。

这里有两个必须说清的点。

第一,没有盐湖这一类。数据里确实包含咸水湖,里海、咸海、大盐湖、乌尔米耶湖都在,但它们的类型标记都是 1,与淡水湖无法区分。靠 Lake_type 筛盐湖会得到空集,靠名字筛只能筛到有名字的那三千个。

第二,默认值是 1,而且文档明确说:只有被明确识别为其他类型的水体才有别的值,所以「湖」这一类同时兜住了所有未被识别的小型人工水库与调节湖。换言之,6,687 这个水库数是一个下界,不是总数。

第三,110 条受调控湖少得刺眼,但里面包含贝加尔湖、温尼伯湖、维多利亚湖、安大略湖、奥涅加湖。判断依据主要来自 GRanD 的比对,也就是说,只有被 GRanD 收录或有明确文献的调节湖才被标出来。

3.7 Grand_id:唯一的外键

21 列里,唯一一个指向另一份数据的字段是 Grand_id:对应的 GRanD 水库编号,没有对应记录时填 0。

非零的记录有 6,796 条。这个数字与技术文档里「6,796 个多边形与 GRanD 对应并被赋了 GRanD 编号」完全一致。

它的用法很直接:按 Grand_id 把 GRanD 的坝高、装机容量、建成年代、用途、灌溉面积 join 进来,就从一个纯几何库变成了一个带工程属性的水库库。这也是这份数据里唯一不需要做空间运算就能完成的外部连接。

需要注意它的方向性:Grand_id 只覆盖水库,天然湖一律是 0。非零记录与「类型为水库」的记录不是同一个集合,前者还包含一部分被标为受调控湖的水体。

3.8 两种哨兵值

水文列用两种哨兵值表示「没有」。

-1 表示算不出来。Res_time 等于 -1 的有 30,628 条,原因是 Dis_avg 为 0,体积除以零没有定义。Slope_100 等于 -1 的是面积不小于 500 平方公里的湖,坡度没有算。

-9999 表示位置不在有效范围内。Dis_avg 与 Res_time 各有 793 条是 -9999,Wshd_area 同样,原因是出水口落到了 HydroSHEDS 陆表掩膜之外——通常是河口、潟湖、或者多边形本身画到了水上。

这两种值的处理方式不同。-1 是「有湖但算不出」,做统计时应当剔除而不是补零;-9999 是「位置无效」,往往提示这个多边形本身有问题,值得单独看一眼。把两者一起当缺失值处理,会丢掉这个信号。

§4 边界层:哪些数字能信,信到什么程度

4.1 Vol_src 四态:数字的户口

体积这一列不是一个来源,是三个来源按优先级拼起来的。Vol_src 记录的就是优先级。

取 1 的有 266 条:体积是文献报告的湖泊体积。贝加尔湖那 23,615 立方公里、里海那 75,600 立方公里、坦噶尼喀湖那 18,940 立方公里,都属于这一类。这类值最接近「真值」,因为它们来自测深记录或权威汇编。

取 2 的有 6,723 条:体积是 GRanD 或文献报告的水库库容。这一类描述的是「设计库容」或「总库容」,不是某一天的水量。水库的库容随调度常年变化,一个数代表不了它。

取 3 的有 1,420,699 条:体积是模型推算值,占全表的 99.5%。这是绝大多数湖的处境——没有测深,没有文献,只有一个从面积和周边坡度推出来的数。

三者合起来正好是全表条数,一条不多一条不少。这条恒等式本身就是一次质检:它说明 Vol_src 没有空值,也没有第四种状态。

一处对不上的地方值得记下:技术文档说,6797 个大水库或调节湖的库容被并入,主要来自 GRanD;而属性表里 Vol_src 取 2 的只有 6,723 条,差 74 条。差额最可能落在那些被报告了湖泊体积、同时又受调控的水体上——文档说这类湖取「报告库容与湖泊体积中的较大者」,取值最终落在 1 而不是 2。文档没有明写,这里只把它当作一个对账时的已知缺口。

4.2 五百平方公里这条暗线

体积的处理在 500 平方公里处换了一次手。

面积在 0.1 到 500 平方公里之间:深度由回归模型给出,体积等于深度乘面积。

面积大于 500 平方公里:深度改从文献取,来源是 170 份文献,主源是 1982 年那份全球大湖汇编。

这条线的存在有充分理由。大湖的湖盆形状复杂,面积与周边坡度的关系解释不了它们的深度——贝加尔湖的深度来自一条裂谷,坦噶尼喀湖也来自裂谷,这两个湖的周边坡度与深度之间没有稳定关系。对小湖,周边地形能大致反映湖盆的深浅,因为湖盆往往就是地形的最低处;对大湖,这个关系断了。

但它带来一个结构性后果:跨 500 平方公里这条线比较深度,比的是方法不是水体。一个 480 平方公里的湖,深度是回归值;一个 520 平方公里的湖,深度是文献值。两者放在一张散点图上,500 附近会出现一个不连续。

4.3 回归模型长什么样

模型的自变量只有两个:湖泊面积,以及湖外 100 米缓冲带的平均坡度。因变量是平均深度。形式是按规模分组的多元回归方程。

训练数据是七千多个湖的测深记录,验证数据是另外五千多个湖。文档对验证结论的表述是:区域性结果令人满意,但单个湖的体积解读需谨慎,个体误差与不确定性可能很大。

这句话要按字面读。「区域性结果令人满意」说的是把一片区域的湖加总,总量大致对得上;「个体误差可能很大」说的是单个湖可能差好几倍。两者不矛盾:一批高估和一批低估在求和时互相抵消,剩下的偏差就小了。

这解释了为什么这份数据的全球合计看起来合理(181,900 立方公里,量级与通行的全球湖泊蓄水估算一致),而单个湖的数字经常离谱。§1.5 的案例是极端情形,但绝不是孤例——乌尔米耶湖 4,932.76 平方公里配 1,800 百万立方米体积,平均深度 0.4 米;大咸海 23,865.91 平方公里配 26,800 百万立方米,平均深度 1.1 米。前者是萎缩中的盐湖,文献值对应的是接近干涸的状态;后者是 2000 年前后已经分裂的残湖。数值都「对」,只是对的是另一个时刻的水体。

还有一种是输入本身就错。14 号卡拉博加兹戈尔湾,面积 18,666.80 平方公里,体积 1,885,347 百万立方米,平均深度 101.0 米。三个数互相自洽——面积乘深度正好等于体积——所以错不在算式。这个湾是一片与里海隔着一道沙嘴的浅水潟湖,101 米这个量级与它的实际形态不符,更可能是输入表在录入或单位换算时出了偏差。它提醒一件事:文献值不等于正确值,Vol_src 取 1 只是说「这个数有出处」,没说「这个数经过复核」。

4.4 流量从哪来

Dis_avg 的来源是全球水文模型 WaterGAP 的长时间平均径流与流量,时段是 1971 到 2000 年,模型版本 2.2(2014 年状态)。

原始分辨率是 0.5 度,约 50 公里一格。这个尺度对湖泊出水口太粗,所以先用地质统计方法降尺度到 15 弧秒,约 500 米,与 HydroSHEDS 河网对齐,再在出水口位置取值。

文档对这一步的验证说得很实在:与全球径流数据中心约三千个水文站的多年平均流量比对,总体相关性良好,但个体不确定性可能很高,尤其是流量很小的时候。

小流量的问题在于相对误差。一个出水口模型给 0.08 立方米每秒,真值可能是 0.02,也可能是 0.3,绝对误差不大,相对误差三四倍。而停留时间等于体积除以流量,流量在分母上,相对误差直接搬进结果。

4.5 停留时间是三个估算的商

Res_time 的定义:体积除以平均流量,单位天。

分子是估算(99.5% 的记录),分母是模型降尺度值,商是两个误差的叠加。文档还加了一条人为规则:算出来小于 0.1 天的,一律抬到 0.1,理由是更短的停留时间不合常理、多半是模型错误。

这条规则说明团队自己知道尾部不可靠。全表最大的停留时间是 13,203,790 天,约三万六千年;最小值被规则钉在 0.1 天。这个跨度里,中位数比均值更值得引用——文档给的全球均值是 1,834 天,中位数是 451 天,均值是中位数的四倍,说明分布被少数极长停留的大湖拉长了。

对一个具体的湖,停留时间的可用性取决于它的规模。大湖的流量与体积都相对可靠,商也相对可靠;小湖的两项都在误差里,商的意义接近于零。

4.6 高程与坡度也是推的

Elevation 取湖范围内出现次数最多的像元高程,底图是 90 米的 EarthEnv-DEM90。60°N 以北出现的负高程,被换成 1 公里 GTOPO30 的结果,以免出现「北纬七十度的湖面在海平面以下」这种地形伪影。60°N 以南沿海仍有少量小负值,文档说明这些值可能对也可能错。

Slope_100 同样来自 EarthEnv-DEM90,取湖外 100 米缓冲带的平均坡度,做了纬度改正。面积不小于 500 平方公里的湖,这一列是 -1,因为大湖的缓冲带会跨越多条地形带,平均值没有意义。

这两列的重要性被低估了:Slope_100 不只是一个描述,它还是体积模型的输入之一。改坡度就改深度,改深度就改体积。所以当有人问「能不能用更好的 DEM 重算这份数据的湖深」,答案是能,但那已经是一份新数据,不是这份。

4.7 完整性边界:三十五公顷

10 公顷是纳入门槛,35 公顷是完整性门槛。

文档引用了一篇统计外推:35 公顷以上的湖泊,这份数据基本收全;10 到 35 公顷之间,接近收全。

这两个词的区别很重要。「收全」意味着与现实对得上;「接近收全」意味着有系统性的漏画,且漏画集中在某个面积段。把 10 到 35 公顷这一段单独拿出来做数量分析,得到的密度图会反映源数据的覆盖差异,不是水体的真实密度。

更麻烦的是跨版本比较。如果将来出现一份门槛不同、或者源数据不同的新版,同一片地物会在两个版本里忽隐忽现——一个 12 公顷的水塘,在这一版里可能因为源图没画而缺席,在下一版里因为换了源图而出现。这种「出现」不是新建,是补画。

§5 怎么拿到:四个包与三条路

5.1 四个包的体积账

包 内容 官方标注
HydroLAKES_polys_v10.gdb.zip 全部湖面多边形与属性 763 MB
HydroLAKES_polys_v10_shp.zip 同上,shapefile 820 MB
HydroLAKES_points_v10.gdb.zip 全部出水口点与属性 81 MB
HydroLAKES_points_v10_shp.zip 同上,shapefile 79 MB

解压后,点图层的 dbf 是 376 MB,shp 是 40 MB,shx 是 11 MB,加上一个 219 字节的 .prj。多边形图层解压后更大,因为几何复杂——边界的坐标对数量比点多了几个数量级。

只想要属性、不需要几何的人,下 79 MB 那个包就够:dbf 里有全部 21 列,其中已经包含出水口的经纬度两列,可以在任何能读一百多万行的表格软件里打开。

5.2 不用注册、不用申请

四个包都是直链,点开就下。没有登录墙,没有申请表,没有使用协议弹窗,没有任何速率限制的迹象。

这在全球水文数据里是罕见的。同领域的不少产品要么要求填表说明用途,要么把下载放在需要机构账号的门户后面。HydroSHEDS 体系选择了最开放的一种:CC-BY 4.0,署个名就能用,商用也可以。

许可页面还附了一句请求:请不要把数据以原始格式整体转发到其他网站上,除非得到作者书面许可。这句话不构成许可限制——CC-BY 4.0 本身允许再分发——它是作者的请求,不是条款。判断时可以这样区分:转载整套原始压缩包,最好先问一句;把数据用在产品里、发表结果、做二次加工,许可明确允许。

5.3 geodatabase 与 shapefile 的取舍

两种格式装的是同一份东西,选哪个取决于工具链。

geodatabase 需要 ArcGIS 或兼容的驱动才能打开,好处是字段名不被截断、编码不乱、没有 2 GB 的单文件上限。它还会自动加三个字段:OBJECTID、Shape_Length、Shape_Area。

这三个字段是坑。它们由软件按图层坐标系的单位计算,而图层的坐标系是经纬度。所以 Shape_Area 的单位是「平方度」,Shape_Length 的单位是「度」,数值没有任何物理意义。看到 Shape_Area 写着 0.03 就以为湖是 0.03 平方公里,会错得很远——真实的面积在 Lake_area 列里。

shapefile 由一个主文件加五个伴生文件组成:.shp 存几何,.shx 存索引,.dbf 存属性,.prj 存投影,.sbn 与 .sbx 存空间索引。开源工具链对它的支持最好。它的毛病是字段名最长 10 个字符、字符串编码经常要手动指定、单文件不能超过 2 GB——这份数据刚好没撞上上限。

5.4 没有 GIS 也能读

技术文档专门提示了一条路:出水口的 dbf 是 dBASE IV 格式,可以直接用能读 142 万行的电子表格或数据库程序打开,然后用 Pour_long 与 Pour_lat 两列把点画出来。

这条路对只做统计分析的人很实用:不需要装 GDAL,不需要处理几何,拿到表就能跑。代价是没有多边形,一切基于面积的计算只能用 Lake_area 列。

5.5 读进 Python

import geopandas as gpd

pts = gpd.read_file("HydroLAKES_points_v10_shp/HydroLAKES_points_v10.shp")
print(len(pts), pts.crs)
print(pts[["Hylak_id", "Lake_name", "Lake_area", "Vol_total", "Depth_avg"]].head())

读进来第一件事是确认行数与坐标参考。行数应当是 1,427,688;crs 应当是 EPSG:4326。

第二件事是换算单位、复算深度,看三列能不能对上:

import geopandas as gpd

p = gpd.read_file("HydroLAKES_points_v10_shp/HydroLAKES_points_v10.shp")
p["vol_km3"] = p["Vol_total"] / 1000.0
p["vol_m3"] = p["vol_km3"] * 1e9
p["area_m2"] = p["Lake_area"] * 1e6
p["depth_recalc"] = p["vol_m3"] / p["area_m2"]
diff = (p["depth_recalc"] - p["Depth_avg"]).abs()
print(diff.max(), (diff > 0.15).sum())

这段跑完会看到绝大多数记录的复算深度与原列只差舍入误差,因为 Depth_avg 本来就是这么算出来的。少数差值大的,通常是舍入或单位录入的个例,值得单独看一眼。

第三件事是按来源分层,别把三种体积混在一起统计:

import geopandas as gpd

p = gpd.read_file("HydroLAKES_points_v10_shp/HydroLAKES_points_v10.shp")
p["vol_km3"] = p["Vol_total"] / 1000.0
for src, g in p.groupby("Vol_src"):
    print(src, len(g), round(g["vol_km3"].sum(), 1))

按 Vol_src 分组求和,得到的三个数加起来应当接近官方给的 181,900 立方公里。如果差得远,多半是单位没换。

5.6 投影与 .prj

坐标系是地理坐标,WGS84 基准,ESRI 里叫 GCS_WGS_1984。.prj 文件只有 219 字节,内容就是一行地理坐标系定义。

没有投影意味着三件事:面积要读列不能从几何算;缓冲区、距离、邻接这些运算必须先转成等积或等距投影;跨 180 度经线的多边形会在平面上裂开,做全球镶嵌时要特别处理。

5.7 与 HydroATLAS 的关系

官方产品页有一句容易被略过的话:HydroATLAS 完整包含了 HydroLAKES 的全部湖泊,并在其上增补了大量水文环境特征。

这句话的实际含义是:HydroLAKES 是一个子集,不是另一个平行产品。HydroATLAS 分三块——BasinATLAS 是子流域面,RiverATLAS 是河段线,LakeATLAS 是湖岸线。三块合起来是 100 万个子流域、850 万条河段、140 万个湖,每块 56 个变量、281 个属性。

所以选型问题变成:只要几何,下 HydroLAKES(763 MB);要几何加几十个环境属性,下 LakeATLAS(1.43 GB geodatabase)。后者才是做湖泊生态、气候响应、人类活动压力这类分析的正确入口。

§6 拓扑:湖、河、流域怎么接

6.1 官方那句话与表里的现实

产品页写着:每个湖都与 HydroRIVERS 的一条河段、HydroBASINS 的一个子流域做了共注册,方式是通过共享 ID。

翻开属性表,21 列里找不到 HYRIV_ID,也找不到 HYBAS_ID。唯一的外键是 Grand_id。

这两件事不矛盾,但需要分清层次。技术文档描述的共注册方式是:把每个湖连到「排干这个湖的最下游河网像元」上,这个像元就是出水口;再从出水口位置提取上游汇流面积与模型流量。这是空间位置上的共注册,靠的是坐标,不是列里的编号。产品页那句「通过共享 ID」描述的是整个 HydroSHEDS 家族的谱系——HydroRIVERS 的每条河段确实带子流域编号,LakeATLAS 的每个湖也确实带流域与河段属性——但在 HydroLAKES 这一层的原始文件里,这两列没有随数据发出。

实践含义很直接:想给湖挂上流域号或河段号,得自己做一次空间相交;或者干脆换 LakeATLAS。

6.2 出水口是怎么选出来的

每个湖只给一个点。选法是:在湖的范围内,找出 HydroSHEDS 汇流累积量最大的那个像元;如果有多个并列,取模型流量最大的;如果还并列,随机选一个。然后把该像元与湖多边形的交集取质心,作为出水口坐标。

交集质心这一步是为了保证点一定落在自己的多边形内部——如果直接取像元中心,点在湖边时可能落到湖外。

这个选法有一个隐含假设:湖只有一个出口。对多数湖泊成立,对分汊湖、多口出流的三角洲湖、以及季节性改变出口的湖不成立。这类湖在表里被强行压成一个点,拓扑上就等于被简化成单出口。

另一个后果是终端湖的处理。内陆盆地的湖没有出口,最下游的像元就在湖心,所以出水口会落在多边形中央。这时 Dis_avg 描述的不是出流,是「流出湖面的那部分水量」,物理含义已经变了。

6.3 用空间相交补编号

给湖挂流域号,标准做法是把出水口点落到子流域多边形里:

import geopandas as gpd

basins = gpd.read_file("hybas_na_lev06_v1c.shp")
pts = gpd.read_file("HydroLAKES_points_v10_shp/HydroLAKES_points_v10.shp").to_crs(basins.crs)
pts = pts[["Hylak_id", "Lake_area", "Pour_long", "Pour_lat", "geometry"]]
joined = gpd.sjoin(pts, basins[["HYBAS_ID", "geometry"]], how="left", predicate="within")
print(joined["HYBAS_ID"].isna().sum())

要注意三点。第一,出水口必须用点,不能用多边形质心——质心可能落在流域之外,尤其是形状不规则的湖。第二,落在边界上的点会同时命中两个子流域,sjoin 会产生重复行,需要去重。第三,within 严格不含边界,换个谓词结果会变,做批量处理时要固定下来。

挂河段号的做法类似,但对象是线:把出水口在河段上做最近邻,取距离最小的那条,同时记下距离——距离大于一个像元(约 500 米)的匹配要人工看一眼,很可能是湖画错了位置,或者河网在这一段有断点。

6.4 一个湖只有一个出口,一条河可以有多个湖

拓扑的方向性值得说清:湖到河是多对一(多个湖可以汇入同一条河段),湖到流域是一对一(一个湖的出水口只落在一个子流域里,边界情况除外)。

这个结构决定了上游下游关系的算法。要判断两个湖是否在同一条水系上,不能靠属性 join,要靠流量与流域面积的大小关系,加上河网连通性。

6.5 三条产品线的分工

HydroLAKES 是水面,HydroRIVERS 是河线,HydroBASINS 是流域面。三者的口径不同,混用时必须对齐。

HydroRIVERS 收录的门槛是集水面积不小于 10 平方公里,或平均流量不小于 0.1 立方米每秒,两者满足其一即入。结果 850 万条河段,平均长 4.2 公里,总长 3,590 万公里。

HydroBASINS 是子流域面,按 Pfafstetter 编码分层,从大洲级一路细分到十几级。

对准的方式只有一个:空间。湖的出水口落在哪条河段上、哪个子流域里,就是它在这两套体系里的位置。三套数据的编号互不相通,任何「按 ID 直接 join」的想法都会失败。

6.6 一个常被忽略的错配

湖多边形的边界来自影像与水系图,河网的边界来自 15 弧秒(约 500 米)的栅格水文推导。两者的几何精度不在一个量级:湖岸线可能是 30 米像元级的,河网是 500 米像元级的。

后果是:一个窄长的水库,在河网里可能只对应一条穿过它的单线,出水口落在湖的一侧,而实际出流在另一侧。做水量平衡时这点误差会被放大,因为流量是在那个错位的像元上取的。

793 条记录的出水口落在陆表掩膜之外,多半就是这类错配的结果:湖多边形画到了河网认为不是水体的地方,取值失败,只好记 -9999。

§7 阅读本节前:三种评价错位

7.0 先摆正评价框架

用之前要先确认一件事:你手里的标准,是不是这份数据承诺过的东西。三件事最常被批评,而它们恰好是设计上就放弃了的。

7.1 错位一:拿测深数据验证体积

拿几十个有测深资料的湖,比对 Vol_total,算相对误差,然后宣布模型不行——这个流程本身有问题。

问题在抽样。有测深资料的湖是被选中的湖:城市水源地、通航湖泊、富营养化治理对象、深水湖。这些湖在成因上与无测深的湖不同,深度分布也不同。用它们做验证集,等于用一群特例去评价一个面向全体外推的模型。

更根本的问题是:对一个从来没有被量过深度的湖,你没有任何办法知道它错多少。这不是数据的缺陷,是问题的性质。全球绝大多数湖泊没有测深记录,任何全球湖深产品都只能是外推,区别只在外推的方法与透明度。

合理的验证设计是分规模、分区域做,并且明确区分「总量误差」与「个体误差」。前者可以做,后者在没有真值的地方做不了。

§1.5 的案例提供了另一种可操作的检验:不看绝对值,看内部一致性。面积、体积、深度三列必须互相自洽,不自洽的记录一定有问题;自洽的记录仍可能错,但至少错在输入而不是算式。

7.2 错位二:拿今天的水面质疑 2000 年的多边形

「这个湖现在比数据里小了一半」——这句话成立,但它不是错误,是时间差。

主体区域的岸线对应 2000 年 2 月。二十多年里,咸海萎缩、乌尔米耶湖退缩、乍得湖反复涨落、大量水库新建。这些变化都不在这份数据里。

判断某个湖的边界是否过时,要看的不是年份,是这个水体有没有发生过显著的面积变化。封闭盆地的盐湖、干旱区的尾闾湖、大城市边缘的调蓄水库,这三类最可能过时;构造湖、高山冰蚀湖、深水大湖,边界基本稳定。

7.3 错位三:拿湖泊数当「世界有多少湖」

142 万这个数常被引用成「全球湖泊总数」。它不是。它是「10 公顷以上、被这八套源数据画出来、通过人工剔除、并且落在某个特定制图年份」的水体数。

换门槛就换量级:把门槛降到 1 公顷,数量会上一个数量级;把门槛提到 100 公顷,会掉到几万个。

换定义也换结果:湿地算不算湖、季节性水体算不算湖、水库算不算湖,三个问题的答案都会改变计数。这份数据的选择是:水库算,湿地不算,季节性水体按源数据的分类走,不额外判断。

7.4 DAIMS 简表

维度 情况 说明
来源可溯 强 八个源数据逐一点名,附引用
方法透明 强 回归模型、训练与验证规模、文献来源都写明
版本可辨 中 只有 version 1,但文档封面写 1.0、许可章节写 1.a、文件名写 v10
更新节奏 弱 2016 年后无新版,事实冻结
不确定度 弱 无逐条误差,只在文档里做定性提示
空间完整度 中 全球陆地,但比例尺从 1:2.4 万到 1:100 万不等
时间信息 无 单快照,无时间维
许可清晰度 强 CC-BY 4.0,产品页与技术文档双处写明
访问稳定性 强 直链静态文件,十年未变
文档完备度 强 十六页技术文档随包分发,字段逐列解释

§8 常见误读与避坑清单

常见说法 实际情况 证据
「体积单位是立方公里」 是百万立方米,1 百万立方米等于 0.001 立方公里,读错放大约一千倍 技术文档表 2 的 Vol_total 字段说明
「贝加尔湖体积 2361.5 万立方公里」 除以一千得 23,615 立方公里,与面积乘深度对得上 同一行 Lake_area 与 Depth_avg 复算
「平均深度是测出来的」 是体积除以面积,派生量;体积本身 99.5% 由回归外推 Depth_avg 字段定义;Vol_src 计数
「Lake_type 里有盐湖」 只有湖、水库、受调控湖三档,盐湖一律标 1 技术文档表 2 与全表计数
「Lake_type 等于 1 就是天然湖」 默认值兜住了所有未识别的小型人工水库 技术文档对默认值的说明
「水库有 6,796 个」 6,796 是挂上 GRanD 编号的记录数;类型标为水库的是 6,687 条 Grand_id 与 Lake_type 分别计数
「有名字的湖能按名字查」 只有 3,022 条有名字,规则是 500 平方公里以上、GRanD 有名水库、GLWD 有名小湖 Lake_name 非空计数与字段说明
「Hylak_id 按面积排序」 前十八号是人工编排,7 号安大略湖面积小于 8 号休伦湖 两条记录的 Lake_area
「Shape_Area 就是湖泊面积」 那是软件按经纬度算的平方度,物理上无意义,真实值在 Lake_area 技术文档对 gdb 附加字段的说明
「湖和河段能按 ID 直接 join」 属性表里没有 HYRIV_ID 与 HYBAS_ID,只能按出水口做空间相交 点图层 dbf 的 21 个字段清单
「这是一个湖泊时间序列」 单快照,无时间维,主体区域对应 2000 年 2 月 技术文档关于 SWBD 采集时点的说明
「140 万个湖就是全球湖泊总数」 是 10 公顷以上、被八套源数据画出、经过人工剔除的水体数 门槛与源数据表
「岸线长度可以直接比跨国差异」 加拿大与阿拉斯加约 1:10 万,北俄罗斯约 1:100 万,比例尺差异会进岸线 技术文档第 2.2 节比例尺段落
「停留时间 -1 说明湖很浅」 -1 表示流量为 0、算不出来;-9999 表示出水口不在陆表掩膜内 Res_time 字段的取值说明
「出水口一定在湖边」 终端湖的出水口落在湖心;算法取的是汇流累积量最大像元与多边形的交集质心 技术文档第 2.2 节共注册段落
「这是一份湖泊监测产品」 它是矢量底图,不含任何观测序列 全表 21 列无时间字段

表里最贵的一条是第一条。它不只是一个单位错,它会连锁:体积错一千倍,深度错一千倍,停留时间错一千倍,然后再被写进模型、写进论文、写进政策文件,一路上没有人会回头检查那一列的单位注释。

第二贵的是关于 ID 的那条。很多人先在 HydroRIVERS 里筛出目标河段,再想「按编号把湖 join 上来」,写了几行代码之后才发现两边的编号体系根本不通用。§1.5 的案例里,那一步本来是想按河段找湖,最后改成按出水口做空间相交,代码量从三行变成了三十行——但结果是可用的。

还有一类误读不在表里,因为它不涉及事实,涉及期望:把这份数据当成「湖泊的权威名录」。它不是名录,它是某个团队在某个时段,用某几套源数据,按某个门槛画出来的一张图。名录要的是穷尽与准确,图要的是可用与一致,两者是不同的东西。

§9 它在本库里的位置

9.1 与土壤、气象三条线的分工

SoilGrids 给的是地表以下的介质,ERA5 给的是大气状态,GHCNd 给的是站点观测,HydroLAKES 给的是地表水体的几何。

四者的时间性质完全不同:ERA5 逐小时、GHCNd 逐日、SoilGrids 无时间维但是一版预测、HydroLAKES 无时间维且是一版快照。做流域模型时,前两者是驱动,后两者是参数与几何。混用最多的错误是把 HydroLAKES 也当成可以逐年更新的变量。

一个具体的接法:用 HydroLAKES 的湖泊面积与流域面积做汇流单元,用 ERA5 的降水与蒸散做驱动,用 SoilGrids 的质地与容重做下渗参数,最后用 GHCNd 的站点径流或水位做校验。这条链上,只有 HydroLAKES 那一环是「一次画好、永不再变」的。

9.2 与遥感两条线的关系

Landsat 提供的是像元级的观测序列,可以用来提取水面范围随时间的变化;HydroLAKES 提供的是矢量的静态边界。两者结合的标准做法是:用 HydroLAKES 的多边形做感兴趣区,在 Landsat 序列里统计水体像元比例,得到每个湖的水面面积时间序列。

OISST 给的是海表温度,看起来无关,但做湖温研究时常被拿来当对照——淡水湖的夏季表层温度变化幅度通常大于同纬度海面,这个差异本身就是一个信号。HydroLAKES 提供湖的位置与面积,OISST 提供邻近海面的基准。

9.3 与物种、浮标、地图数据的连接

GBIF 的物种出现记录带经纬度,落到湖多边形里就能分出「水域记录」与「陆域记录」——这一步在多边形数据缺失时很难做准,因为缓冲区半径是拍的。有湖岸线之后,判断变成一次空间包含运算。

Argo 浮标是海洋的,看似无关;但它的剖面数据常被用作湖泊模型的边界条件参照,尤其是深水湖的热结构模拟。

Overture Maps 提供的是道路、建筑、土地利用的矢量底图。把湖多边形与建成区叠起来,就能算出湖岸带的城市压力——这是湖泊富营养化研究里最常用的一个代理变量。

9.4 检索路径

要找「全球尺度的水体几何」,本库里目前只有这一条。要找「地表覆盖分类基准」,去 EuroSAT;要找「逐日地表温度或海温」,去 OISST;要找「逐年影像」,去 Landsat。

湖泊这个方向在库内是空白,HydroLAKES 是第一块砖。后续可以补的方向有三个:HydroATLAS 的 LakeATLAS(同一批湖,加几十个环境属性)、HydroRIVERS(河段线,做上下游拓扑必需)、GRanD(坝与库容的原始表)。

§10 为什么它能持续,以及 AI 使用声明

10.1 生存逻辑

这份数据活了十年,靠的不是精度,是三件事。

第一是可引用。它有一篇发在 Nature Communications 的方法论文,有 DOI,有明确的作者与机构,方法写得足够复现。它在学术引用体系里是一个合法节点,这让它成为「全球湖泊」这个题目下绕不开的默认引用。

第二是可下载。四个静态压缩包,直链,无注册,十年没变过地址。这种稳定性在学术数据里比精度更稀缺——一个每年换一次门户、每两年改一次接口的产品,用起来的隐性成本远高于它的精度收益。

第三是可组合。它与同一家族的河网、流域产品共享同一套出水口逻辑,与 GRanD 共享一个外键,与 HydroATLAS 是包含关系。一个湖可以被放进河网、放进流域、放进水库清单,而不需要重新数字化。

10.2 撑不住的地方

没有第二版。2016 年之后没有整版更新,没有勘误表,没有 changelog。这意味着所有已知问题都是永久性的:乍得湖那 0.1 米、卡拉博加兹戈尔湾那 101 米、密歇根与休伦的拆分约定,都不会被修正。

没有误差列。逐条记录没有不确定度,只有文档里一句定性的提示。这让下游无法做加权,也无法做敏感性分析——只能整体接受或整体怀疑。

比例尺不均。同一份数据里,不同大洲的有效分辨率差四倍,跨国比较的任何几何指标都掺着这个差异。

这三条里,第一条最要紧。一份冻结的数据在方法上并不过时——地形没变,湖盆没变——但在状态上会越来越旧。用它做 2026 年的水面统计,必须自己补上这二十六年的变化。

10.3 用它的三条纪律

第一,先分层再统计。按 Vol_src 分组,把推算值与报告值分开算,别混在一起求平均。混算的结果既不是观测统计,也不是模型统计,是一个没有名字的东西。

第二,别信单条记录的深度。要单个湖的深度,去查测深资料;要一批湖的总量,用这份数据可以,但要接受几条离谱记录带来的偏差,必要时按分位数截尾。

第三,把出水口当接口,不当事实。它是河网上的一次采样位置,不是水文站。用它挂流域、挂河段都可以,用它做流量分析要先看 Dis_avg 是不是 -9999。

10.4 AI 使用声明

本文的文本由 AI 辅助撰写,事实核验基于 HydroLAKES 官方产品页、随包分发的十六页技术文档、以及实际下载的出水口点图层属性表。文中所有字段名、字段类型、类别计数、极值、示例记录的具体数值,均来自 dbf 文件的直接解析;总量与来源说明来自技术文档;许可与下载体积来自官方产品页。未下载多边形图层,未做几何运算,未对湖深模型做独立复算。

附录 A 属性速查

列名 类型 含义 单位 陷阱
Hylak_id 整数 湖泊唯一标识 无 是行号,不按面积排序
Lake_name 文本 40 湖名 无 仅千分之二有值;同名不同湖
Country 文本 35 所在国 无 跨国湖归到出水口所在国
Continent 文本 15 所在洲 无 六档,澳洲与太平洋岛屿合为 Oceania
Poly_src 文本 10 多边形来源 无 八种取值,决定了几何精度
Lake_type 整数 水体类型 无 只有 1/2/3,无盐湖
Grand_id 整数 GRanD 水库编号 无 0 表示无对应;唯一可用外键
Lake_area 小数 13,2 多边形面积 平方公里 二维小数,0.10 处有阈值堆积
Shore_len 小数 13,2 岸线长度 公里 受制图比例尺影响
Shore_dev 小数 7,2 岸线发育度 无量纲 与面积圆周长比;分辨率越高越大
Vol_total 小数 13,2 总体积 百万立方米 不是立方公里,差一千倍
Vol_res 小数 13,2 水库库容 百万立方米 0 表示无库容
Vol_src 整数 体积来源 无 1 文献湖、2 报告库容、3 模型
Depth_avg 小数 7,1 平均水深 米 等于体积除面积,派生量
Dis_avg 小数 13,3 出水平均流量 立方米每秒 -9999 表示出水口不在陆表掩膜
Res_time 小数 13,1 停留时间 天 -1 表示流量为零;小于 0.1 被抬高
Elevation 整数 湖面高程 米 北纬 60 度以上换过 DEM
Slope_100 小数 7,2 湖外百米缓冲带坡度 度 面积 500 平方公里以上为 -1
Wshd_area 小数 13,1 流域面积 平方公里 -9999 表示出水口不在掩膜
Pour_long 小数 13,6 出水口经度 十进制度 保证落在多边形内部
Pour_lat 小数 13,6 出水口纬度 十进制度 终端湖落在湖心

附录 B 术语表

术语 含义
SWBD SRTM 水体数据,随航天飞机雷达地形任务生成的水体掩膜,覆盖 56°S 至 60°N
CanVec 加拿大自然资源部的国家水系矢量库,1:5 万,本数据六成多边形出自此处
岸线发育度 岸线长度与同面积圆周长的比值,正圆为 1
出水口(pour point) 湖的排水出口,取湖内汇流累积量最大像元与多边形的交集质心
汇流累积量 一个像元上游的像元总数,用作流域面积的代理
终端湖 没有地表出口的湖,位于内流盆地最低处,出水口落在湖心
归一化停留时间 体积除以出流量,反映水体更新一次所需时间
Vol_src 体积来源标记,区分文献值、库容报告值与模型推算值
GRanD 全球水库与坝数据库,提供库容、坝高、建成年代等工程属性
HydroSHEDS 基于航天飞机雷达地形数据的全球水文派生体系,本数据的母体
HydroRIVERS 同体系的河段矢量产品,850 万条河段,门槛为集水面积 10 平方公里或流量 0.1 立方米每秒
HydroBASINS 同体系的子流域面产品,按 Pfafstetter 编码分层
LakeATLAS HydroATLAS 的湖泊分册,包含本数据全部湖泊并增补环境属性
溶解(dissolve) 把空间上相邻、属性相同的多个多边形合并成一个的运算
哨兵值 用特定数字表示缺失或无效,本数据用 -1 与 -9999
Pfafstetter 编码 一种按水系拓扑给流域编号的规则,支流编号为偶数、干流为奇数

附录 C 常见误读 FAQ

问:我能用它算一个湖的蓄水量变化吗?

不能,除非你自己补第二个时相。这份数据只有一版岸线,体积是同一版属性的推算值,没有时间维。

问:为什么有些大湖的深度看起来完全不合理?

因为面积与体积来自不同来源、不同年份。§1.5 的案例是典型:多边形按丰水期画,体积按枯水期报,商出来就是 0.1 米。

问:能不能只要水库?

可以,筛 Lake_type 等于 2 的那一类。但要清楚这是下界——大量小型人工水库被默认标成了湖。

问:能不能按湖名匹配别的数据集?

很难。只有三千个湖有名字,而且同名极多。稳妥的做法是按坐标做空间匹配。

问:出水口落在湖心是什么意思?

说明这是一个终端湖,没有地表出口。这时 Dis_avg 描述的不是出流,解读时要当心。

问:为什么不提供投影版本?

原始发布就是经纬度。需要投影的话自己转,选什么投影取决于研究区纬度与用途,官方没有替使用者做这个决定。

问:这份数据还会更新吗?

截至核验时官方只发布 version 1,2016 年 12 月,之后无新版。是否会有第二版,官方页面没有给出计划。

问:能不能用它训练语义分割模型?

可以拿它做水体掩膜的真值,但要注意三件事:它比影像晚,边界可能过时;它是矢量不是栅格,栅格化时分辨率选择会改变标签;它只覆盖 10 公顷以上的水体,小水塘全是负样本。

编辑说明

核验时间 2026-10-29。方法:打开 HydroSHEDS 官方 HydroLAKES 产品页与 HydroATLAS、HydroRIVERS 两个同族产品页,逐句核对总量、门槛、许可与引用;下载技术文档 PDF 并通读十六页,逐列核对属性表定义;下载出水口点图层的 shapefile 压缩包,解析 dbf 头部得到 21 个字段的名称、类型、长度与小数位,并对 1,427,688 条记录做全量扫描,统计类别计数、外键覆盖、极值与哨兵值分布,抽取里海、贝加尔湖、乍得湖、大咸海、乌尔米耶湖、卡拉博加兹戈尔湾等记录作为示例。

与常见转述不一致处已在正文逐条更正,主要有四处:体积列的单位是百万立方米而非立方公里;Lake_type 只有三档、不含盐湖;属性表里没有流域号与河段号,官方所说的共注册是空间位置的共注册,在 LakeATLAS 里才以共享 ID 的形式落到列上;技术文档给出的大水库库容并入数 6,797 与属性表里 Vol_src 取 2 的 6,723 条相差 74 条,正文只记录差额,不推断去向。

未下载多边形图层(820 MB),因此未核验面要素的几何质量、拓扑错误与环数;未做任何几何运算与面积复算;未对湖深回归模型做独立验证。


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • hydrobasins — 共享标签:公共卫生与流行病学 / 全球健康 / 调查数据
  • dhs-program — 共享标签:公共卫生与流行病学 / 全球健康 / 调查数据
  • ghdx — 共享标签:公共卫生与流行病学 / 全球健康 / 调查数据
  • world-health-survey — 共享标签:公共卫生与流行病学 / 全球健康 / 调查数据
  • gho-steps — 共享标签:公共卫生与流行病学 / 全球健康 / 调查数据
  • global-burden-of-disease — 共享标签:公共卫生与流行病学 / 全球健康
  • wuenic-immunization — 共享标签:公共卫生与流行病学 / 全球健康 / 调查数据
  • share — 共享标签:公共卫生与流行病学 / 全球健康 / 调查数据
  • sage-survey — 共享标签:公共卫生与流行病学 / 全球健康 / 调查数据
  • lasi — 共享标签:公共卫生与流行病学 / 全球健康 / 调查数据

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集