Как передать геометрию в функцию Map в GEE? - PullRequest
2 голосов
/ 28 января 2020

Я пытаюсь использовать функцию Map в Google Earth Engine, чтобы закрепить коллекцию ImageCollection в геометрии. У меня есть несколько областей интереса (AOI), и поэтому я хотел бы применить универсальную c функцию клипа несколько раз (для каждого AOI). Однако, когда я создаю функцию с двумя параметрами (изображение и геометрия) для отображения, я получаю ошибку image.clip is not a function. При использовании функции только с одним параметром (изображением) она работает просто отлично, но тогда мне нужно написать две (или, возможно, более) функции, чтобы выполнить точно такую ​​же задачу (т.е. обрезать изображение до определенной геометрии).

Я пробовал решения в этом сообщении, но они не работают.

Есть идеи, как решить эту проблему?

Код:

// Get NTL data
var ntl = ee.ImageCollection("NOAA/VIIRS/DNB/MONTHLY_V1/VCMSLCFG");

// Define start and end year
var startYear = 2015;
var endYear = 2018;

// Filter montly and select 'avg_rad' band
var ntlMonthly = ntl.filter(ee.Filter.calendarRange(startYear, endYear, 'year'))
  .filter(ee.Filter.calendarRange(1,12,'month'))
  .select(['avg_rad']);  

// Create geometries of AOIs
// -- Create a geometry of Venezuela 
var geomVenezuela = ee.Geometry.Rectangle([-73.341258, 13.363291, -59.637555, -0.372893]);
// -- Create a geometry of Caracas (Venezuela's capital)
var geomCaracas = ee.Geometry.Rectangle([-67.062383, 10.558489, -66.667078, 10.364908]);

// Functions to crop to Venezuela (nationwide) and Caracas (local) resp.
var clipImageToGeometry  = function(image, geom) {
  return image.clip(geom);
}

// Apply crop function to the ImageCollection 
var ntlMonthly_Venezuela = ntlMonthly.map(clipImageToGeometry.bind(null, geomVenezuela));
var ntlMonthly_Caracas = ntlMonthly.map(clipImageToCaracas.bind(null, geomCaracas));

// Convert ImageCollection to single Image (for exporting to Drive)
var ntlMonthly_Venezuela_image = ntlMonthly_Venezuela.toBands();
var ntlMonthly_Caracas_image = ntlMonthly_Caracas.toBands();

// Check geometry in map
Map.addLayer(geomCaracas, {color: 'red'}, 'planar polygon');
Map.addLayer(ntlMonthly_Caracas_image);

// Store scale (m. per pixel) in variable
var VenezuelaScale = 1000;
var CaracasScale = 100;

// Export the image, specifying scale and region.
Export.image.toDrive({
  image: ntlMonthly_Caracas_image,
  description: 'ntlMonthly_Caracas_'.concat(startYear, "_to_", endYear),
  folder: 'GeoScripting',
  scale: CaracasScale,
  fileFormat: 'GeoTIFF',
  maxPixels: 1e9
});

1 Ответ

1 голос
/ 28 января 2020

Если я правильно понял ваш вопрос:

Если вы хотите обрезать каждое изображение в ImageCollection до геометрии, вы можете просто сделать

var ntlMonthly_Venezuela = ntlMonthly.map(function(image){return ee.Image(image).clip(geomVenezuela)})

И просто повторить для других AOI.

Если вы хотите преобразовать его в функцию:

var clipImageCollection = function(ic, geom){

  return ic.map(function(image){return ee.Image(image).clip(geom)})

}

// Apply crop function to the ImageCollection 
var ntlMonthly_Venezuela = clipImageCollection(ntlMonthly, geomVenezuela);
var ntlMonthly_Caracas = clipImageCollection(ntlMonthly, geomCaracas);
...