Google Earth Engine(GEE)提取水体

今天分享一下如何用MNDWI水体指数来提取研究区的水体,主要使用的数据为landsat8

GEE代码如下:


var roi =   ee.Geometry.Polygon(
        [[[118.78042247007194, 32.632228406133],
          [118.78042247007194, 30.819493246253046],
          [120.90078379819694, 30.819493246253046],
          [120.90078379819694, 32.632228406133]]], null, false);
Map.centerObject(roi,7)
var styling = {color:"red",fillColor:"00000000"};

// reomove cloud for Landsat-8
function rmL8Cloud(image) { 
  var cloudShadowBitMask = (1 << 3); 
  var cloudsBitMask = (1 << 5); 
  var qa = image.select('pixel_qa'); 
  var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0) 
                 .and(qa.bitwiseAnd(cloudsBitMask).eq(0));
  var mask2 = image.select('B1').gt(2000);
  return image.updateMask(mask).updateMask(mask2.not())
              .copyProperties(image)
              .copyProperties(image, ["system:time_start",'system:time_end']);
} 
var l8_sr = ee.ImageCollection("LANDSAT/LC08/C01/T1_SR").map(rmL8Cloud)
            .filter(ee.Filter.lte('CLOUD_COVER',5))//云量过滤;
//MNDWI水体指数
function calcWater(image) {
  var MNDWI = image.select("MNDWI");
  var NDVI = image.select("NDVI");
  var EVI = image.select("EVI");
  var water = EVI.lt(0.1)
                 .and(MNDWI.gt(NDVI)
                 .or(MNDWI.gt(EVI)));
  return image.addBands(water.rename("water"));
}
var Landsat8 = {
  scaleImage: function(image) {
    var time_start = image.get("system:time_start");
    image = image.select(["B2","B3","B4","B5","B6","B7"]);
    image = image.divide(10000);
    image = image.set("system:time_start", time_start);
    return image;
  },
  srCloudMask: function(image) {
    var cloudShadowBitMask = (1 << 3);
    var snowBitMask = (1 << 4);
    var cloudsBitMask = (1 << 5);
    var qa = image.select('pixel_qa');
    var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
                 .and(qa.bitwiseAnd(snowBitMask).eq(0))
                 .and(qa.bitwiseAnd(cloudsBitMask).eq(0));
    return image.updateMask(mask);
  },
  //NDVI
  NDVI: function(image) {
      return image.addBands(image.normalizedDifference(["B5", "B4"])
                                 .rename("NDVI"));
  },
  //MNDWI
  MNDWI: function(image) {
      return image.addBands(image.normalizedDifference(["B3", "B6"])
                                 .rename("MNDWI"));
  },
  // EVI
  EVI: function(image) {
    var evi = image.expression("EVI = 2.5 * (NIR - R) / (NIR + 6*R -7.5*B + 1)", {
      NIR: image.select("B5"),
      R: image.select("B4"),
      B: image.select("B2")
    });
    return image.addBands(evi);
  },

  /*获取Landsat8的SR数据*/
  getL8SRCollection : function(startDate, endDate, roi) {
    var dataset = l8_sr.filterDate(startDate, endDate)
                      .filterBounds(roi)
                      .map(Landsat8.srCloudMask)
                      .map(Landsat8.scaleImage)
                      .map(Landsat8.NDVI)
                      .map(Landsat8.MNDWI)
                      .map(Landsat8.EVI)
                      .map(calcWater)
                      .select("water");
    return dataset;
  }
};

//export
function exportImageToDrive(image, key, roi) {
  Export.image.toDrive({
    image: image, 
    description: "Water"+key,
    fileNamePrefix: key, 
    region: roi,
    scale: 30,
    maxPixels: 1e13
  });
}

//去掉阴影
function removeShadow(image, roi) {
  var hand = ee.ImageCollection('users/gena/global-hand/hand-100');
  var hand30 = hand.mosaic().focal_mean(0.1).rename('elevation');
  var hillShadowMask = hand30.select('elevation').lte(50);
  var waterMask = image.updateMask(hillShadowMask.and(image.gte(0.8)))
                       .gte(0.25)
                       .clip(roi);
  waterMask = waterMask.connectedPixelCount(50, true);
  waterMask = waterMask.updateMask(waterMask.gte(50));
  return image.updateMask(waterMask);
}
//生成每一年的水体 
function processYearWaterImage(year, roi) {
  var startDate = ee.Date.fromYMD(year, 1, 1);
  var endDate = ee.Date.fromYMD(year+1, 1, 1);

  var l8Water = Landsat8.getL8SRCollection(startDate, endDate, roi);
  var waterImgs = l8Water
  
  /*计算水体的频率*/
  var waterImg = waterImgs.sum()
                          .divide(waterImgs.count())
                          .clip(roi);

waterImg = waterImg.updateMask(waterImg).clip(roi);
  var key = "landsatWater-"+year;
  Map.addLayer(waterImg, {min:0,max:1,palette:['000000','blue']}, "water"+key, true);
  exportImageToDrive(waterImg, key, roi);
  print('waterImgs_'+year,waterImgs);
    var stats2 = waterImg.reduceRegion({
      reducer: ee.Reducer.sum(),
      geometry: roi,
      scale: 30,
      maxPixels: 1e13
    });
  print(stats2,year)

}

//循环导出所有的水体
function main() {
  //开始年份和结束年份
  var startYear = 2014;
  var endYear = 2021;
  for (var year=startYear; year<=endYear; year++) {
    processYearWaterImage(year, roi);
  }
}

提取结果展示:
2014年
2015年
2016年
2017年
2018年
感谢关注,欢迎转发!

声明:仅供学习使用!如果对你有帮助的话记得给小编点个赞

**更多内容请关注微信公众号“生态遥感监测笔记”

Google Earth Engine (GEE) 中提取水体并将其导出为地图,你可以按照以下步骤操作: 1. **安装GEE客户端库**:首先确保你已经安装了Google Earth Engine Python API,可以通过命令行安装 `pip install earthengine-api`。 2. **加载遥感数据**:查找包含水体信息的卫星影像,比如 Landsat、Sentinel 或者 MODIS 数据。可以使用GEE的数据集搜索功能找到合适的源数据。 ```python import ee ee.Authenticate() # 如果尚未登录,需要授权 ee.Initialize() # 示例:获取Landsat 8的Surface Reflectance数据 image = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR') waterBody = image.filterDate('2019-01-01', '2019-12-31') \ .select(['B4', 'B3', 'B2']) \ .water() ``` 3. **处理和分析数据**:利用GEE提供的水体检测算法(如`image.water()`),识别图像中的水体区域。 4. **可视化和裁剪**:创建一个可视化的图层,并选择感兴趣的区域进行裁剪。例如,你可以设定兴趣点或者绘制一个几何形状来提取特定区域的水体。 ```python visParams = {'bands': ['B4', 'B3', 'B2'], 'min': 0, 'max': 0.3} clippedWater = waterBody.clip(ee.Geometry.Polygon([[lon1, lat1], [lon2, lat2]])) # 替换为实际坐标 map = ee.Image(clippedWater.visualize(**visParams)).getThumbUrl({'region': clippedWater.geometry}) ``` 5. **下载地图**:将裁剪后的水体结果导出为地理TIFF或其他格式的地图文件。这通常需要在GEE的Web界面中完成,因为GEE API目前不支持直接下载大分辨率的图像。 ```python task = ee.batch.Export.image.toDrive( image=clippedWater, description='waterbody_map', scale=30, # 设置分辨率 region=clippedWater.geometry.coordinates[0], folder='my_folder', fileFormat='GeoTIFF' ) task.start() # 启动任务 ``` 6. **监控和等待完成**:在任务完成后,可以在GEE的任务历史记录或Drive中找到已下载的地图文件。
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生态遥感监测笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值