拿到一套覆盖全国、精度到 30 米、分类标准统一的土地利用数据,GlobeLand30 基本是绕不开的名字。它由国内权威机构牵头研制,对外提供 GeoTIFF 格式栅格文件,从 2000 年、2010 年、2020 年三期公开版本,到目前正在陆续更新的 2025 期,都用同一套 10 大类分类体系。对国内做国土空间规划、生态评估、农林监测、双碳研究的团队来说,最常用的形态就是"中国区域提取版":把全球分幅数据按中国边界裁出来,统一成一份干净、可直接入库分析的 TIFF 底图。
这篇文章会把数据本身的来龙去脉讲清楚,重点说中国区域提取时的边界处理、坐标系与像素值细节,再用 GDAL 命令行、Python rasterio、QGIS 三种方式完整走一遍裁剪和面积统计流程。最后把大家问得最多的 TIFF 打开全黑、统计面积偏大、以及最近很多人踩的 HALCON write_image 保存 TIFF 问题一并梳理清楚。无论你是刚入门遥感的学生,还是处理过多年栅格数据的老手,第三节的脚本建议直接存一份,后面每期新数据发布都能复用。
1. GlobeLand30 数据整体认知与设计思路
1.1 这套数据到底什么来头
GlobeLand30 是由国家基础地理信息中心牵头、多家科研单位联合研制的全球地表覆盖数据产品。它最早在 2014 年前后发布了 2000 期和 2010 期,之后 2020 期上线,2025 期也在逐步发布中。数据生产主要基于 Landsat 系列多光谱影像,辅以国产卫星数据,采用自动化分类加上人机交互解译的方式,再用全球各个站点的实测样本做精度验证。公开测评的综合精度大约在 85% 左右,这个数字放在全球同类产品里属于第一梯队。
为什么大家愿意用这套数据?一个很重要的原因是它把"权威性"和"可用性"平衡得比较好。分类体系由官方主导制定,有明确的定义和编码规则,不是某个研究组自己拍脑袋定的;同时产品又完全开放下载,全球范围内都能拿到原始分幅,这对于做跨国对比、长时序分析的项目来说非常友好。国内很多部委的标配底图、高校的课程作业、竞赛的指定数据集,用的都是它。
1.2 为什么 30 米分辨率是个分水岭
接触过遥感产品的人都知道,地表覆盖数据的分辨率从几百米到几米都有。拿几个常见的对比一下:
| 数据源 | 空间分辨率 | 特点 |
|---|---|---|
| MODIS 土地覆盖产品 | 250m / 500m | 覆盖全球、更新快,但城市边界、小地块完全看不出来 |
| Landsat 系列 | 30m | 经典光学影像,GlobeLand30 就是以它为底图生产的 |
| Sentinel-2 | 10m | 更精细,但全球尺度的分类产品还不够成熟 |
| FROM-GLC | 30m | 清华大学发布,分类体系不同,更新节奏不稳定 |
| GlobeLand30 | 30m | 官方体系、三期以上连续、全球统一分类标准 |
30 米这个尺度,恰好能看清一个村庄、一片小型林地、一条较宽的河流,又不会让全国范围的数据量大到没法处理。对省级、国家级的研究来说,30 米是性价比最高的选择。你用 10 米数据做全国分析,存储和计算压力会陡增,但结论未必比 30 米精细多少,毕竟很多区域的自然边界本来就不是光滑曲线。
另外要注意,GlobeLand30 官方标称的 30 米是指实地分辨率,不是严格的投影坐标格网。实际交付的 WGS84 经纬度坐标下,像素尺寸大约是 0.00027 度。这个细节很多人容易忽略,后面算面积时会出事,我在第三节会专门演示处理方式。
1.3 10 大类分类体系的"少而精"逻辑
GlobeLand30 的 10 类分类体系是基于联合国土地覆盖分类体系(LCCS)设计的,每一类都有明确的定义和像素值编码:
| 像素值 | 类别 | 简要说明 |
|---|---|---|
| 10 | 耕地 | 水田、旱地、园地及轮作农田 |
| 20 | 林地 | 乔木覆盖的林地,含落叶林、常绿林、混交林 |
| 30 | 草地 | 草本植物覆盖,含草甸、草原 |
| 40 | 灌木地 | 灌木为主的灌丛 |
| 50 | 湿地 | 沼泽、滩涂、盐沼等水陆过渡区域 |
| 60 | 水体 | 河流、湖泊、水库、海洋等 |
| 70 | 苔原 | 高寒地带的冻原、苔藓地衣植被 |
| 80 | 人造地表 | 城市、乡镇、工矿、道路等人工硬化地表 |
| 90 | 裸地 | 裸土、沙地、戈壁、岩石等 |
| 100 | 冰川和永久积雪 | 常年冰雪覆盖的区域 |
为什么是 10 类而不是像 IGBP 那样 17 类?因为对于绝大多数规划和宏观研究,把耕地、林地、草地这些大类分清楚就足够支撑结论;类别越多,跨区域的一致性越难保证,错分率也会上升。官方做成 10 类,等于帮你做了取舍:保证分类可靠,同时能满足九成以上的应用需求。如果你要更细的二级地类,比如把耕地细分成水田和旱地,那需要结合其他数据继续做,GlobeLand30 只负责把第一层底盘打好。
2. 中国区域提取版:范围、投影与数据规格
2.1 全球分幅与中国区域怎么对应
GlobeLand30 的原始产品按经纬度分幅组织,每幅覆盖 5 度纬度 × 6 度经度,文件名里带着图幅编号,类似 N30E110 这种形式。中国区域大致在东经 70 多度到 135 度、北纬 15 度到 55 度之间,算下来涉及的图幅有几十幅,其中一部分是纯海洋区域。
下载的时候有个经验:如果你只需要中国大陆加沿海岛屿,建议先按经纬度范围筛一遍图幅列表,把 N50E070、N30E110 这类真正落在国境内的图幅选出来,别把几百幅全球数据全下下来。官方网站在线浏览地图里能直接看到每个图幅的覆盖情况,手动点选比盲目全选要高效得多。
2.2 中国区域提取的边界处理要点
拿到原始分幅后,"中国区域提取版"这个动作的核心就是两个字:裁剪。但裁剪用的边界矢量必须讲究,不能随便拿一个 Google 上下载的低精度边框。我的习惯是使用带有审图号的标准行政边界数据,坐标系统一到 WGS84,并且把沿海岛屿都包含进去。如果只用一个大矩形范围去"切",海南岛、舟山群岛这些沿海岛屿很可能被切掉,数据明显不完整。
裁剪之前可以先在 QGIS 里把边界矢量叠加到影像上看一眼,确认边界精度、岛屿层级没问题,再进处理流程。对大部分分析任务来说,这一步做到位,后面统计各类面积才不会被边界问题带偏。
2.3 TIFF 文件内部结构与元数据
GlobeLand30 的 TIFF 是单波段栅格,像素类型一般为无符号整型,像元值就是上表里的 10、20、30 一直到 100,背景和无效区域为 0。它不像普通遥感影像有多个波段,不需要做波段合成,拿到手直接按分类数据使用即可。
每个图幅压缩包内除了主 TIFF 文件,一般还有对应的元数据 XML、快速预览图以及图例样式文件。XML 里记录了投影坐标系、像素尺寸、生产日期、版本号等信息,正式归档前建议保留;图例样式文件可以导入 QGIS、ArcGIS,让显示颜色和官方发布图完全一致。下载后可以先跑一句 gdalinfo 看一下文件头信息,确认坐标系和像素尺寸符合预期,再进入正式处理。
3. 数据获取、中国区域裁剪与转换实操
3.1 官方下载与目录组织
GlobeLand30 的官方发布平台是 globeland30.org,注册后可以按年份、按图幅选择下载。目前 2000、2010、2020 三期完整公开,2025 期部分区域已经上线,具体以官网发布状态为准。
我的建议是把下载好的图幅按年份归档,目录结构类似这样:
GlobeLand30/ ├── shp/ │ └── china_4326.shp ├── tiles_2010/ │ ├── N30E110_LC_2010.tif │ └── ... ├── tiles_2020/ │ └── ... └── output/这样做的好处是后续每期数据都能走同一套脚本,只需要把年份参数换掉。别把所有年份的图幅堆在一个文件夹里,不然到时候 VRT 拼接容易混数据,我见过不止一次同学把 2010 和 2020 的图幅拼到一起,分析半天发现结果不对。
3.2 GDAL 命令行:拼接加国界裁剪一次搞定
GDAL 是处理栅格数据的标准工具集,很多 Python 库底层也是它。命令行方式适合批量操作和脚本化,处理全国数据非常稳。以下是完整流程:
cd tiles_2020 # 第一步:把 2020 年所有分幅拼接成 VRT 虚拟栅格,不实际拷贝数据 gdalbuildvrt -overwrite globeland30_2020.vrt *.tif # 第二步:按国界矢量裁剪,输出带压缩的 GeoTIFF gdalwarp -cutline ../shp/china_4326.shp -crop_to_cutline \ -dstnodata 0 -of GTiff -co COMPRESS=DEFLATE -co TILED=YES \ globeland30_2020.vrt globeland30_2020_china.tif # 第三步:重投影到等积投影,方便后续面积统计 gdalwarp -t_srs "+proj=aea +lat_1=25 +lat_2=47 +lat_0=0 +lon_0=105 +ellps=GRS80 +units=m +no_defs" \ -tr 30 30 -r near -dstnodata 0 -overwrite \ globeland30_2020_china.tif globeland30_2020_china_albers.tif逐个解释一下参数含义。-cutline指定国界矢量,-crop_to_cutline表示严格按矢量边界裁剪,矢量外的像素直接去掉。-dstnodata 0把背景值设为 0,保持和原始分类编码一致。-co COMPRESS=DEFLATE是压缩选项,全国范围的数据不压缩可能几个 GB,压缩后能小一半以上;-co TILED=YES让数据以瓦片方式存储,后续做局部读取时会更快。
第三步的重投影是关键,它把经纬度坐标转成 Albers 等积投影。这一步不是可选项,而是面积统计的前提,原因我后面会展开说。
3.3 Python rasterio 裁剪与面积统计完整代码
如果不想依赖命令行,Python 的 rasterio 可以直接读完并裁剪,程序里还能顺便做统计。以下代码完成国界裁剪并输出新 TIFF:
import geopandas as gpd import rasterio from rasterio.mask import mask # 读取国界矢量,统一到 WGS84 gdf = gpd.read_file("shp/china_4326.shp").to_crs("EPSG:4326") with rasterio.open("tiles_2020/globeland30_2020.vrt") as src: out_img, out_transform = mask(src, gdf.geometry, crop=True, nodata=0) profile = src.profile.copy() profile.update( height=out_img.shape[1], width=out_img.shape[2], transform=out_transform, nodata=0, ) with rasterio.open("output/globeland30_2020_china.tif", "w", **profile) as dst: dst.write(out_img)这段代码先把 VRT 打开,再用边界几何裁剪,crop=True会缩小到边界外接矩形,nodata=0保持背景值一致。写文件时把空间参考、变换信息原样保留,输出后的 TIFF 可以直接在 GIS 软件里打开。
统计面积前,必须先保证栅格在等积投影下。原因很简单:原始 WGS84 经纬度坐标下,一个像素在经度方向的实地宽度会随纬度变化,纬度越高越窄。直接在原投影用 30 乘 30 算面积,在低纬度误差不大,到了黑龙江、新疆,结果会明显偏大,这种错误很容易出现在论文数据里。
投影转换建议直接用命令行:
gdalwarp -t_srs "+proj=aea +lat_1=25 +lat_2=47 +lat_0=0 +lon_0=105 +ellps=GRS80 +units=m +no_defs" \ -tr 30 30 -r near -dstnodata 0 \ output/globeland30_2020_china.tif output/globeland30_2020_china_albers.tif转换完成后,再用以下脚本统计各类面积:
import numpy as np import rasterio name_map = { 10: "耕地", 20: "林地", 30: "草地", 40: "灌木地", 50: "湿地", 60: "水体", 70: "苔原", 80: "人造地表", 90: "裸地", 100: "冰川和永久积雪", } with rasterio.open("output/globeland30_2020_china_albers.tif") as src: data = src.read(1) pixel_area = 30 * 30 # 等积投影下每个像素实地面积,单位:平方米 for cls, count in zip(*np.unique(data, return_counts=True)): if cls == 0: continue area_km2 = count * pixel_area / 1e6 print(f"{cls:>3d} {name_map.get(cls, '未知'):<10s} {area_km2:>12.2f} km²")注意np.unique会统计整幅影像所有像素,背景值 0 必须过滤掉,否则面积会被凭空放大一大截。输出结果可以直接用于报告或再加工成图表。
3.4 QGIS 图形界面五步完成裁剪
不熟悉命令行的朋友,用 QGIS 操作也很快,本质是同样一套逻辑,只是图形界面化。
第一步,把下载的分幅 TIFF 全部拖进 QGIS 图层列表。第二步,依次点击"栅格—杂项—构建虚拟栅格",把当前加载的图幅全部选中,生成 VRT 虚拟拼接,这一步不会生成大文件,速度很快。第三步,加载国界矢量,点击"栅格—提取—按掩膜图层裁剪栅格",输入图层选 VRT,掩膜图层选国界,勾选"裁剪到掩膜范围",点击运行。第四步,在输出图层上右键属性,选择"单波段伪彩色",按官方像素值 10 到 100 设置颜色和标签。第五步,如果要做面积统计,使用"栅格—投影—重投影"工具,目标坐标系选择 Albers 等积投影,像素大小设为 30 米,然后打开属性表就能看到各类别像元数量。
QGIS 的好处是每一步都能直观看到结果,适合第一次处理这类数据时排查边界和颜色问题。但数据一多、需要反复处理时,我还是推荐优先用脚本,毕竟三期加未来 2025 期,同一套流程跑四遍,人工操作很容易出错。
4. TIFF 栅格处理的常见坑与排查实录
4.1 打开全黑、颜色和官方图例对不上
很多人在 QGIS 里第一次打开 GlobeLand30 的 TIFF,看到的是一片黑或者灰蒙蒙的图,第一反应是数据坏了。其实不是,问题出在显示方式上。这类分类栅格是单波段整数,值域只有 0 到 100,GIS 软件默认按灰度拉伸显示,0 附近的背景和 10 的耕地差异很小,肉眼根本分不出来。
解决办法也不是调拉伸,而是把符号化改成"单波段伪彩色",然后手动给每个像素值指定颜色。最省事的做法是直接下载官方发布的 QGIS 样式文件,导入后颜色、分类标签、图例一次性全到位。别自己随便填颜色,不同机构图幅之间颜色不统一,后期制图很麻烦。
4.2 用 30×30 算面积为什么翻车
这个问题我在第三节强调过,但值得再单独说一次。GlobeLand30 交付的 TIFF 是 WGS84 经纬度