• AI Earth ——开发者模式案例3:典型植被指数计算及区域统计


    典型植被指数计算及区域统计

    对检索的影像(以 Landsat-8 为例),通过波段运算计算常见的指数。并以归一化植被指数( NDVI )为例,进行区域均值统计以及时序折线图制作。

    初始化环境

    1. import aie
    2. aie.Authenticate()
    3. aie.Initialize()

    典型光谱指数算法

    定义典型指数计算方法。使用 aie.Image.add 、 aie.Image.subtract 、 aie.Image.multiply 和 aie.Image.divide 实现影像波段运算。另外可使用 aie.Image.normalizedDifference 实现两个波段的归一化差值运算 (Band1-Band2)/(Band1+Band2) ,使用 aie.Image.expression 可实现构建表达式对影像进行波段运算。

    如切换卫星数据源,需要调整对应的波段名称。

    1. # 比值植被指数
    2. def getRVI(image):
    3. nir = image.select(['SR_B5'])
    4. red = image.select(['SR_B4'])
    5. rvi = nir.divide(red)
    6. return rvi.rename(['RVI'])
    7. # 增强型植被指数
    8. def getEVI(image):
    9. evi = image.expression(
    10. '(2.5 * (nir - red)) /(nir + 6 * red - 7.5 * blue + 1)',
    11. {
    12. 'nir': image.select(['SR_B5']),
    13. 'red': image.select(['SR_B4']),
    14. 'blue': image.select(['SR_B2'])
    15. }).rename('EVI')
    16. return evi
    17. # 归一化植被指数
    18. def getNDVI(image):
    19. ndvi = image.normalizedDifference(['SR_B5', 'SR_B4']).rename(['NDVI'])
    20. return ndvi
    21. # 近红外植被指数
    22. def getNIRv(image):
    23. nir = image.select(['SR_B5'])
    24. nirv = nir.multiply(image.normalizedDifference(['SR_B5', 'SR_B4'])).rename('NIRv')
    25. return nirv
    26. # 土壤调整植被指数
    27. def getSAVI(image):
    28. nir = image.select(['SR_B5'])
    29. red = image.select(['SR_B4'])
    30. savi = ((nir.subtract(red)).multiply(aie.Image.constant(1.5))).divide((nir.add(red)).add(aie.Image.constant(0.5))).rename('SAVI')
    31. return savi
    32. # 归一化水体指数
    33. def getNDWI(image):
    34. ndwi = image.normalizedDifference(['SR_B3', 'SR_B5']).rename('NDWI')
    35. return ndwi

    Landsat-8 数据检索

    指定区域、时间、云量检索 Landsat-8 ,并对数据进行去云处理。

    1. region = aie.FeatureCollection('China_Province') \
    2. .filter(aie.Filter.eq('province', '浙江省')) \
    3. .geometry()
    1. def l8Collection(startdate, enddate):
    2. images = aie.ImageCollection('LANDSAT_LC08_C02_T1_L2') \
    3. .filterBounds(region) \
    4. .filterDate(startdate, enddate)
    5. return images
    1. def removeLandsatCloud(image):
    2. cloudShadowBitMask = (1 << 4)
    3. cloudsBitMask = (1 << 3)
    4. qa = image.select('QA_PIXEL')
    5. mask = qa.bitwiseAnd(aie.Image(cloudShadowBitMask)).eq(aie.Image(0)).And(qa.bitwiseAnd(aie.Image(cloudsBitMask)).eq(aie.Image(0)))
    6. return image.updateMask(mask)
    1. lc8_collection = l8Collection('2021-08-01', '2021-08-31')
    2. lc8_collection.map(removeLandsatCloud)
    3. print(lc8_collection.size().getInfo())
    4. lc8_img = lc8_collection.max()

    NDVI 计算及可视化

    以 NDVI 计算为例输出指数计算成果,并地图可视化展示。

    1. ndvi = getNDVI(lc8_img)
    2. ndvi_vis = {
    3. 'min': -0.2,
    4. 'max': 0.6,
    5. 'palette': [
    6. '#2B83BA', '#ABDDA4', '#FFFFBF', '#FDAE61', '#D7191C'
    7. ]
    8. }
    9. map = aie.Map(
    10. center=ndvi.getCenter(),
    11. height=800,
    12. zoom=5
    13. )
    14. map.addLayer(
    15. ndvi,
    16. ndvi_vis,
    17. 'NDVI',
    18. bounds=ndvi.getBounds()
    19. )
    20. map
     
    

    NDVI 区域统计

    使用中国市级行政区划数据,按照市域范围对 NDVI 进行均值统计。使用 aie.Image.reduceRegions 和 aie.Reducer.mean 实现对影像进行指定区域范围均值统计。 当在较大范围内执行 ReduceRegion 或者 ReduceRegions 函数时,可能存在较为耗时的情况。开发者根据实际需求调整 scale单位:米),scale 越大,耗时越少。

    通过引用 Python 的 pyplot 绘制浙江各地市区域 NDVI 均值统计图。

    1. zone = aie.FeatureCollection('China_City') \
    2. .filter(aie.Filter.eq('province', '浙江省'))
    3. zone_mean = ndvi.reduceRegions(zone, aie.Reducer.mean(), 1000)
    4. zone_info = zone_mean.getInfo()
    5. x_list = []
    6. y_list = []
    7. for feature in zone_info['features']:
    8. x_list.append(feature['properties']['city'])
    9. y_list.append(feature['properties']['NDVI_mean'])
    10. # print(x_list)
    11. # print(y_list)
    12. from bqplot import pyplot as plt
    13. plt.figure(1, title='2021年浙江省各市NDVI均值统计')
    14. plt.bar(x_list, y_list) #colors=['MediumSeaGreen']
    15. plt.show()

    杭州市宁波市温州市嘉兴市湖州市绍兴市金华市衢州市舟山市台州市丽水市00.020.040.060.080.10.120.140.160.180.20.220.240.260.282021年浙江省各市NDVI均值统计

     

    NDVI时间序列分析

    在指定空间范围内实现时间序列统计分析,并绘制折线图。

    1. def doSeries(start_time, end_time, zone):
    2. lc8_col = l8Collection(start_time, end_time)
    3. lc8_col.map(removeLandsatCloud)
    4. lc8_img = lc8_col.mosaic()
    5. ndvi = getNDVI(lc8_img)
    6. return ndvi.reduceRegion(aie.Reducer.mean(), zone, 1000)
    7. zone = aie.FeatureCollection('China_City') \
    8. .filter(aie.Filter.eq('province', '浙江省')) \
    9. .geometry()
    10. x_ndvi_series = []
    11. y_ndvi_series = []
    12. year = '2021'
    13. mon = ['01','02','03','04','05','06','07','08','09','10','11','12']
    14. lday = ['31','28','31','30','31','30','31','31','30','31','30','31']
    15. for i in range(0,12):
    16. startdate = year + '-' + mon[i] + '-01'
    17. enddate = year + '-' + mon[i] + '-' + lday[i]
    18. lc8_ndvi_mon = doSeries(startdate, enddate , zone)
    19. x_ndvi_series.append(mon[i] + '月')
    20. y_ndvi_series.append(lc8_ndvi_mon.getInfo()['NDVI_mean'])
    21. # print(x_ndvi_series)
    22. # print(y_ndvi_series)
    23. from bqplot import pyplot as plt
    24. plt.figure(2, title='2021年浙江省逐月NDVI均值统计')
    25. plt.plot(x_ndvi_series, y_ndvi_series)
    26. plt.show()

    01月02月03月04月05月06月07月08月09月10月11月12月0.060.080.10.120.140.160.180.20.220.242021年浙江省逐月NDVI均值统计

     

     

    影像输出

    1. task = aie.Export.image.toAsset(ndvi, 'NDVI', 30)
    2. task.start()

    参考文献:

    Zeng, Y., Hao, D., Huete, A. et al. Optical vegetation indices for monitoring terrestrial ecosystems globally. Nat Rev Earth Environ 3, 477–493 (2022). Optical vegetation indices for monitoring terrestrial ecosystems globally | Nature Reviews Earth & Environment

  • 相关阅读:
    数据结构-堆排序Java实现
    LeetCode 2678. 老人的数目
    关于一个数组的小细节
    Vue全家桶 Vuex的详细介绍
    数据结构——深度优先遍历(DFS)无向非连通图
    SpringBoot OSS实战之用户头像上传
    pdf转换工具
    WCF Demo
    PDF打印 PDFPrinting.Net v5.2.7.0 Crack
    mybatis数据批量更新
  • 原文地址:https://blog.csdn.net/qq_31988139/article/details/127599377