gee萌新 2023-04-04 15:17 采纳率: 50%
浏览 54
已结题

geemap,提取某区域哨兵2数据ndvi时间序列特征的问题

博主您好,我想请教个问题
我通过python端口的gee想用哨兵2号数据6-10月的影像数据,提取出来ndvi的时间序列,我是这样做的,筛选出影像集之后,去云,在知乎找的插值代码应用到每一张影像里,最后tobands,但是可视化的时候显示内存过载,我查询了一下我研究区的哨兵2影像,在6~10月有1500多景,为什么这么多呀,我应该怎么处理?

img

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

  • 写回答

2条回答 默认 最新

  • 此星光明 云计算领域优质创作者 2023-04-04 18:44
    关注

    一般就是运行超限,你可以不同展示照片来完成这个过程,你可以下载影像在本地查看,这是目前最好的解决方案

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 已采纳回答 4月11日
  • 创建了问题 4月4日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来