【GEE学习】小范围研究区筛选无云影像

问题描述:

常用的sentinel-2筛选少云影像通常使用Filter

.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))

和QA波段去云。

function rmCloudByQA(image) { 
  var qa = image.select('QA60'); 
  var cloudBitMask = 1 << 10; 
  var cirrusBitMask = 1 << 11; 
  var mask = qa.bitwiseAnd(cloudBitMask).eq(0) 
               .and(qa.bitwiseAnd(cirrusBitMask).eq(0)); 
  return image.updateMask(mask); 
} 

但是对于小范围研究区来说,这样的筛选会导致“影像云量多而研究区云量少”、“影像云量少但集中在研究区”等情况,造成时序影像利用效率不高。

思路:

本文拟筛选出研究区内无云影像,但GEE代码水平不高,思路如下:
1、利用qa波段将影像的云掩膜为0值;
2、对研究区内影像进行统计,利用Reducer.allNonZero()检索是否有0值;
3、添加一个属性,有云时值为0,无云时值为1;
4、Filter筛选出该值为1的影像。

代码

function rmCloudByQA(image) {
  var qa = image.select('QA60');

  var cloudBitMask = 1 << 10;
  var cirrusBitMask = 1 << 11;
 
  var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
              .and(qa.bitwiseAnd(cirrusBitMask).eq(0));
  
image = image.updateMask(mask).unmask(0)
  
  var min = image.select("B1")
  .reduceRegion({
  	reducer: ee.Reducer.allNonZero(),
  	geometry:roi,
  	scale: 10,
  	maxPixels: 1e13})
  .get("B1");
  
  return image.set({'cloud_musk':min});
}
var S2Collection = ee.ImageCollection('COPERNICUS/S2')
                  .filterDate(start_date, end_date)
                  .filterBounds(table)
                  .map(rmCloudByQA)
                  .filter(ee.Filter.eq('cloud_musk', 1))

函数说明:

GEE:遥感影像处理中的常见掩膜函数的使用
Google Earth Engine(gee)中的reduce、Reducer
GEE学习:遥感影像设置新的属性并查询

### 使用 Google Earth Engine API 下载无 Landsat 8 图像 以下是通过 Python 调用 Google Earth Engine (GEE) 的方法来下载去除了层影响的 Landsat 8 地表反射率图像的示例代码: #### 安装依赖库 在运行以下代码之前,请确保已安装 `earthengine-api` 库。可以通过 pip 进行安装: ```bash pip install earthengine-api ``` #### 初始化 GEE 初始化 GEE 需要先完成身份验证并启动服务。 ```python import ee # 初始化 Earth Engine ee.Initialize() ``` #### 示例代码:下载无 Landsat 8 图像 下面是一个完整的脚本,展示了如何利用 `.map()` 函数批量处理多张 Landsat 8 图像以移除受污染的部分,并最终导出为 GeoTIFF 文件[^2]。 ```python # 导入必要的模块 import ee # 初始化 Earth Engine ee.Authenticate() # 如果尚未认证,则需要手动登录 ee.Initialize() # 定义研究域(AOI) aoi = ee.Geometry.Rectangle([-106.5, 43.7, -105.9, 44.2]) # 示例坐标范围 # 加载 Landsat 8 表面反射率集合 l8sr = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2') # 设置时间过滤器 filtered_collection = l8sr.filterDate('2022-01-01', '2022-12-31') \ .filterBounds(aoi) # 创建一个函数用于去除掩膜 def maskClouds(image): qa_pixel = image.select('QA_PIXEL') # 提取 QA 像素中的位掩码 cloud_bitmask = 1 << 3 cirrus_bitmask = 1 << 2 # 构建掩模条件 mask = qa_pixel.bitwiseAnd(cloud_bitmask).eq(0) \ .And(qa_pixel.bitwiseAnd(cirrus_bitmask).eq(0)) return image.updateMask(mask) # 对整个影像集应用掩膜函数 cloud_free_images = filtered_collection.map(maskClouds) # 将第一个可用的无图像转换为单个 Image 并裁剪到 AOI first_image = cloud_free_images.first().clip(aoi) # 获取波段列表 bands_of_interest = ['SR_B4', 'SR_B3', 'SR_B2'] # 波段顺序对应 RGB 显示 # 导出图像至 Google Drive 或本地文件夹 task = ee.batch.Export.image.toDrive( image=first_image.select(bands_of_interest), description='Landsat8_CloudFree_Export', folder='gee_exports', region=aoi, scale=30, # 分辨率为 30 米 crs='EPSG:4326' ) # 启动导出任务 task.start() print(f'Export task started with ID {task.id}') ``` 上述代码实现了以下几个功能: 1. **加载数据源**:选择了 Landsat 8 Collection 2 Level 2 数据产品。 2. **定义地理边界**:指定了感兴趣(AOI),即目标地理位置。 3. **筛选日期范围内的影像**:限定了分析的时间窗口。 4. **创建自定义函数**:编写了一个名为 `maskClouds` 的函数,该函数基于质量评估 (`QA_PIXEL`) 层提取干净像素。 5. **映射操作**:使用 `.map()` 方法将此函数应用于所有符合条件的影像集合。 6. **导出结果**:选取了其中一张代表性的无影像,并将其保存为 GeoTIFF 格式的文件。 #### 注意事项 - 上述代码假设用户已经配置好 Google Cloud Storage 或 Google Drive 来存储输出文件。 - 可能需要调整参数如分辨率 (`scale`) 和投影系统 (`crs`) 以满足具体需求。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值