Google earth engine 海水养殖区提取

对海水养殖中的浮筏养殖、网箱养殖及滩涂养殖进行提取,回答最好能注明代码的主要功能,谢谢!

直接上代码:!!!!

// 导入需要的影像数据和矢量数据
var s2 = ee.ImageCollection('COPERNICUS/S2_SR');
var water = ee.FeatureCollection('users/username/water_bodies');
var rafts = ee.FeatureCollection('users/username/rafts');
var cages = ee.FeatureCollection('users/username/cages');
var flats = ee.FeatureCollection('users/username/flats');
// 选择时间范围和地理区域
var start = ee.Date('2019-01-01');
var end = ee.Date('2020-01-01');
var region = ee.Geometry.Rectangle([xmin, ymin, xmax, ymax]);
// 过滤影像和矢量数据
var filtered_s2 = s2.filterDate(start, end).filterBounds(region);
var filtered_water = water.filterBounds(region);
var filtered_rafts = rafts.filterBounds(region);
var filtered_cages = cages.filterBounds(region);
var filtered_flats = flats.filterBounds(region);
// 计算NDWI指数
var ndwi = function(image) {
  var green = image.select('B3');
  var nir = image.select('B8');
  var ndwi = green.subtract(nir).divide(green.add(nir));
  return image.addBands(ndwi.rename('NDWI'));
};
var ndwi_s2 = filtered_s2.map(ndwi);
// 在影像上应用膨胀操作,以增加养殖区域的像素数量
var dilated_water = filtered_water.map(function(feature) {
  return feature.buffer(100);
});
var dilated_rafts = filtered_rafts.map(function(feature) {
  return feature.buffer(100);
});
var dilated_cages = filtered_cages.map(function(feature) {
  return feature.buffer(100);
});
var dilated_flats = filtered_flats.map(function(feature) {
  return feature.buffer(100);
// 根据NDWI指数和矢量数据提取海水养殖区
var extract_water = function(image) {
  var water_mask = image.select('NDWI').gt(0.1);
  var water_zone = water_mask.reduceConnectedComponents().clip(region);
  return water_zone;
};
var water_zone = ndwi_s2.map(extract_water).mosaic();
var raft_zone = water_zone.mask(water_zone.intersects(dilated_rafts)).clip(region);
var cage_zone = water_zone.mask(water_zone.intersects(dilated_cages)).clip(region);
var flat_zone = water_zone.mask(water_zone.intersects(dilated_flats)).clip(region);
// 将结果可视化
Map.centerObject(region, 10);
Map.addLayer(water_zone, {palette: 'blue'}, 'Water Zone');
Map.addLayer(raft_zone, {palette: 'yellow'}, 'Raft Zone');
Map.addLayer(cage_zone, {palette: 'red'}, 'Cage Zone');
Map.addLayer(flat_zone, {palette: 'green'}, 'Flat Zone');


// 设置区域
var region = ee.Geometry.Rectangle([119.3, 28.8, 122.5, 31.5]);

// 加载Landsat 8影像
var image = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA')
    .filterDate('2019-01-01', '2019-12-31')
    .filterBounds(region)
    .median();

// 添加NDWI指数图层
var ndwi = image.normalizedDifference(['B3', 'B5']);
Map.addLayer(ndwi, {min:-1, max:1, palette:['white', 'blue']}, 'NDWI');

// 使用阈值分割提取养殖区
var threshold = 0.2;
var waterMask = ndwi.gt(threshold);
Map.addLayer(waterMask, {}, 'Water Mask');

// 使用形态学运算去除噪声
var kernel = ee.Kernel.circle(30, 'meters');
var waterMask2 = waterMask.focal_max({kernel: kernel}).focal_min({kernel: kernel});
Map.addLayer(waterMask2, {}, 'Water Mask 2');

// 使用矢量化将提取的养殖区转换为矢量数据
var vectors = waterMask2.addBands(ndwi).reduceToVectors({
  geometry: region,
  crs: image.projection(),
  scale: 30,
  geometryType: 'polygon',
  eightConnected: true,
  labelProperty: 'zone',
  reducer: ee.Reducer.mean()
});

// 显示提取的养殖区
Map.addLayer(vectors, {color: 'red'}, 'Aquaculture Zones');

可以借鉴下


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);
  }
}



以下答案基于GPT4:
在Google Earth Engine中,提取海水养殖区通常涉及以下步骤:

  1. 加载遥感影像数据。
  2. 对影像进行预处理,如大气校正、裁剪等。
  3. 使用不同的指数或算法,如归一化水体指数(NDWI)、归一化植被指数(NDVI)等,以区分海水养殖区和其他地表覆盖类型。
  4. 设定阈值以提取感兴趣区域。

以下是一个简单的Google Earth Engine脚本示例,用于提取海水养殖区。请注意,您可能需要根据实际需求和影像数据集调整参数和阈值。

// 导入影像数据集(以Landsat 8为例)
var imageCollection = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
    .filterDate('2020-01-01', '2020-12-31') // 设置时间范围
    .filterBounds(ee.Geometry.Point([121.0, 38.0])) // 设置空间范围
    .sort('CLOUD_COVER') // 按云量排序
    .first(); // 选择云量最小的影像

// 归一化水体指数(NDWI)
var ndwi = imageCollection.normalizedDifference(['B3', 'B5']);

// 设置NDWI阈值
var ndwiThreshold = 0.2;
var waterMask = ndwi.gt(ndwiThreshold);

// 归一化植被指数(NDVI)
var ndvi = imageCollection.normalizedDifference(['B5', 'B4']);

// 设置NDVI阈值
var ndviThreshold = 0.2;
var vegetationMask = ndvi.gt(ndviThreshold);

// 提取养殖区
var aquacultureMask = waterMask.and(vegetationMask.not());

// 可视化结果
Map.addLayer(imageCollection, {bands: ['B4', 'B3', 'B2'], min: 0, max: 3000}, 'Landsat 8');
Map.addLayer(aquacultureMask, {palette: 'blue'}, 'Aquaculture');
Map.setCenter(121.0, 38.0, 10);

在这个示例中,我们首先加载了Landsat 8遥感影像数据,并按云量进行筛选。接着,我们计算了NDWI和NDVI,分别用于区分水体和植被。然后,我们设置了适当的阈值,通过将高NDWI值与低NDVI值相结合,提取出海水养殖区。最后,我们将结果显示在地图上。

由于不同地区和数据集的特征可能有所不同,您需要根据实际情况调整阈值和参数。此外,本示例仅用于演示目的,实际应用中可能需要进一步改进和优化。

该回答引用ChatGPT
Google Earth Engine可以便捷地提取海水养殖区域。以下是大致的步骤和对应代码:

1. 获取完整的遥感影像数据,比如Landsat影像数据。

javascript
var dataset = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA')
.filterDate('2014-06-01', '2014-12-31');


2. 使用图像分类算法(比如随机森林)对影像进行分类,将海水养殖区分为不同的类别。以下是示例代码:

javascript
//选择训练数据并添加属性
var training_u = urban.sample({
region: roi,
scale: 30,
numPixels: 5000
});
training_u = training_u.map(function(f) {
return f.set('class', 1);
});
var training_w = water.sample({
region: roi,
scale: 30,
numPixels: 5000
});
training_w = training_w.map(function(f) {
return f.set('class', 2);
});

//训练数据合并
var training = training_u.merge(training_w);

//指定属性
var bands = ['B2', 'B3', 'B4', 'B5'];
var input = dataset.select(bands);

//指定分类器并分类
var classifier = ee.Classifier.randomForest(10)
.train(training, 'class', bands);
var classified = input.classify(classifier);


3. 提取不同的养殖类型区域并显示。以下是示例代码:

javascript
//浮筏养殖区
var floatRegion = classified.eq(1);
Map.addLayer(floatRegion, {palette: 'blue'}, 'floatRegion');

//网箱养殖区
var netRegion = classified.eq(2);
Map.addLayer(netRegion, {palette: 'green'}, 'netRegion');

//滩涂养殖区
var beachRegion = classified.eq(3);
Map.addLayer(beachRegion, {palette: 'red'}, 'beachRegion');


代码的主要功能是获取Landsat影像数据进行分类,将养殖区域分为不同的类别,并提取出浮筏养殖、网箱养殖和滩涂养殖区域。需要注意的是,这只是一个简单示例,实际应用还需要针对具体的数据进行调整。