Google Earth Engine (GEE) 提取某一位置时间序列值

前言

做时间序列相关算法的同学,经常需要下载年际的数据来进行试验。而且算法研究的比较重要的步骤就是利用实测站点数据进行验证。本文讲述如何使用GEE下载指定卫星遥感/再分析数据集指定位置(实测站点位置)的时间序列值。

提取指定点年序列值-imageCollection

整个过程可以在imageCollection上进行操作,并且中间处理过程的返回对象都是image,这种情景非常简单直接。配合上篇博客,也可以进行QC过滤。
首先定义点的经纬度坐标。然后过滤数据集合,这里以MODIS的NDVI产品MOD13A2为例。由于MOD13A2在GEE中原始分辨率为900+m并且原始投影为正弦投影,而我需要在WGS84坐标系上1 km左右尺度的值,所以这里还包括了一个平均聚合和重投影的过程(非常重要)。如果需要从低分辨率向高分辨率采样,则将聚合过程替换为.resample(method)即可。最后就是生成指定点的时间序列图表。

var gwn = ee.Geometry.Point([-89.8729, 34.2574], 'EPSG: 4326');

var mod13a2Collection = ee.ImageCollection("MODIS/006/MOD13A2")
  .filterBounds(gwn)
  .filterDate('2010-01-01', '2011-01-01')
  .select('NDVI');

print(mod13a2Collection); 
 
var mod13a2Collection = mod13a2Collection.map(function(image){
  return image.reduceResolution({
      reducer: ee.Reducer.mean(),
    })
    .reproject({
      crs: 'EPSG: 4326',
      scale: 1000
    });
}); 
  
var chart = ui.Chart.image.series({
  imageCollection: mod13a2Collection,
  region: gwn,
  reducer: ee.Reducer.first(),
  scale: 1000
}).setOptions({title: 'NDVI'});

print(chart);

生成图表如下,右上角按钮可以在新标签页中打开并下载。
在这里插入图片描述

提取指定点年序列值-List

可以看出上边的情形是在最后一步使用ui.Chart.image.series时指定了提取位置。如果在中间过程中就对提取位置进行指定,即对image使用.reduceRegion,那么它的返回对象就是一个由指定位置值组成的年序列列表,无法再构成原始的imageCollection。这时候就需要额外的步骤进行提取。这里以GLDAS的10cm土壤水分为例:

var gwn = ee.Geometry.Point([-89.8729, 34.2574], 'EPSG: 4326');

var gldasSoilMoisture = ee.ImageCollection("NASA/GLDAS/V021/NOAH/G025/T3H")
  .filterDate('2010-01-01', '2011-01-01') 
  .filter(ee.Filter.eq('start_hour', 15))
  .select('SoilMoi0_10cm_inst');
 
//  
var gldasSoilMoisture = gldasSoilMoisture.toList(365).map(function(image){
  var soilMoisture = ee.Image(image)
    .resample('bicubic')
    .reduceRegion({
       geometry: gwn,
       reducer: ee.Reducer.first(),
       scale: 1000
    });
  return soilMoisture;
});
print(gldasSoilMoisture);

上述代码中,由于.reduceRegion返回的并不再是image,所以无法直接对原始imageCollection应用map,需要首先将其转换为List。此外,由于GLDAS原始影像分辨率为0.25°,我需要1 km尺度值,所以需要对它指定重采样方法(如果不指定,GEE默认为最邻近法,误差很大)。上述代码,print的结果为:
在这里插入图片描述
可以看出返回对象还是List,其中每个元素都是字典的形式,SoilMoi0_10cm_inst的值就是我们所需要的值。
所以,接下来需要把值单独提取出来构成一个``List`。

// the calculate result is a list with some dictionary
var gldasSoilMoisture = gldasSoilMoisture.map(function(object){
  return ee.Dictionary(object).get('SoilMoi0_10cm_inst');
});
print(gldasSoilMoisture);

var chart = ui.Chart.array.values({
  array: gldasSoilMoisture,
  axis: 0
});
print(chart);

上述代码即将列表中每个字典的值提取出来构成了新的列表,并进行绘图。
这种情况的代码其实写的麻烦了,不进行.reduceRegion,就可以和第一种情景的代码一致了。但是,掌握这种情景,以后也能更灵活的进行实现。
在这里插入图片描述
后续会更新一篇如何将GLDAS的3小时气温数据求均值转为日均值,并提取指定点年序列值的博客。

### 使用 GEE 提取遥感影像的光谱特征曲线 #### 准备工作 为了从遥感影像中提取光谱特征曲线,在 Google Earth Engine (GEE) 中可以利用其强大的 JavaScript API 来完成这任务。首先,确保已经安装了必要的开发环境,并登录到了 GEE 账户。 #### 加载影像集合与定义区域 加载所需的卫星影像数据集,并指定感兴趣的地理空间位置作为分析对象。这步骤对于后续的操作至关重要,因为所有的计算都将基于选定的位置来进行[^1]。 ```javascript // 定义个点位用于测试 var point = ee.Geometry.Point([longitude, latitude]); // 加载 Landsat 8 表面反射率产品 var collection = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR') .filterBounds(point) .sort('CLOUD_COVER', false) .first(); ``` #### 提取时间序列数据 针对特定地点的时间序列光谱信息可以通过 `reduceRegion` 方法来实现。此方法允许用户在个给定区域内聚合像元,从而获得该地区的平均光谱响应特性。这里以单个点为例说明如何获取不同波段下的反射率数变化情况。 ```javascript // 设置要观察的期范围 var startDate = 'YYYY-MM-DD'; var endDate = 'YYYY-MM-DD'; // 创建按月过滤后的图像集合 var filteredCollection = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR') .filterDate(startDate, endDate); // 对于每个图像应用 reduceRegions 计算均 var timeSeries = filteredCollection.map(function(image){ var means = image.reduceRegion({ reducer: ee.Reducer.mean(), geometry: point, scale: 30 // 根据传感器调整分辨率 }); return ee.Feature(null, { date: image.date().format(), blue: means.get('B2'), green: means.get('B3'), red: means.get('B4'), nir: means.get('B5')}); }); print(timeSeries); ``` #### 可视化光谱特征曲线 最后步是将上述得到的数据绘制成图表形式以便直观展示。借助于 GEE 自带的地图绘制功能或是导出 CSV 文件再用其他软件(如 Excel 或 Python 的 Matplotlib 库)进行进步加工处理都是可行的选择之[^2]。 ```javascript // 将 FeatureCollection 换为客户端列表 var list = timeSeries.toList(100).getInfo(); // 绘制光谱特征曲线 ui.Chart.feature.byFeature({features:timeSeries, property:'date'}) .setChartType('LineChart') .setOptions({ title: 'Spectral Signature Over Time', hAxis: {title: 'Time'}, vAxis: {title: 'Reflectance'} }) .addToUI(); ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值