博主您好,我想请教个问题
我通过python端口的gee想用哨兵2号数据6-10月的影像数据,提取出来ndvi的时间序列,我是这样做的,筛选出影像集之后,去云,在知乎找的插值代码应用到每一张影像里,最后tobands,但是可视化的时候显示内存过载,我查询了一下我研究区的哨兵2影像,在6~10月有1500多景,为什么这么多呀,我应该怎么处理?
dxal = geemap.Map(center=[51.87,124.36],zoom=6,height=500)
dxal.add_basemap('ROADMAP')
#载入矢量数据集
data = r'C:\Users\R6meg\Desktop\UTF8\bianjie.shp'
sl = geemap.shp_to_ee(data)
dxal.addLayer(sl,{},'DXAL')
# 依据字段筛选矢量数据
data1 = r'C:\Users\R6meg\Desktop\UTF8\yangdi.shp'
yd = geemap.shp_to_ee(data1)
dxal.addLayer(yd,{},'DXALYD')
# 载入Sentinel2影像
S2 = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED")
# 根据矢量边界与日期筛选影像
S2_2022 = S2.filterBounds(sl).filterDate('2022-06-01','2022-10-01')
#载入哨兵2云处理影像
S2_Clouds = ee.ImageCollection('COPERNICUS/S2_CLOUD_PROBABILITY')
S2_Clouds_2022 = S2_Clouds.filterBounds(sl).filterDate('2022-06-01','2022-10-01')
###############################################编写去云函数
def maskEdges(s2_img):
return s2_img.updateMask(s2_img.select('B8A').mask()
.updateMask(s2_img.select('B9').mask()))
def maskClouds(img):
clouds = ee.Image(img.get('cloud_mask')).select('probability')
isNotCloud = clouds.lt(5)#最大云概率为5
return img.updateMask(isNotCloud).set('system:time_start', img.get('system:time_start'))
################################################
S2_2022_image = S2_2022.map(maskEdges)
################################################
s2SrWithCloudMask_2022 = ee.Join.saveFirst('cloud_mask').apply(**{
"primary": S2_2022_image,
"secondary": S2_Clouds_2022,
"condition": ee.Filter.equals(**{
"leftField": "system:index",
"rightField":"system:index"})
})
s2CloudMasked = ee.ImageCollection(s2SrWithCloudMask_2022) \
.map(maskClouds)
############################################################################################哨兵2数据插值合成
########################################################################添加时间波段
def func_zar(image):
timeImage = image.metadata('system:time_start').rename('timestamp')
timeImageMasked = timeImage.updateMask(image.mask().select(0))
return image.addBands(timeImageMasked)
s2CloudMasked = s2CloudMasked.map(func_zar)
#############定义筛选器
days = 30
millis = ee.Number(days).multiply(1000*60*60*24)
maxDiffFilter = ee.Filter.maxDifference(**{
'difference': millis,
'leftField': 'system:time_start',
'rightField': 'system:time_start'
})
lessEqFilter = ee.Filter.lessThanOrEquals(**{
'leftField': 'system:time_start',
'rightField': 'system:time_start'
})
greaterEqFilter = ee.Filter.greaterThanOrEquals(**{
'leftField': 'system:time_start',
'rightField': 'system:time_start'
})
filter1 = ee.Filter.And(maxDiffFilter, lessEqFilter)
join1 = ee.Join.saveAll(**{
'matchesKey': 'after',
'ordering': 'system:time_start',
'ascending': False})
join1Result = join1.apply(**{
'primary': s2CloudMasked,
'secondary': s2CloudMasked,
'condition': filter1
})
filter2 = ee.Filter.And(maxDiffFilter, greaterEqFilter)
join2 = ee.Join.saveAll(**{
'matchesKey': 'before',
'ordering': 'system:time_start',
'ascending': True})
join2Result = join2.apply(**{
'primary': join1Result,
'secondary': join1Result,
'condition': filter2
})
def interpolateImages(image):
image = ee.Image(image)
beforeImages = ee.List(image.get('before'))
beforeMosaic = ee.ImageCollection.fromImages(beforeImages).mosaic()
afterImages = ee.List(image.get('after'))
afterMosaic = ee.ImageCollection.fromImages(afterImages).mosaic()
t1 = beforeMosaic.select('timestamp').rename('t1')
t2 = afterMosaic.select('timestamp').rename('t2')
t = image.metadata('system:time_start').rename('t')
timeImage = ee.Image.cat([t1, t2, t])
timeRatio = timeImage.expression('(t - t1) / (t2 - t1)', {
't': timeImage.select('t'),
't1': timeImage.select('t1'),
't2': timeImage.select('t2'),
})
interpolated = beforeMosaic.add((afterMosaic.subtract(beforeMosaic).multiply(timeRatio)))
result = image.unmask(interpolated)
return result.copyProperties(image, ['system:time_start'])
interpolatedCol = ee.ImageCollection(join2Result.map(interpolateImages))
##########################################################################################################
def addNDVI(image):
ndvi = image.normalizedDifference(['B8', 'B4']).rename('ndvi')
return image.addBands(ndvi)
ndvi_vis = {
'min':0,
'max':1,
'bands':['ndvi']
}
# def visualizeImage(image):
# return image.select('ndvi').visualize(ndviVis).clip(sl)
s2_NDVI = s2CloudMasked.map(addNDVI)
# .map(visualizeImage)
s2_NDVI_completion = interpolatedCol.map(addNDVI)
# .map(visualizeImage)
NDVI = s2_NDVI.select('ndvi').toBands()
s2_image_collection = s2_NDVI.median()
NDVI_i = s2_image_collection.select('ndvi')
NDVI_months = s2_NDVI_completion.select('ndvi').toBands()
dxal.addLayer(NDVI_i,{},'NDVI_i')
# dxal.addLayer(NDVI_months,{},'NDVI_months')
dxal