基于 GEE 利用 SDWI 指数进行逐月水域面积提取

目录

1 SDWI指数

2 完整代码

3 运行结果



微波遥感具有全天候、全天时工作能力,能穿透云层,不受气象条件和光照水平影响,因此近年来利用微波遥感提取水体信息也备受关注。本文分享使用 Sentinel-1遥感影像通过SDWI指数来进行逐月水域面积计算提取和结果导出。

1 SDWI指数

Sentinel-1双极化数据SDWI水体提取指数公式:SDWI = ln ⁡(10×VV×VH)

Sentinel-1 Dual-Polarized Water Index (SDWI)水体信息提取方法对 Sentinel-1 双极化数据(VV 和 VH)之间水体信息提取的关系进行深入研究,达到增强水体特征的效果,水体区分较明显,同时消除土壤和植被对水体提取中造成的干扰。公式的指导思想是将 VV 和 VH 极化影像相乘,并且乘以 10,以此扩大水体与其他地物之间的差异,再以自然对数作为函数式。

2 完整代码

// 引入感兴趣区(ROI)并添加到地图
var roi = table;
Map.addLayer(roi);
Map.centerObject(roi, 8);

// 设置时间范围和生成每月的日期范围
var startYear = 2021;
var endYear = 2023;
var months = ee.List.sequence(1, 12);

// 使用Sentinel - 1数据集
var s1Collection = ee.ImageCollection('COPERNICUS/S1_GRD')
  .filterBounds(roi)
  .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))
  .filter(ee.Filter.eq('instrumentMode', 'IW'));

// 定义 SDWI 计算函数
var calculateSDWI = function(image) {
  var VV = image.select('VV');
  var VH = image.select('VH');
  return image.expression(
    'log(10 * VV * VH) - 8',
    { 'VV': VV, 'VH': VH }
  ).rename('SDWI');
};

// 计算逐月水体掩膜面积
var calculateMonthlyWaterArea = function(year, month) {
  // 获取该月的开始和结束日期
  var startDate = ee.Date.fromYMD(year, month, 1);
  var endDate = startDate.advance(1, 'month');

  // 过滤 Sentinel - 1 图像集以获取当月的图像
  var monthlyCollection = s1Collection
    .filterDate(startDate, endDate)
    .map(calculateSDWI);

  // 计算月度水体掩膜
  var sdwiComposite = monthlyCollection.median().clip(roi);
  var waterMask = sdwiComposite.gt(-0.1).rename('WaterMask');

  // 计算水体面积(平方千米)
  var areaImage = waterMask.multiply(ee.Image.pixelArea()).divide(1e6);
  var waterArea = areaImage.reduceRegion({
    reducer: ee.Reducer.sum(),
    geometry: roi,
    scale: 10,
    maxPixels: 1e9
  }).get('WaterMask');

  // 返回一个包含年、月和水体面积的字典
  return ee.Feature(null, {
    'Date': startDate.format('yyyy/M/d'),
    'Year': year,
    'Month': month,
    'WaterArea_km2': waterArea
  });
};

// 对每个月进行水体面积计算并转换为 FeatureCollection
var calculateWaterAreaByMonth = function(year) {
  return ee.FeatureCollection(
    months.map(function(month) {
      return calculateMonthlyWaterArea(year, month);
    })
  );
};

// 将所有年份的水体面积合并到一起
var allYearsWaterArea = ee.FeatureCollection(
  ee.List.sequence(startYear, endYear).map(calculateWaterAreaByMonth)
).flatten();

// 导出逐月水体面积到 CSV 文件
Export.table.toDrive({
  collection: allYearsWaterArea,
  description: 'Monthly_Water_Area_2021_2022',
  fileFormat: 'CSV'
});

// 可视化参数
var visParams = {
  min: 0,
  max: 1,
  palette: ['FFFFFF', '0000FF'] // 蓝色表示水体,白色表示非水体
};

// 将逐月水体掩膜加载到地图上,并导出影像
for (var year = startYear; year <= endYear; year++) {
  for (var month = 1; month <= 12; month++) {
    var startDate = ee.Date.fromYMD(year, month, 1);
    var endDate = startDate.advance(1, 'month');

    var monthlyCollection = s1Collection
      .filterDate(startDate, endDate)
      .map(calculateSDWI);

    var sdwiComposite = monthlyCollection.median().clip(roi);
    var waterMask = sdwiComposite.gt(-0.1).rename('WaterMask');

    // 在地图上显示每个月的水体掩膜
    var label = 'WaterMask_' + year + '_' + month;
    Map.addLayer(waterMask, visParams, label);

    // 导出逐月影像
    Export.image.toDrive({
      image: waterMask,
      description: 'WaterMask_' + year + '_' + month,
      folder: 'GEE/DTH/images',
      fileNamePrefix: 'WaterMask_' + year + '_' + month,
      region: roi,
      scale: 10,
      maxPixels: 1e13
    });
  }
}

3 运行结果

运行结果图层
运行结果
点击RUN即可下载数据
### 使用 Sentinel-1 卫星数据来计算表面水分指数 (SDWI),可以遵循以下过程: #### 准备工作环境 确保安装了必要的 Python 库,如 `geemap` 和 `ee`(Earth Engine API),这些库可以帮助处理和分析遥感数据。 ```bash pip install geemap ``` #### 导入所需模块 加载所需的 Python 模块以便于后续操作。 ```python import ee import geemap ``` #### 初始化 Earth Engine 连接到 Google Earth Engine 平台以访问 Sentinel-1 数据集。 ```python ee.Initialize() ``` #### 获取 Sentinel-1 影像集合,并过滤时间范围和其他条件。 ```python sentinel1 = ee.ImageCollection('COPERNICUS/S1_GRD') \ .filterBounds(ee.Geometry.Point(117.8, 31.9)) \ # 设置目标地理位置 .filterDate('2023-01-01', '2023-01-31') # 设定日期区间 .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV')) .filter(ee.Filter.eq('instrumentMode', 'IW')) # IW模式代表干涉宽幅成像 ``` #### 计算 SDWI 指数 根据 Zhao 等人的研究[^1],SDWI 的定义如下: \[ SDWI = VV_{dB} - VH_{dB} \] 其中 \( VV_{dB} \) 和 \( VH_{dB} \) 分别表示垂直发射/接收极化通道下的背向散射系数转换为分贝单位后的值。这里假设已经获取到了对应的影像对象 img_vv_db 和 img_vh_db。 ```python def calculate_sdwi(image): vv_db = image.select('VV').log10().multiply(10).rename('VV_dB') vh_db = image.select('VH').log10().multiply(10).rename('VH_dB') sdwi = vv_db.subtract(vh_db).rename('SDWI') return image.addBands(sdwi) sdwi_collection = sentinel1.map(calculate_sdwi) ``` #### 可视化结果 最后一步是对得到的结果进行可视化展示,可以通过创建地图实例并将计算好的 SDWI 图层添加进去实现。 ```python Map = geemap.Map(center=[31.9, 117.8], zoom=10) vis_params = { 'min': -25, 'max': 0, 'palette': ['blue','green','yellow'] } first_image = sdwi_collection.first() Map.addLayer(first_image.clip(region), vis_params, "Surface Water Detection Index") Map ``` 通过上述流程,能够有效地利用 Sentinel-1 雷达数据完成对地表水体变化情况的监测与评估。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值