在 google 地球引擎中提取多边形中所有像素的值

extract the values for all pixels in a polygon in google earth engine

我定义了一个多边形

var polygon = ee.Geometry.Polygon([114, 0.37, 114, 2.04, 112, 2.04, 112, 0.37]);

和上面的多边形需要处理的数据集

var dataset = ee.ImageCollection('NASA/NEX-GDDP');

选定日期

var startDate = ee.Date('1980-01-01');
var endDate = ee.Date('1980-01-02');

数据集有 3 个波段 prtasmaxtasmin,我正在选择我需要处理的波段

var dataset = ee.ImageCollection('NASA/NEX-GDDP')
             .filter(ee.Filter.date(startDate,endDate))
             .filter(ee.Filter.bounds(polygon))
             .select('tasmax');


Map.addLayer(dataset)

我想导出属于多边形的所有网格的数据 连同他们各自的经纬度。由于一天有 21 个特征 (GCM), 我期望最终数据的行数等于多边形 X 21 要素 (GCM) 中的网格数

var dailyImg = dataset.toBands();

Export.table.toDrive({
    collection: dailyImg,
    description: 'hist_tx',
    fileFormat: 'CSV',
});

当我尝试这样做时,出现错误

错误:参数无效:'collection' 必须是一个 FeatureCollection。

我该如何解决这个问题?此外,即使在将我的空间区域限制为多边形之后,地图仍然 显示整个地球的数据?为什么会这样?

Error: Invalid argument: 'collection' must be a FeatureCollection.

Export.table 用于导出 tables,也称为 FeatureCollections。你有一张图片,不是 table.

从 Earth Engine 中获取数据的最高效 方法是使用 Export.image,然后转换下载的 GeoTIFF 以适合您的 R 程序。然而,由于这个数据集非常小,将它下载为 CSV 格式就可以了,而用于此目的的工具是 ee.Image.sample,它将 Image 的区域转换为 FeatureCollection

var collection = dailyImg.sample({
  region: polygon,
  geometries: true,  // This specifies that you want the lat-long, rather
                     // than image samples without any position information.
});

如果导出它,您将获得 GeoJSON 格式的单列中的位置。这可能不是您想要的,因此我们可以将其转换为列:

var collection_with_latlon = collection.map(function (feature) {
  var coordinates = feature.geometry().transform('epsg:4326').coordinates();
  return feature.set('lon', coordinates.get(0), 'lat', coordinates.get(1));
});

Here's everything put together as a working example:

var polygon = ee.Geometry.Polygon([114, 0.37, 114, 2.04, 112, 2.04, 112, 0.37]);
var startDate = ee.Date('1980-01-01');
var endDate = ee.Date('1980-01-02');
var dataset = ee.ImageCollection('NASA/NEX-GDDP')
             .filter(ee.Filter.date(startDate,endDate))
             .filter(ee.Filter.bounds(polygon))
             .select('tasmax');

Map.addLayer(polygon);

var dailyImg = dataset.toBands();
var collection = dailyImg.sample({
  region: polygon,
  geometries: true,  // This specifies that you want the lat-long.
});

// Break point coordinates up into properties (table columns) explicitly.
var collection_with_latlon = collection.map(function (feature) {
  var coordinates = feature.geometry().transform('epsg:4326').coordinates();
  return feature.set('lon', coordinates.get(0), 'lat', coordinates.get(1));
});

print(collection_with_latlon);

Export.table.toDrive({
    collection: collection_with_latlon,
    description: 'hist_tx',
    fileFormat: 'CSV',
});

In addition, even after restricting my spatial area to the polygon, the map still displays the data for the entire globe? Why is this happening?

仅将集合过滤为几何图形忽略不与几何图形相交的图像。在这种情况下,图像覆盖了整个地球,因此没有图像被过滤掉。为了将图像剪辑到集合中,您必须指定它,例如:

var dailyImg = dataset.toBands().clip(polygon);

但是,如果您使用 .sample(),则没有必要这样做,因为该操作有其自己的区域参数,不会使用多边形之外的任何像素。