第一次接触Daylight Map Distribution(简称DMD)时,我完全被这个数据集的价值震撼了。简单来说,它就是一张记录地球表面每个角落日照情况的"阳光地图"。想象一下,如果你要开一家太阳能发电站,最关心什么?当然是哪里阳光最充足!DMD就是帮你解决这个问题的神器。
这个数据集的神奇之处在于,它把卫星观测、地面气象站数据和专业气象模型的结果融合在一起。就像把多个天气预报专家的意见综合起来,最后得出一个更准确的结果。我去年在评估东南亚某地的太阳能项目时,发现DMD提供的日照数据与实际测量值误差不超过5%,这对于免费公开的数据来说简直不可思议。
具体到技术层面,DMD提供了三种关键数据:
javascript复制// 在GEE中调用DMD数据的示例代码
var daylightData = ee.ImageCollection("projects/sat-io/open-datasets/DAYLIGHTMAP/annual_radiation");
单独看日照数据就像知道一块地能晒到多少阳光,却不知道这块地能不能用。这就是ESA土地覆盖数据发挥作用的地方。ESA 2020土地覆盖数据集就像给地球表面贴标签,告诉你哪里是森林、哪里是城市、哪里是农田。
记得我第一次做非洲太阳能项目评估时,发现一片日照条件极佳的沙漠地区,兴奋地准备推荐给客户。幸好同事提醒我查了土地覆盖数据,才发现那里是国家级自然保护区。这个教训让我明白:好的太阳能选址=充足的阳光+可用的土地。
ESA数据集最实用的分类包括:
javascript复制// 加载ESA土地覆盖数据
var landCover = ee.Image("ESA/WorldCover/v200/2020");
现在我们来点真格的。假设我们要评估越南南部某区域的太阳能潜力,以下是完整操作流程:
首先在GEE中划定分析区域。我推荐使用绘图工具手动圈选,比输入坐标更直观。划重点:记得把分析范围稍微划大一点,给后续的缓冲区分析留余地。
javascript复制// 定义分析区域(以越南南部为例)
var region = ee.Geometry.Polygon(
[[[106.5, 10.2],
[106.5, 9.8],
[107.2, 9.8],
[107.2, 10.2]]]);
处理DMD数据时要注意时间尺度。如果是长期项目,建议用多年平均值;如果是季节性项目,就要分季度分析。这里有个小技巧:先用.mean()方法计算区域平均值,再用.clip()方法裁剪到目标区域。
javascript复制// 计算区域年均日照量
var solarRadiation = daylightData.mean().clip(region);
ESA数据默认是分类数据,我们需要先筛选出适合开发的类型。根据我的经验,代码中的class值这样设置最实用:
javascript复制// 筛选适宜土地类型
var suitableLand = landCover.eq(30).or(landCover.eq(10)).or(landCover.eq(50));
GEE的可视化功能非常强大,但要注意配色选择。日照数据建议用从黄到红的渐变色,土地适宜性用绿色系。我常用的可视化参数是这样的:
javascript复制// 日照可视化参数
var solarVis = {
min: 1500,
max: 2500,
palette: ['yellow', 'orange', 'red']
};
// 土地适宜性可视化参数
var landVis = {
min: 0,
max: 1,
palette: ['white', 'green']
};
得到初步结果后,真正的分析工作才开始。我通常会计算三个关键指标:
这些数据可以直接写入投资分析报告。记得附上地图截图时,要包含比例尺和图例,专业度立马提升50%。
在东南亚某国做项目时,我们发现一个有趣现象:ESA分类为"农田"的区域,实际调查发现很多是闲置的。这提醒我们数据要结合实际考察。后来我们开发了一套验证流程:
另一个教训是关于数据更新。ESA数据每年更新一次,但地方建设可能更快。有次我们推荐的地块在数据更新后发现已经建了工厂。所以现在做项目,我一定会用Sentinel-2的最新影像再检查一遍。
javascript复制// 获取最新Sentinel-2影像做二次验证
var sentinel = ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(region)
.filterDate('2023-01-01', '2023-12-31')
.median();
当分析区域很大时(比如整个非洲),GEE脚本可能会运行缓慢。我总结了几个提速技巧:
还有一个实用技巧是创建自己的函数库。我把常用的分析步骤封装成函数,比如这个计算适宜面积的函数:
javascript复制// 计算适宜土地面积的函数
function calculateSuitableArea(region) {
var areaImage = ee.Image.pixelArea().updateMask(suitableLand);
return areaImage.reduceRegion({
reducer: ee.Reducer.sum(),
geometry: region,
scale: 100,
maxPixels: 1e13
}).get('area');
}
新手最常遇到的三个问题:
我处理过一个特别案例:客户坚持要在日照数据看似不错的沿海区域建站,但我们的分析显示那里盐雾腐蚀严重。后来我们结合了气象数据,证明该地区确实不适合。这个案例告诉我们:太阳能评估不能只看日照数据,要综合考虑环境因素。