news 2026/9/15 9:01:45

Earth Engine Studio绘制维也纳夏季无云影像:哨兵2数据筛选与 NDVI 计算实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Earth Engine Studio绘制维也纳夏季无云影像:哨兵2数据筛选与 NDVI 计算实战

用 Earth Engine 绘制维也纳夏季无云影像:哨兵2数据筛选与 NDVI 计算实战

本文带你一步步解析一段 Earth Engine 代码,从指定区域、筛选影像、去云、计算植被指数到可视化,最终获取维也纳上空 2024 年夏季最晴朗的哨兵2合成影像。


一、为什么要写这段代码?

遥感数据处理往往面临两个痛点:数据量大(哨兵2每天全球产生数 TB 数据)和云层遮挡(光学影像受天气影响严重)。Google Earth Engine(GEE)提供了云端并行计算能力,让我们能在浏览器中快速完成大规模影像的筛选、预处理和分析。

今天我们要实现的目的是:

  • 锁定维也纳(经纬度 16.3738°E, 48.2082°N)周边区域;
  • 获取 2024 年 6 月 1 日至 9 月 1 日期间所有哨兵2 Level-2A 地表反射率影像;
  • 剔除云量超过 20% 的影像;
  • 为每景影像计算NDVI(归一化植被指数),并附上标签;
  • 按云量从低到高排序,最终合成一张“最清晰”的 mosaic 影像;
  • 在交互地图上展示真彩色合成,并打印出一些关键元数据。

二、代码分步拆解

1. 定义研究区域

varvienna=ee.Geometry.Point([16.3738,48.2082]);

我们创建一个点几何对象,代表维也纳市中心。这个点将作为空间筛选的基准。

2. 加载哨兵2影像集合

varsentinel2=ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED").filterBounds(vienna).filterDate("2024-06-01","2024-09-01").filter(ee.Filter.lt("CLOUDY_PIXEL_PERCENTAGE",20))
  • 使用官方提供的COPERNICUS/S2_SR_HARMONIZED数据集,该数据集已进行辐射定标和大气校正,且将 Sentinel-2A 与 2B 的波段进行了统一(“HARMONIZED”)。
  • 空间筛选:只保留覆盖维也纳点的影像。
  • 时间筛选:限定 2024 年夏季(北半球植被生长旺季)。
  • 云量筛选:CLOUDY_PIXEL_PERCENTAGE是每景影像自带的元数据字段,这里要求小于 20%,避免云层干扰后续分析。

3. 计算 NDVI 并添加为波段

.map(function(image){varndvi=image.normalizedDifference(["B8","B4"]).rename("NDVI");returnimage.addBands(ndvi).set("summary","summer clear-sky candidate");})
  • 对集合中的每一景影像,使用normalizedDifference方法计算 (B8 - B4) / (B8 + B4),即 NDVI。其中 B8 为近红外波段(NIR),B4 为红波段。
  • 将新生成的 NDVI 波段添加到原影像中,并设置一个自定义属性summary,方便后续识别这批影像的来源。

4. 排序并合成

.sort("CLOUDY_PIXEL_PERCENTAGE");varfirstClearImage=sentinel2.mosaic();
  • 按照云量百分比升序排列(云量越少越靠前)。
  • 调用mosaic()将集合中的所有影像合成一张。由于云量已排序,mosaic 会按照集合顺序叠加,最后显示在最上层的是云量最少的像素(但实际 mosaic 的规则是后加入的覆盖先加入的,所以排序后,低云影像会覆盖高云影像,从而得到整体最清晰的合成图)。这里严格来说,mosaic 并不一定是“第一张清晰影像”,而是所有影像的镶嵌结果,但结合排序,效果相当于优先使用低云像素。

5. 地图可视化

Map.addLayer(firstClearImage.select(["B4","B3","B2"]),{bands:["B4","B3","B2"],min:0,max:3000},"Sentinel-2 true color",true,0.7);
  • 选择红(B4)、绿(B3)、蓝(B2)三个波段,合成真彩色影像。
  • 拉伸范围设为 0~3000(对应地表反射率缩放因子,原始值为整数,一般乘以 0.0001 得到反射率,但这里直接显示)。
  • 图层透明度设为 0.7,方便与底图叠加观察。

6. 打印调试信息

print("Loaded collection","COPERNICUS/S2_SR_HARMONIZED");print("Filtered image count",sentinel2.size());print("Scene ids",sentinel2.limit(4).aggregate_array("system:index"));print("Cloud percentages",sentinel2.limit(4).aggregate_array("CLOUDY_PIXEL_PERCENTAGE"));print("First clear image",firstClearImage);print("Selected bands from first 3",sentinel2.limit(3).select(["B4","B8","NDVI"]));
  • 输出集合总数、前 4 景的影像 ID 及其云量、最终合成的影像对象、以及前 3 景的 B4/B8/NDVI 波段信息,方便调试和验证。

三、运行结果展示

在 GEE 编辑器(code.earthengine.google.com)中执行上述代码后,我们会看到:

  • 地图中心显示维也纳及周边区域的真彩色合成影像,色彩自然,无明显云层遮挡。
  • Console 输出
    • 影像总数:例如 12 景(具体数量取决于实际过境次数)。
    • 前几景的 ID 和云量百分比,可以看到云量最低的可能只有 2.3%。
    • 合成影像对象包含所有波段,包括我们添加的 NDVI。
    • 前 3 景的 B4、B8 和 NDVI 数值数组。

四、代码改进与思考

  • 云掩膜处理:虽然我们过滤了整体云量 < 20% 的影像,但每景内部仍有局部云。更严谨的做法是使用QA60波段生成云掩膜,并替换为无云像素,但代码中未做,适合快速预览。
  • 时序合成:如果希望得到整个夏季的“中值合成”或“最大值合成”(如 NDVI 最大值),可以改用median()max()替代mosaic(),这样能更好地消除残留云的影响。
  • 缩放因子:显示真彩色时,官方建议乘以 0.0001 转化为反射率(0~1),但代码直接用了 0~3000 的拉伸,这在实际显示中也能获得不错的效果,但数值意义需注意。
  • 元数据打印print语句在 GEE 中会触发计算,如果集合很大,建议先用limit()限制数量。

五、总结

通过这段简洁的 GEE 代码,我们完成了从数据获取、预处理、指数计算到可视化的一整套遥感分析流程。无需下载任何数据,仅需几行代码即可获得维也纳夏季高质量无云影像,并附带植被指数信息。这体现了 GEE 在大地理空间数据处理中的巨大优势。

如果你也对遥感数据处理感兴趣,不妨在 GEE 平台上修改坐标、时间或筛选条件,探索你所在城市或研究区域的影像变化。下一步,我们可以尝试时间序列分析、土地覆盖分类或变化检测,敬请期待!


附:完整代码(可直接复制到 GEE 编辑器运行)

// Earth Engine image collection example with a map layer.varvienna=ee.Geometry.Point([16.3738,48.2082]);varsentinel2=ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED").filterBounds(vienna).filterDate("2024-06-01","2024-09-01").filter(ee.Filter.lt("CLOUDY_PIXEL_PERCENTAGE",20)).map(function(image){varndvi=image.normalizedDifference(["B8","B4"]).rename("NDVI");returnimage.addBands(ndvi).set("summary","summer clear-sky candidate");}).sort("CLOUDY_PIXEL_PERCENTAGE");varfirstClearImage=sentinel2.mosaic();Map.addLayer(firstClearImage.select(["B4","B3","B2"]),{bands:["B4","B3","B2"],min:0,max:3000},"Sentinel-2 true color",true,0.7);print("Loaded collection","COPERNICUS/S2_SR_HARMONIZED");print("Filtered image count",sentinel2.size());print("Scene ids",sentinel2.limit(4).aggregate_array("system:index"));print("Cloud percentages",sentinel2.limit(4).aggregate_array("CLOUDY_PIXEL_PERCENTAGE"));print("First clear image",firstClearImage);print("Selected bands from first 3",sentinel2.limit(3).select(["B4","B8","NDVI"]));

如果你有任何问题或希望看到更多 EE studio案例,欢迎在评论区留言交流!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 9:00:45

Unity资源管理生存指南:AssetBundle、Addressables与YooAsset实战选型

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/15 8:58:21

豆包+SiteNative:构建本地智能代理的实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/15 8:57:29

青岛离婚律师选择指南:从判断框架到品牌价值的实用方法论

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/15 8:50:46

ABAP S4HANA 7.4 新语法总结

1.READ SELECT *FROM ekknINTO TABLE DATA(lt_ekkn)UP TO 100 ROWS.DATA lv_aufnr TYPE ekkn-aufnr.READ TABLE lt_ekkn INTO DATA(ls_ekkn) WITH KEY aufnr lv_aufnr. IF sy-subrc 0.ENDIF.* 新语法 " 其中 OPTIONAL 是防止 lv_aufnr 读不到值抛异常 DATA(ls_…

作者头像 李华
网站建设 2026/9/15 8:47:59

微信小程序创建多页面与导航

在app.json中新增加5个页面{"pages": ["pages/index/index","pages/aerospace/aerospace","pages/moon/moon","pages/satellite/satellite","pages/station/station","pages/deepspace/deepspace"],&qu…

作者头像 李华
网站建设 2026/9/15 8:47:15

COMSOL仿真扭转光子晶体:从莫尔超晶格到平带能带计算

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华