
1. 为什么你需要掌握GEE土地利用数据调用第一次接触Google Earth EngineGEE时我被它海量的地理空间数据震撼到了。特别是当发现全球主流土地利用数据集都能在这里直接调用时简直像找到了宝藏。你可能也有过这样的经历为了做区域生态评估花几周时间下载各种土地利用数据还要处理格式转换、坐标系统一、数据拼接这些繁琐工作。但在GEE里这些烦恼都不存在了。GEE最厉害的地方在于它把全球主流土地利用数据集都预存好了包括CGLS-LC100、GLC_FCS30D、CLCD这些高精度长时序数据。你只需要几行代码就能调用不用下载到本地直接在云端处理。我去年做中国城市扩张研究时用传统方法处理5年的30米分辨率数据要两天在GEE上只用了20分钟。这些数据集各有特点CGLS-LC100虽然分辨率是100米但分类效果出奇地好GLC_FCS30D从1985年到现在30米分辨率全球覆盖堪称土地利用研究的百科全书CLCD专注中国区域更新频率高特别适合国内研究。掌握它们的调用方法能让你在研究时事半功倍。2. 环境准备与GEE基础操作2.1 快速入门GEE开发环境刚开始用GEE时我建议直接使用网页版的代码编辑器https://code.earthengine.google.com/。不需要安装任何软件注册账号就能用。这里有个小技巧用谷歌账号登录后记得在Apps里点击Save保存你的脚本这样下次登录还能继续编辑。代码编辑器主要分四个区域左上角是脚本管理可以创建文件夹分类存放代码中间是代码编辑区右边是地图显示下方是输出控制台。我习惯先在地图上用绘图工具框出研究区域这样后面调试代码时能立即看到效果。// 绘制研究区域示例 var roi ee.Geometry.Rectangle([116.3, 39.8, 116.7, 40.2]); // 北京区域 Map.centerObject(roi, 10); // 地图居中显示缩放级别10 Map.addLayer(roi, {color: red}, Study Area); // 添加红色边框2.2 必须掌握的GEE JavaScript语法GEE用的是JavaScript语言但和网页开发用的JS有些区别。最重要的一点是GEE的操作都是延迟执行的。什么意思呢看下面这个例子var image ee.Image(COPERNICUS/Landcover/100m/Proba-V-C3/Global/2019); print(image); // 这里不会立即显示图像内容你需要调用print()或者Map.addLayer()这些方法才会真正触发计算。这点刚开始很容易搞错我当初就纳闷为什么变量明明赋值了却看不到结果。另一个重要概念是ImageCollection可以理解为同一类图像的集合。比如要分析多年的土地利用变化就需要处理ImageCollectionvar collection ee.ImageCollection(COPERNICUS/Landcover/100m/Proba-V-C3/Global); print(Collection size:, collection.size()); // 查看包含多少影像3. 六大主流数据集调用实战3.1 CGLS-LC100欧洲航天局的精品CGLS-LC100由哥白尼计划发布时间跨度为2015-2019年。虽然分辨率是100米但它的分类精度经过严格验证特别适合大尺度生态研究。我做过对比实验在省级尺度上它的分类效果甚至比某些30米数据还要好。调用代码非常简单var year 2019; var dataset ee.Image(COPERNICUS/Landcover/100m/Proba-V-C3/Global/year) .select(discrete_classification); var visParams { min: 0, max: 100, palette: [#282828,#FFBB22,#FFFF4C,#F096FF,#FA0000,#B4B4B4, #F0F0F0,#0032C8,#0096A0,#FAE6A0,#58481F] }; Map.addLayer(dataset, visParams, CGLS-LC100 year);这个数据集有20个分类类别从城市建筑到各类植被都有。需要注意的是它的投影是WGS84做面积计算时要考虑投影变形的影响。3.2 GLC_FCS30D30米全球长时序标杆这是2024年刚发布的新数据集时间跨度从1985年至今分辨率30米包含36个精细分类。第一次用这个数据集时我被它的分类细节震惊了——连红树林和盐沼都能区分开。调用代码稍微复杂些因为要处理多波段数据var annual ee.ImageCollection(projects/sat-io/open-datasets/GLC-FCS30D/annual); var image annual.mosaic(); // 定义分类颜色 var palette [ #ffff64,#ffff00,#aaf0f0,#4c7300,#006400, #a8c800,#00a000,#005000,#003c00,#286400, #285000,#a0b432,#788200,#966400,#964b00, #966400,#ffb432,#ffdcd2,#ffebaf,#ffd278, #ffebaf,#00a884,#73ffdf,#9ebb3b,#828282, #f57ab6,#66cdab,#444f89,#c31400,#fff5d7, #dcdcdc,#fff5d7,#0046c8,#ffffff ]; // 可视化最新年份 Map.addLayer(image.select(b23), {min:1, max:36, palette: palette}, 2023 Land Cover);这个数据集特别适合做长时间序列分析比如森林退化监测。我建议先用mosaic()方法合成完整影像再按需选择年份波段。3.3 CLCD中国区域研究首选武汉大学发布的CLCD数据集专注中国区域从1985年开始每年更新30米分辨率。我在做长三角城市扩张研究时发现它的建成区分类比其他全球数据集更准确。调用方式如下var year 2020; var imgCLCD ee.Image(projects/lulc-datase/assets/LULC_HuangXin/CLCD_v01_year) .updateMask(imgCLCD.gt(0)); var palette [ #FAE39C, // 耕地 #446F33, // 森林 #33A02C, // 灌木 #ABD37B, // 草地 #1E69B4, // 水体 #A6CEE3, // 冰雪 #CFBDA3, // 裸地 #E24290, // 不透水面 #289BE8 // 湿地 ]; Map.addLayer(imgCLCD, {min:1, max:9, palette: palette}, CLCD year);这个数据集有个特点每年1月左右会更新前一年的数据。做研究时要注意版本号最新的是v01。4. 高级应用技巧与常见问题4.1 多数据集对比分析方法在实际研究中我经常需要比较不同数据集的结果。比如评估某个区域的森林覆盖率不同数据集可能给出不同结果。这时可以这样对比// 加载三个数据集 var cgls ee.Image(COPERNICUS/Landcover/100m/Proba-V-C3/Global/2019) .select(discrete_classification); var glc ee.ImageCollection(projects/sat-io/open-datasets/GLC-FCS30D/annual) .filterDate(2019-01-01,2020-01-01).mosaic(); var clcd ee.Image(projects/lulc-datase/assets/LULC_HuangXin/CLCD_v01_2019); // 定义森林类别(各数据集分类代码不同) var cglsForest cgls.eq(111).or(cgls.eq(112)); // 常绿林 var glcForest glc.gte(51).and(glc.lte(62)); // 所有森林类型 var clcdForest clcd.eq(2); // CLCD的森林 // 计算研究区域内森林面积比例 var areaStats function(image, roi) { var area image.multiply(ee.Image.pixelArea()).reduceRegion({ reducer: ee.Reducer.sum(), geometry: roi, scale: 100, maxPixels: 1e13 }); return area.getNumber(classification); }; var roi ee.Geometry.Rectangle([115,39,117,41]); // 京津冀区域 var totalArea roi.area().divide(1e6); // 平方公里 print(CGLS森林面积(%), areaStats(cglsForest, roi).divide(totalArea).multiply(100)); print(GLC森林面积(%), areaStats(glcForest, roi).divide(totalArea).multiply(100)); print(CLCD森林面积(%), areaStats(clcdForest, roi).divide(totalArea).multiply(100));这种对比能帮助理解不同数据集的特性。比如CGLS可能低估破碎化森林而CLCD对中国区域的分类更细致。4.2 时间序列变化检测长时序数据最大的价值就是分析变化。这是我常用的变化检测方法// 加载2000和2020年数据 var glc2000 ee.ImageCollection(projects/sat-io/open-datasets/GLC-FCS30D/annual) .filterDate(2000-01-01,2001-01-01).mosaic(); var glc2020 ee.ImageCollection(projects/sat-io/open-datasets/GLC-FCS30D/annual) .filterDate(2020-01-01,2021-01-01).mosaic(); // 定义城市和森林类别 var urban2000 glc2000.eq(200).or(glc2000.eq(201)).or(glc2000.eq(202)); var urban2020 glc2020.eq(200).or(glc2020.eq(201)).or(glc2020.eq(202)); var forest2000 glc2000.gte(51).and(glc2000.lte(62)); var forest2020 glc2020.gte(51).and(glc2020.lte(62)); // 计算森林转城市的变化 var forestToUrban forest2000.and(urban2020); // 可视化 Map.addLayer(forestToUrban.selfMask(), {palette: [red]}, Forest to Urban);这个方法可以直观显示20年间哪些森林区域变成了城市。我建议先用mosaic()合成年度数据再比较两个时相的变化。4.3 导出数据到本地虽然GEE能在云端处理但有时还是需要导出数据。比如要用ArcGIS做进一步分析时// 导出2020年CLCD数据 Export.image.toDrive({ image: ee.Image(projects/lulc-datase/assets/LULC_HuangXin/CLCD_v01_2020), description: CLCD_2020_Export, folder: GEE_Exports, region: roi, scale: 30, maxPixels: 1e13 });这里有几个注意事项导出任务会在后台运行完成后会收到邮件通知scale参数要设置正确30米数据就设30大区域导出可能失败建议分块处理导出格式默认为GeoTIFF可以用fileFormat参数修改我第一次导出时没设置maxPixels结果任务失败了。后来才知道默认上限是1e8像素对大区域要调高这个值。5. 实际研究案例城市扩张对绿地影响分析去年我用这些数据做了个有趣的研究分析过去20年北京城市扩张对绿地的影响。分享一下关键步骤首先加载2000年和2020年的GLC_FCS30D数据var beijing ee.FeatureCollection(users/yourname/beijing_boundary); // 加载北京边界 var glc2000 ee.ImageCollection(projects/sat-io/open-datasets/GLC-FCS30D/annual) .filterDate(2000-01-01,2001-01-01).mosaic().clip(beijing); var glc2020 ee.ImageCollection(projects/sat-io/open-datasets/GLC-FCS30D/annual) .filterDate(2020-01-01,2021-01-01).mosaic().clip(beijing);然后定义绿地和建成区类别// 绿地包括森林、灌木、草地 var green2000 glc2000.gte(51).and(glc2000.lte(72)); var green2020 glc2020.gte(51).and(glc2020.lte(72)); // 建成区 var urban2000 glc2000.eq(200).or(glc2000.eq(201)).or(glc2000.eq(202)); var urban2020 glc2020.eq(200).or(glc2020.eq(201)).or(glc2020.eq(202));计算面积变化// 计算各类面积(平方公里) var areaCalc function(image, roi) { var area image.multiply(ee.Image.pixelArea()).reduceRegion({ reducer: ee.Reducer.sum(), geometry: roi, scale: 30, maxPixels: 1e13 }); return area.getNumber(classification).divide(1e6); // 转为平方公里 }; var greenArea2000 areaCalc(green2000, beijing); var greenArea2020 areaCalc(green2020, beijing); var urbanArea2000 areaCalc(urban2000, beijing); var urbanArea2020 areaCalc(urban2020, beijing); print(2000年绿地面积(km²), greenArea2000); print(2020年绿地面积(km²), greenArea2020); print(2000年建成区面积(km²), urbanArea2000); print(2020年建成区面积(km²), urbanArea2020);最后分析绿地流失区域// 找出2000年是绿地但2020年变成建成区的区域 var greenLoss green2000.and(urban2020); // 可视化 Map.addLayer(greenLoss.selfMask(), {palette: [red]}, Green Space Loss);这个分析清晰地显示出北京五环外大量绿地转变为城市用地的过程。用同样的方法还可以分析不同年份间的变化速率或者结合夜间灯光数据做更深入的研究。