在这篇博客中,将展示使用Google Earth Engine(GEE)提取区域内矢量点缓冲区内任意指标的统计值,并将结果导出为一个CSV文件。作为示例,使用Landsat 8归一化植被指数(NDVI)作为指标,它是一种常用的遥感指标,可以反映植被的生长状况和覆盖度。
创建一个表示区域的几何图形
首先,创建一个代表研究区域的几何图形(包含所有矢量点)。在这里,使用ee.Geometry.Rectangle
函数来创建一个矩形,参数是矩形的西南角和东北角的经纬度坐标。你也可以使用其他类型的几何图形,比如多边形或圆形。
// 创建一个表示导出区域的几何图形
var geometry = ee.Geometry.Rectangle([-100.88, 40.58, -100.27, 40.71]);
导入Landsat 8影像集合
接下来,导入Landsat 8影像集合,并对其进行一些筛选。在这里,使用ee.ImageCollection
函数来导入LANDSAT/LC08/C01/T1_RT_TOA
这个影像集合,它是Landsat 8的表观反射率数据。然后,我使用了filterDate
函数来筛选2019年到2020年之间的影像,使用了filterBounds
函数来筛选包含我们感兴趣区域的影像。
// 导入Landsat 8影像集合
var landsat = ee.ImageCollection('LANDSAT/LC08/C01/T1_RT_TOA')
.filterDate('2019-01-01', '2020-12-31')
.filterBounds(geometry);
计算NDVI
计算NDVI需要定义一个函数,它接受一个影像作为输入,并返回一个包含NDVI值的影像作为输出。在这里,使用normalizedDifference
函数来计算Landsat 8影像中第5波段(近红外)和第4波段(红光)之间的归一化差值,并将结果重命名为’NDVI’。然后,我使用了copyProperties
函数来复制原始影像的属性到新的影像中。
// 定义一个函数来计算NDVI并进行缩放
var ndvi = function(image) {
return image
.normalizedDifference(['B5', 'B4'])
.rename('NDVI')
.copyProperties(image, image.propertyNames());
};
将函数映射到集合上
对整个影像集合进行NDVI计算,使用map
函数来将定义的函数应用到每个影像,得到了一个包含NDVI值的新的影像集合。
// 将函数映射到集合上
var ndviCollection = landsat.map(ndvi);
定义矢量文件
定义一些矢量点。使用ee.FeatureCollection
函数来创建一个包含三个点的矢量文件,每个点都是用ee.Geometry.Point
函数创建的,并传入经纬度坐标作为参数。
// 定义一个包含多个点的矢量文件
var points = ee.FeatureCollection([
ee.Feature(ee.Geometry.Point([-100.55, 40.71])),
ee.Feature(ee.Geometry.Point([-100.40, 40.65])),
ee.Feature(ee.Geometry.Point([-100.27, 40.58]))
]);
将每个点缓冲100米
为了考虑到像素的大小和位置误差,我们需要对每个点进行一定的缓冲,这样就可以得到一个包含多个缓冲区的矢量文件。定义一个函数,它接受一个要素作为输入,并返回一个缓冲了100米的要素作为输出。然后,我使用了map
函数来将这个函数应用到每个点上。
// 定义一个函数来将每个点缓冲100米
var bufferPoints = function(feature) {
return feature.buffer(100);
};
// 将函数映射到点上
var bufferedPoints = points.map(bufferPoints);
提取每个缓冲区内的统计值
使用ndviCollection.mean()
函数来计算影像集合在每个缓冲区内的平均NDVI值,并使用了reduceRegion
函数来进行区域统计。然后,我使用了get
函数来获取NDVI值,并使用了set
函数来将其添加到要素的属性中。
// 定义一个函数来提取每个缓冲区内的统计值
var zonalStats = function(feature) {
// 在缓冲区内对NDVI影像集合进行平均值统计
var meanNDVI = ndviCollection.mean().reduceRegion({
reducer: ee.Reducer.mean(),
geometry: feature.geometry(),
scale: 30 // 使用Landsat 8的原始分辨率
});
// 获取NDVI值并将其作为属性添加到要素中
var ndviValue = meanNDVI.get('NDVI');
return feature.set('NDVI', ndviValue);
};
// 将函数映射到缓冲区上
var ndviPoints = bufferedPoints.map(zonalStats);
打印和显示结果
为了查看我们的结果,我们可以使用print
函数来打印出包含统计值的矢量文件,并使用Map.addLayer
函数来将其显示在地图上。我们可以使用color
参数来设置显示的颜色,使用name
参数来设置图层的名称。我们还可以使用Map.centerObject
函数来将地图中心定位到我们的矢量文件上。
// 打印和显示结果
print(ndviPoints);
Map.addLayer(ndviPoints, {color: 'FF0000'}, 'NDVI Points');
Map.centerObject(ndviPoints);
将包含统计值的矢量文件导出为CSV文件
最后,使用Export.table.toDrive
函数来将包含统计值的矢量文件导出为一个CSV文件,并保存到Google Drive上。可以使用以下参数来设置导出选项:
collection
: 要导出的矢量文件。description
: 导出任务的描述。folder
: Google Drive上的文件夹名称。fileFormat
: 导出文件的格式。selectors
: 要导出的属性名称。
// 将包含统计值的矢量文件导出为CSV文件
Export.table.toDrive({
collection: ndviPoints,
description: 'NDVI_100m_Landsat',
folder: 'GEE',
fileFormat: 'CSV',
selectors: ['NDVI']
});