GEE:探索黄河流域10年来降水变化特征【逐像元分析】

33 篇文章 11 订阅
24 篇文章 20 订阅


前言

GEE,如何分析黄河流域10年来降水变化特征?

同类分析参见:
GEE:探索黄河流域10年来植被变化特征【逐像元分析】

本次进行分析的区域如下:
在这里插入图片描述


一、分析步骤

主要分析步骤:

加载流域影像集
可视化显示
添加时间波段
变化趋势分析Reducer.linearFit
可视化展示

二、python代码

1、加载影像集

使用的数据集为:逐月气候与水平衡数据集
在这里插入图片描述

python代码如下

# 添加显示底图,选取高德地图
Map = geemap.Map()
# Map.basemap_demo()
Map.add_basemap('Gaode.Normal')
Map

2、流域降水变化特征

  • ee.Reducer.linearFit()
    在这里插入图片描述
    python代码如下:

# 流域边界
basin_shp = '../world_basins/worldrivers2/huanghe.shp' 
basin_bj = geemap.shp_to_ee(basin_shp) 
roi = basin_bj.geometry()

Map.centerObject(roi)
Map.addLayer(ee.Image().paint(roi, 0, 2), {'palette':'darkblue'}, 'huanghe')

# 定义添加时间波段函数
def addTime(image):
    return image.addBands(image.metadata('system:time_start').divide(1000 * 60 * 60 * 24 * 365))

# 添加数据集,添加时间波段
collection = ee.ImageCollection('IDAHO_EPSCOR/TERRACLIMATE') \
    .filterDate('2010-01-01', '2020-12-31') \
    .map(addTime) 

# 选择用于线性趋势预测的波段
trend = collection.select(['system:time_start', 'pr']) \
    .reduce(ee.Reducer.linearFit()) \
    .clip(roi)

#渲染显示
visualization = {
    'max':3,
    'min':-3,
    'palette': ['b30000','d7301f','ef6548','fc8d59','fdbb84','fdd49e','fee8c8','f7fcf0','e0f3db','ccebc5','a8ddb5','7bccc4','4eb3d3','2b8cbe','0868ac']
}
# 降水量的斜率变化,反映20年来流域内降水量的增加或减少的变化趋势
Map.addLayer(trend.select('scale'),visualization, 'huanghe_pre') 
Map

结果如下:
在这里插入图片描述


三、对比的问题

在这儿引用了另外一篇博文对于年降水量的分析,比较两者计算结果的差异,其python代码如下:

# 修改来自"GEE(Python)逐像元线性拟合"的code
#加入研究区
study_area = basin_bj

#添加时间波段的函数
def createTimeBand(img): 
    date = img.metadata("date").subtract(2010)
    return date.rename("year").clip(study_area).addBands(img)

#遍历获取月降水数据,并循环计算每年的总降水量,存入list中
datalist=ee.List([])
year=2010
for i in range(10):
    datalist=datalist.add(ee.ImageCollection("IDAHO_EPSCOR/TERRACLIMATE") \
        .filter(ee.Filter.date(ee.Date(str(year)+"-01-01"), ee.Date(str(year+1)+"-01-01"))) \
        .select('pr')\
        .sum()\
        .clip(study_area)\
        .set("date",ee.Number(year)))
    year += 1

#将list转为ImageCollection
varyCollection = ee.ImageCollection.fromImages(datalist)
trend = varyCollection.map(createTimeBand) \
    .reduce(ee.Reducer.linearFit()) #对每个像元线性回归

print(trend.getInfo())

#渲染显示
visualization = {
    'max':3,
    'min':-3,
    'palette': ['b30000','d7301f','ef6548','fc8d59','fdbb84','fdd49e','fee8c8','f7fcf0','e0f3db','ccebc5','a8ddb5','7bccc4','4eb3d3','2b8cbe','0868ac']
}
Map.addLayer(trend.select('scale'),visualization,'yearly pre trend')
# Map.centerObject(roi)
Map

结果如下:
在这里插入图片描述二者计算结果的差异比较分析:

  1. 可以看出,二者计算的结果在大的趋势上相同,均表现为东部区域降水在减少,而西部地区降水在增加。
  2. 但降水量变化量却出现较明显的差异。同一地点比如Point (110.8477, 38.0308)处,上一段代码拟合的该处像元处降水的斜率变化为-0.85,而年总量的斜率却是-12.5,二者差了1个数量级。
  3. 初步感觉年变化率为12mm/a的变化不太符合实际情况,若这样的话,10年减少了120mm,有些太夸张了。

四、小结与讨论

  1. 通过MODIS长时间序列降水量变化,探索了流域内降水的时空变化特征
  2. 应掌握ee.Reducer.linearFit()函数的用法,该函数有2个参数的产出,分别为scale(斜率)和offset(截距),可以通过scale的变化看出区域植被的演变趋势。
  3. 有待探索的问题,在利用线性模拟函数前,先对于数据进行了增加时间波段的处理,所获取的时间为metadata中system:time_start时间,对于该数值进行了以年为单位的换算,理解为将毫秒单位转换为年单位,但为何与完全按照年总降水量进行计算出来的结果有差异?问题出在哪里呢?希望评论区讨论.

参考:
  • https://developers.google.com/earth-engine/guides/ic_reducing
  • https://blog.csdn.net/alley51775/article/details/121708658?spm=1001.2014.3001.5502
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值