GEE第一段程序:沙洲面积提取
打开GEE,先选定一块区域(使用ROI在地图上选定)可以看到此时代码框中出现了Imports (1 entry)
,我们可以对这个变量var geometry
改名,例如这里我们将之改为roi
,执行下边的代码:
Map.centerObject(roi, 13); var Area_roi=roi.area().divide(1000000); print(Area_roi); var bounds= ee.Image().toByte() .paint({ featureCollection: ee.FeatureCollection([ee.Feature(roi)]), color: null, width: 1 }); Map.addLayer(bounds, {palette: "red"}, "bounds"); // 选择遥感影像的时间段(startDate 包含输入时间,endDate 不包含输入时 //间。下图中的遥感影像选择时段实际上是 2018 年 12 月 28 日-2019 年 5 月 26 //日) var startDate = ee.Date("2018-12-28"); var endDate =ee.Date("2019-5-27"); // 引入所有遥感影像源(这些遥感影像已经经过了预处理,可以直接利用) var l5col=ee.ImageCollection("LANDSAT/LT05/C01/T1_SR"); var l7col= ee.ImageCollection("LANDSAT/LE07/C01/T1_SR"); var l4col=ee.ImageCollection("LANDSAT/LT04/C01/T1_SR"); var l8col =ee.ImageCollection("LANDSAT/LC08/C01/T1_SR"); //选择某一遥感影像源,进行影像的区域,云量筛选,并进行去云处理,计算 // MNDWI(即影像二值化). var Col=ee.ImageCollection(l8col) .filterBounds(roi) .filterDate(startDate, endDate) .filter(ee.Filter.lte("CLOUD_COVER", 20)) .map( function(image) { var cloudShadowBitMask = 1 << 3; var cloudsBitMask = 1 << 5; var snowBitMask = 1 << 4; var qa = image.select('pixel_qa'); var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0) .and(qa.bitwiseAnd(cloudsBitMask).eq(0)) .and(qa.bitwiseAnd(snowBitMask).eq(0)); return image.updateMask(mask); } ) .map(function(image) { var time_start = image.get("system:time_start"); image = image.multiply(0.0001); image = image.set("system:time_start", time_start); return image; }) .map(function(image) { return image.addBands(image.normalizedDifference(["B3", "B6"]) .rename("MNDWI")); }) .select("MNDWI"); print("Col", Col); //大津算法(otsu)选择最优阈值方法,并进行影像的分割,水体和陆地分 // 离,提取陆地面积。 function otsu(histogram) { var counts = ee.Array(ee.Dictionary(histogram).get('histogram')); var means = ee.Array(ee.Dictionary(histogram).get('bucketMeans')); var size = means.length().get([0]); var total = counts.reduce(ee.Reducer.sum(), [0]).get([0]); var sum = means.multiply(counts).reduce(ee.Reducer.sum(), [0]).get([0]); var mean = sum.divide(total); var indices = ee.List.sequence(1, size); var bss = indices.map(function(i) { var aCounts = counts.slice(0, 0, i); var aCount = aCounts.reduce(ee.Reducer.sum(), [0]).get([0]); var aMeans = means.slice(0, 0, i); var aMean = aMeans.multiply(aCounts) .reduce(ee.Reducer.sum(), [0]).get([0]) .divide(aCount); var bCount = total.subtract(aCount); var bMean = sum.subtract(aCount.multiply(aMean)).divide(bCount); return aCount.multiply(aMean.subtract(mean).pow(2)).add( bCount.multiply(bMean.subtract(mean).pow(2))); }); return means.sort(bss).get([-1]); } var sCol1 = Col.map(function(image) { var histogram = image.reduceRegion({ reducer: ee.Reducer.histogram(), geometry: roi, scale: 2, maxPixels: 1e13, tileScale: 10 }); var threshold = otsu(histogram.get("MNDWI")); var mask = image.lte(threshold); var water = mask.updateMask(mask).rename("water"); var newWater = water.addBands(image); //转矢量 var vectors = newWater.reduceToVectors({ geometry: roi, scale: 2, geometryType: 'polygon', reducer: ee.Reducer.mean(), maxPixels: 1e13, tileScale: 10 }); vectors = vectors.filterBounds(roi); water = water.clip(vectors); //计算陆地面积 var areaImage = water.multiply(ee.Image.pixelArea()); //统计指定区域中所有陆地像素和,也就是沙体的面积 var dict = areaImage.reduceRegion({ reducer: ee.Reducer.sum(), geometry: vectors.geometry(), scale: 2, maxPixels: 1e13, tileScale: 10 }); water = water.set("area", ee.Number(dict.get("water")).divide(1000000)); water = water.set("threshold", threshold); return water.toByte(); }); print("sCol1", sCol1); Map.addLayer(sCol1.first(), {palette: "red"}, "BAR"); // 整合所有影像的时间和计算出的沙洲面积并输出 Export.table.toDrive({collection: sCol1, description: "guanzhou", fileNamePrefix: "guanzhou", selectors:["system:index","area"] });