Dan*_*ção 5 javascript performance flatten google-earth-engine
我正在尝试使用 Google Earth Engine 从大量的rapideye 图像中提取水掩模。我在Google Earth Engine 的代码编辑器中开发了这个脚本,它非常适合一小部分图像。但是当我尝试将图像数量增加到 100 以上时,我收到一条消息说
Computation timed out when processing the ee.FeatureCollection.flatten() function, line 84 of the script.
Run Code Online (Sandbox Code Playgroud)
有人对这个问题有任何提示或解决方案吗?
JavaScript 代码:
//Convert image into ImageCollection
function loadImageCollection(folderPath){
var t= ee.data.getInfo(folderPath);
var d=ee.data.getList(t);
var inglst=[];
for (var index = 0; index < d.length; ++index) {
inglst.push(ee.Image(d[index].id));}
return ee.ImageCollection.fromImages(inglst);}
var rapideyetoa= loadImageCollection('users/danielassumpcaoferreira/Rapideye2');
print(rapideyetoa);
//This function calculates Indices
var allbynary = function(image) {
var NIR = image.select('b5').rename ("nir");
var SR1 = image.select('b5').divide(image.select('b2')).rename("sr1");
var SR2 = image.select('b5').divide(image.select('b3')).rename("sr2");
var NGI = image.select('b2').divide(image.select('b1').add(image.select('b3')).add(image.select('b4')).add(image.select('b5'))).rename("ngi");
var NDWI = image.select('b5').subtract(image.select('b2')).divide(image.select('b5').add(image.select('b2'))).rename("ndwi");
// Classify based on threshold
var region = image.geometry();
var classNIR = ee.Image(0).clip(region);
var binNIR = classNIR.where(NIR.lte(0.3),1).rename("nir");
var classSR1 = ee.Image(0).clip(region);
var binSR1 = classSR1.where(SR1.lte(1),1).rename("sr1");
var classSR2 = ee.Image(0).clip(region);
var binSR2 = classSR2.where(SR2.lte(1),1).rename("sr2");
var classNGI = ee.Image(0).clip(region);
var binNGI = classNGI.where(NGI.gte(0.24),1).rename("ngi");
var classNdwi = ee.Image(0).clip(region);
var binNDWI = classNdwi.where(NDWI.lte(0),1).rename("ndwi");
var myimage = binNIR.addBands(binSR1).addBands(binSR2).addBands(binNGI).addBands(binNDWI);
var wproduct = myimage.expression('(b("nir") * b("sr1") * b("sr2") * b("ngi") * b("ndwi") )').rename("wmask");
wproduct = wproduct.clip(region);
return wproduct};
//Morphological filter, opening followed by closing
var filtered = function(image) {
return image.focal_min(1,'square')
.focal_max(1,'square').focal_max(1,'square').focal_min(1,'square')};
//Map the functions (Indice calculation and Morphological filter) over the collection.
var allbinCollection = rapideyetoa.map(allbynary);
var filterCollection = allbinCollection.map(filtered);
//Define the visualization parameters for rapideye.
var vizParams = {bands: ['b3', 'b2', 'b1'],min: 0.0, max: 0.3,gamma: [1.5, 1, 1]};
//Images Visualization
Map.addLayer(rapideyetoa,vizParams, "Rapideye");
Map.addLayer(allbinCollection, {min:0, max:1}, "binary");
Map.addLayer(filterCollection, {min:0, max:1}, "filter");
print(allbinCollection, "Binary Collection");
//Reproject Images to an Equivalent Projection -
var reproject = function(image) { return image.reproject('PROJCS["South_America_Albers_Equal_Area_Conic",GEOGCS["GCS_South_American_1969",DATUM["South_American_Datum_1969",SPHEROID["GRS_1967_Truncated",6378160,298.25]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Albers_Conic_Equal_Area"],PARAMETER["False_Easting",0],PARAMETER["False_Northing",0],PARAMETER["longitude_of_center",-60],PARAMETER["Standard_Parallel_1",-5],PARAMETER["Standard_Parallel_2",-42],PARAMETER["latitude_of_center",-32],UNIT["Meter",1],AUTHORITY["EPSG","102033"]]',null,5)};
var ReprjCollectionAlbers = filterCollection.map(reproject);
print(ReprjCollectionAlbers, "Filter Collection");
//Convert Raster to vector functions and Map over collection.
var transforvector = function(image) {
var rest = image.reduceToVectors(
{ geometry: image.geometry(),
scale : image.projection().nominalScale(),
crs : image.projection(),
geometryType: 'polygon',
maxPixels:1000000000,
bestEffort:true,
eightConnected: false,
});
return rest};
var watermask = ReprjCollectionAlbers.map(transforvector);
print(watermask, "watermask" );
//Flatten Image Collection
var FlattenCollection = watermask.flatten();
print(FlattenCollection, "watermask2" );
//Add area(ha) attribute to features
var addArea = function(feature) {return feature.set({areaHa: feature.geometry().area(ee.ErrorMargin(1)).divide(100 * 100)});};
var areaAdded = FlattenCollection.map(addArea);
//Exclude boundingBox and areas lower than 5 ha from feature
var Wmaskboundboxoff = areaAdded.filter(ee.Filter.eq('label',1));
var Wmask5ha = Wmaskboundboxoff.filter(ee.Filter.gte('areaHa',5));
print (Wmask5ha, "Wmask5ha");
Map.addLayer(Wmask5ha, {color:'#00BFFF'}, 'WaterMask');
//Convert vector do Geojason and export to googledrive
Export.table.toDrive ({collection: Wmask5ha,
description:'watermask',
fileFormat: 'GeoJSON'});
Run Code Online (Sandbox Code Playgroud)