目录
一、基础设置模块
(一)研究区导入与地图配置
(二)时间参数定义
二、数据加载与预处理模块
三、统计计算模块
(一)整体平均风速计算
(二)逐月平均风速统计
四、可视化模块
(一)直方图绘制与面板展示
(二)图例创建
(三)平均风速影像可视化
五、核心技术亮点、设计思路和输出结果说明
六、运行结果
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
本代码基于 Google Earth Engine(GEE)平台开发,核心用途是对 2006-2007 年研究区的风速数据进行处理、分析与可视化。通过加载 NASA FLDAS 数据集的风速数据,完成研究区裁剪、时间筛选、统计计算(整体平均、逐月平均),并以地图图层、直方图、图例的形式呈现结果,实现了风速数据从获取到可视化的全流程处理。
一、基础设置模块
(一)研究区导入与地图配置
var roi = table; Map.addLayer(roi, {}, '研究区 ROI'); Map.centerObject(roi, 6);- 定义研究区边界
roi,数据源为预设的table(通常是 GEE 中导入的矢量边界数据,如行政区、自定义研究范围等)。 - 通过
Map.addLayer()将研究区边界添加到地图画布,图层名称为 “研究区 ROI”,第二个参数{}为图层样式配置(此处使用默认样式)。 Map.centerObject(roi, 6)将地图视角自动定位到研究区中心,第二个参数6为地图缩放级别(数值越大视角越近,范围越小)。
(二)时间参数定义
var timeParams = { startYear: 2006, endYear: 2007, startDate: '2006-01-01', endDate: '2007-12-31', months: ee.List.sequence(1, 12), years: ee.List.sequence(2006, 2007) };- 以对象
timeParams统一管理所有时间相关参数,方便后续调用和修改。 - 明确数据时间范围为 2006 年 1 月 1 日至 2007 年 12 月 31 日,通过
ee.List.sequence()生成 1-12 月的月份列表和 2006-2007 年的年份列表,为后续逐月统计做准备。 - 设计优势:参数集中管理,若需扩展时间范围(如增加 2008 年数据),仅需修改
endYear和years序列,无需改动后续逻辑代码。
二、数据加载与预处理模块
var windDataset = ee.ImageCollection("NASA/FLDAS/NOAH01/C/GL/M/V001") .filterBounds(roi) .filterDate(timeParams.startDate, timeParams.endDate) .select('Wind_f_tavg') .map(function(image) { return image.clip(roi); });- 数据来源:加载 NASA FLDAS 数据集(全球陆面数据同化系统),数据集 ID 为
"NASA/FLDAS/NOAH01/C/GL/M/V001",该数据集包含全球陆面多种气象、水文变量,此处聚焦风速数据。 - 数据筛选:
filterBounds(roi):筛选研究区范围内的数据,剔除研究区外的无效数据,提升计算效率。filterDate(...):按预设时间范围筛选 2006-2007 年的数据。select('Wind_f_tavg'):选择数据集中的风速变量(Wind_f_tavg表示近地面平均风速),排除其他无关变量(如温度、降水等)。
- 数据裁剪:通过
map()函数遍历影像集合中的每一幅影像,使用clip(roi)将影像裁剪至研究区边界,确保后续分析仅针对目标区域。
三、统计计算模块
(一)整体平均风速计算
var meanWind = windDataset.mean();- 功能说明:对筛选、裁剪后的 2006-2007 年所有风速影像计算平均值,得到研究区这段时间内的整体平均风速影像
meanWind。 - 原理:GEE 中
ImageCollection.mean()会对集合内所有影像的对应像素逐一计算均值,生成单幅汇总影像,反映长时间序列的平均状态。
(二)逐月平均风速统计
var monthlyStats = ee.FeatureCollection( timeParams.years.map(function(y) { return timeParams.months.map(function(m) { var monthly = windDataset .filter(ee.Filter.calendarRange(y, y, 'year')) .filter(ee.Filter.calendarRange(m, m, 'month')); var monthlyMean = monthly.mean(); var stats = monthlyMean.reduceRegion({ reducer: ee.Reducer.mean(), geometry: roi, scale: 11000, maxPixels: 1e9 }); return ee.Feature(null, { year: y, month: m, wind_speed: stats.get('Wind_f_tavg') }); }); }).flatten() );- 功能说明:统计 2006-2007 年每个月的研究区平均风速,生成包含 “年份、月份、风速值” 的要素集合,用于后续直方图绘制。
- 关键步骤拆解:
- 嵌套
map()遍历:外层遍历年份列表(2006、2007),内层遍历月份列表(1-12),实现对每个 “年 - 月” 组合的筛选。 - 月度影像筛选:
filter(ee.Filter.calendarRange(y, y, 'year'))和filter(ee.Filter.calendarRange(m, m, 'month'))筛选出当前年、当月的风速影像集合。 - 月度均值计算:
monthly.mean()得到当月的平均风速影像monthlyMean。 - 区域统计:
reduceRegion()对当月平均风速影像进行区域统计,参数说明:reducer: ee.Reducer.mean():统计方式为计算区域内所有像素的均值(即研究区当月平均风速)。geometry: roi:统计范围为研究区。scale: 11000:统计的空间分辨率为 11000 米(与原始数据集分辨率匹配,避免重采样误差)。maxPixels: 1e9:允许处理的最大像素数(避免因研究区过大导致计算超限)。
- 结果封装:将 “年份(y)、月份(m)、风速值(stats.get ('Wind_f_tavg'))” 封装为
ee.Feature,最终通过flatten()展平嵌套列表,生成一维要素集合monthlyStats。
- 嵌套
四、可视化模块
(一)直方图绘制与面板展示
var histogram = ui.Chart.feature.histogram({ features: monthlyStats, property: 'wind_speed', maxBuckets: 20 }).setOptions({ title: '2006-2007 月平均风速直方图', hAxis: { title: '风速 (m/s)' }, vAxis: { title: '频数' }, legend: { position: 'none' } }); var panel = ui.Panel({ style: { width: '450px', position: 'bottom-right', padding: '8px' } }); panel.add(histogram); Map.add(panel);- 功能说明:基于逐月平均风速数据绘制直方图,展示风速值的分布特征,并在地图上添加可视化面板。
- 关键解析:
- 直方图生成:
ui.Chart.feature.histogram()用于生成要素集合的直方图,参数说明:features: monthlyStats:数据源为逐月统计的要素集合。property: 'wind_speed':统计的属性字段为 “风速值”。maxBuckets: 20:直方图的柱形数量最多为 20 个(控制图表精度,避免柱形过多导致杂乱)。
- 图表样式配置:
setOptions()设置图表标题、横纵轴标签(横轴为风速,单位 m/s;纵轴为频数),隐藏图例(单变量直方图无需图例)。 - 面板创建与添加:
ui.Panel()创建一个位于地图右下角、宽度 450px 的面板,将直方图添加到面板后,通过Map.add(panel)挂载到地图上,方便用户查看。
- 直方图生成:
(二)图例创建
var visualizationParams = { windSpeed: { min: 0.3750263580093698, max: 8.113219716238905, palette: ['#0e0e0e', '#281dc8', '#38913b', '#5af7ff', '#10ff22', '#f5ff62', '#ff640a'] } }; function createLegend() { var legend = ui.Panel({ style: { padding: '8px 15px', position: 'bottom-left', backgroundColor: 'rgba(255, 255, 255, 0.9)', width: '220px' } }); legend.add(ui.Label({ value: '平均风速 (m/s)', style: { fontWeight: 'bold', fontSize: '16px', margin: '0 0 10px 0' } })); var palette = visualizationParams.windSpeed.palette; var min = visualizationParams.windSpeed.min; var max = visualizationParams.windSpeed.max; var step = (max - min) / (palette.length - 1); palette.forEach(function(color, i) { var value = min + step * i; var item = ui.Panel({ layout: ui.Panel.Layout.flow('horizontal') }); item.add(ui.Label({ style: { backgroundColor: color, padding: '8px', margin: '0 6px 0 0', border: '1px solid #999' } })); item.add(ui.Label({ value: value.toFixed(2) + (i < palette.length - 1 ? ' - ' + (value + step).toFixed(2) : '+'), style: { fontSize: '14px' } })); legend.add(item); }); legend.add(ui.Label({ value: '数据来源: NASA FLDAS', style: { fontSize: '11px', margin: '10px 0 0 0' } })); return legend; }- 功能说明:创建地图图层的图例,用于解释平均风速影像的颜色对应的风速范围,提升地图可读性。
- 关键解析:
- 可视化参数定义:
visualizationParams统一配置风速影像的可视化规则,包括风速最小值(min)、最大值(max)和颜色调色板(palette),颜色从深黑(低风速)渐变到橙色(高风速),便于直观区分风速等级。 - 图例面板创建:
createLegend()函数生成一个位于地图左下角、半透明白色背景的图例面板,包含标题、颜色块、数值范围标签和数据来源说明。 - 颜色与数值匹配:通过计算步长
step = (max - min) / (palette.length - 1),将颜色调色板与风速范围逐一对应,例如第一个颜色块对应0.38 - 1.57 m/s(保留两位小数),最后一个颜色块对应7.00+ m/s。
- 可视化参数定义:
(三)平均风速影像可视化
Map.addLayer( meanWind, visualizationParams.windSpeed, 'Mean Wind Speed(平均风速)' ); Map.add(createLegend());- 功能说明:将整体平均风速影像添加到地图,并挂载图例,完成最终的地图可视化。
- 关键解析:
Map.addLayer()的三个参数分别为:待可视化的影像(meanWind)、可视化配置(visualizationParams.windSpeed,即之前定义的颜色和数值范围)、图层名称(中英文结合,便于识别)。Map.add(createLegend())将创建好的图例添加到地图,与风速影像配套展示,让用户能快速解读地图上不同颜色代表的风速大小。
五、核心技术亮点、设计思路和输出结果说明
模块化设计:
代码按“基础设置→数据加载→统计计算→可视化”的逻辑拆分模块,每个模块功能独立,参数集中管理(如timeParams、visualizationParams),便于后续维护和功能扩展(如修改时间范围、更换可视化颜色)。
GEE 核心功能应用:
- 影像集合处理:灵活运用
filterBounds()、filterDate()、select()、map()、mean()等方法,实现数据的筛选、裁剪、汇总。 - 区域统计:
reduceRegion()结合ee.Reducer.mean(),高效计算研究区平均风速,通过scale参数确保统计精度与原始数据匹配。 - 交互式可视化:利用
ui.Chart绘制统计图表,ui.Panel创建自定义面板,createLegend()生成个性化图例,提升结果展示的直观性和交互性。
性能优化考量:
- 数据筛选先行:先通过
filterBounds()和filterDate()剔除无效数据,再进行裁剪和计算,减少处理的数据量。 - 合理设置参数:
maxPixels: 1e9避免因研究区过大导致计算超限,scale: 11000匹配原始数据集分辨率,避免不必要的重采样开销。
输出结果说明:
- 地图图层:研究区边界图层、2006-2007 年整体平均风速影像图层(颜色对应风速等级)。
- 直方图面板:位于地图右下角,展示逐月平均风速的分布情况,可直观查看风速的集中区间(如多数月份风速集中在 2-4 m/s)。
- 图例面板:位于地图左下角,标注颜色对应的风速范围和数据来源,帮助用户解读地图信息。
六、运行结果
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!