对海水养殖中的浮筏养殖、网箱养殖及滩涂养殖进行提取,回答最好能注明代码的主要功能,谢谢!
直接上代码:!!!!
// 导入需要的影像数据和矢量数据
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中,提取海水养殖区通常涉及以下步骤:
以下是一个简单的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值相结合,提取出海水养殖区。最后,我们将结果显示在地图上。
由于不同地区和数据集的特征可能有所不同,您需要根据实际情况调整阈值和参数。此外,本示例仅用于演示目的,实际应用中可能需要进一步改进和优化。
该回答引用ChatGPTjavascript
var dataset = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA')
.filterDate('2014-06-01', '2014-12-31');
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);
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');