GEE图表:基于ERA5气象数据进行风速分析的时序分析和可视化

使用Google Earth Engine分析风速的代码解析

在本博客中,我们将逐步解析一段使用Google Earth Engine(GEE)进行风速分析的JavaScript代码。该代码主要用于计算特定区域内的风速,并导出结果为CSV文件。

1. 定义感兴趣区域(ROI)

首先,我们定义一个多边形作为我们的感兴趣区域(ROI):

var roi = 
    /* color: #ffc82d */
    /* shown: false */
    /* displayProperties: [
      {
        "type": "rectangle"
      }
    ] */
    ee.Geometry.Polygon(
        [[[-0.5759926154934103, 51.56908953196694],
          [-0.5759926154934103, 51.468253456226385],
          [-0.4221840217434103, 51.468253456226385],
          [-0.4221840217434103, 51.56908953196694]]], null, false);

2. 加载ERA5气象数据集

接下来,我们加载ERA5气象数据集,选择风速的u和v分量,并过滤时间范围为2010年至2024年:

var era5 = ee.ImageCollection("ECMWF/ERA5/DAILY")
.select('u_.*','v_.*')
.filterDate('2010','2024');

3. 计算风速

我们使用map函数来计算风速,风速的计算公式为:

[
\text{风速} = \sqrt{(u^2) + (v^2)}
]

以下是计算风速的代码:

var windspeed = era5.map(function(img) {
  var eq = img.expression('sqrt((u**2)+(v**2))', {
    'u': img.select('u_.*'), 'v': img.select('v_.*')
  }).rename('wind_speed');
  return eq.copyProperties(img, img.propertyNames());
});

4. 绘制风速时间序列图

我们使用ui.Chart.image.series函数绘制风速时间序列图,并将其打印出来:

print(ui.Chart.image.series(windspeed, roi, ee.Reducer.mean(), 27000, 'system:time_start'));

5. 加载1980年至2020年的ERA5气象数据集

我们再次加载ERA5气象数据集,但这次的时间范围为1980年至2020年:

var wind40 = ee.ImageCollection("ECMWF/ERA5/DAILY").filterDate('1980','2020');

6. 计算1980年至2020年的风速

与之前相似,我们计算1980年至2020年期间的风速:

var windspeed40 = wind40.map(function(img) {
  var eq = img.expression('sqrt((u**2)+(v**2))', {
    'u': img.select('u_.*'), 'v': img.select('v_.*')
  }).rename('wind_speed');
  return eq.copyProperties(img, img.propertyNames());
});

7. 提取风速数据

我们定义一个函数get_value,用于提取每个影像的日期和风速值:

function get_value(img) {
  var date = ee.Date(ee.Image(img).get('system:time_start')).format().slice(0, 10);
  var value = ee.Number(ee.Image(img).reduceRegion({
    reducer: ee.Reducer.mean(), geometry: roi, scale: 27000
  }).values().get(0));
  return [date, value];
}

8. 创建风速特征集合

我们将风速数据转化为特征集合,以便于导出:

var size = windspeed40.size();
var windlist = windspeed40.toList(size).map(get_value);

var wind_feature = ee.FeatureCollection(windlist.map(function(el) {
  el = ee.List(el);
  return ee.Feature(null, {'date': ee.String(el.get(0)), 'windspeed': ee.String(el.get(1))});
}));

9. 导出风速数据

最后,我们将风速特征集合导出为CSV文件:

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

结论

通过以上步骤,我们成功地使用Google Earth Engine计算了特定区域内的风速,并将结果导出为CSV文件。这些分析可以为气象研究和环境监测提供有价值的信息。希望这篇博客能帮助你更好地理解如何使用GEE进行气象数据分析!

全部代码

// 定义感兴趣区域(ROI)
var roi = 
    /* color: #ffc82d */
    /* shown: false */
    /* displayProperties: [
      {
        "type": "rectangle"
      }
    ] */
    ee.Geometry.Polygon(
        [[[-0.5759926154934103, 51.56908953196694],
          [-0.5759926154934103, 51.468253456226385],
          [-0.4221840217434103, 51.468253456226385],
          [-0.4221840217434103, 51.56908953196694]]], null, false);
          
// 加载ERA5气象数据集,选择风速的u和v分量
var era5 = ee.ImageCollection("ECMWF/ERA5/DAILY")
    .select('u_.*','v_.*')
    .filterDate('2010','2024');

// 计算风速
var windspeed = era5.map(function(img) {
  var eq = img.expression('sqrt((u**2)+(v**2))', {
    'u': img.select('u_.*'), 'v': img.select('v_.*')
  }).rename('wind_speed');
  return eq.copyProperties(img, img.propertyNames());
});

// 打印风速时间序列图
print(ui.Chart.image.series(windspeed, roi, ee.Reducer.mean(), 27000, 'system:time_start'));

// 加载1980年至2020年的ERA5气象数据集
var wind40 = ee.ImageCollection("ECMWF/ERA5/DAILY").filterDate('1980','2020');

// 计算1980年至2020年的风速
var windspeed40 = wind40.map(function(img) {
  var eq = img.expression('sqrt((u**2)+(v**2))', {
    'u': img.select('u_.*'), 'v': img.select('v_.*')
  }).rename('wind_speed');
  return eq.copyProperties(img, img.propertyNames());
});

// 提取风速数据的函数
function get_value(img) {
  var date = ee.Date(ee.Image(img).get('system:time_start')).format().slice(0, 10);
  var value = ee.Number(ee.Image(img).reduceRegion({
    reducer: ee.Reducer.mean(), geometry: roi, scale: 27000
  }).values().get(0));
  return [date, value];
}

// 创建风速特征集合
var size = windspeed40.size();
var windlist = windspeed40.toList(size).map(get_value);

var wind_feature = ee.FeatureCollection(windlist.map(function(el) {
  el = ee.List(el);
  return ee.Feature(null, {'date': ee.String(el.get(0)), 'windspeed': ee.String(el.get(1))});
}));

// 导出风速数据为CSV文件
Export.table.toDrive({
  collection: wind_feature,
  description: 'windspeed40',
  fileFormat: 'CSV'
});

结果

时序可视化结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此星光明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值