使用Google Earth Engine(GEE)进行生态敏感性分析

背景

生态环境敏感性反映了人类活动对于生态环境的干扰程度,生态敏感性是衡量区域生态环境脆弱的重要指标,对区域规划发展起着重要的导向作用。目前,主流的生态敏感性评价多基于ArcGIS平台实现,其优势是简单易上手,特别是对于没有编程基础的同学,使用ArcGIS进行生态敏感性评价的流程可以参考以下资料:
ArcGIS软件制作生态敏感性
ArcGIS生态服务敏感性网格化计算并空间可视化(附练习数据下载)
GEE全称为Google Earth Engine,是美国谷歌公司开发的一款免费的遥感云计算平台,该平台集成了海量地理空间数据、相应的可视化和分析计算能力及可调用的API。依托谷歌公司的全球百万台服务器,GEE具有极强的后台处理运算能力,实现了数PB级的卫星图像和地理空间数据集目录与行星级尺度分析功能的结合。使用GEE进行生态敏感性评价有以下优点:

  1. GEE上集成了海量数据可以直接调用而无需下载
  2. 可以免去在ArcGIS中繁琐的预处理和重分类步骤
  3. 更为灵活地切换研究区和研究时间,进行长时间序列上的研究
  4. 效率更高,更加方便DeBug

实现框架

本例使用python中的geemap库实现,具体流程框架为:
Part1:导入必要的函数库并初始化GEE
Part2:定义研究区、筛选Landsat影像并执行预处理
Part3:导入NDVI、高程、坡度、土地利用、土壤基质数据并重分类
Part4:进行生态敏感性计算
Part5:进行生态敏感性分级与制图
可选:数据可视化、导出结果图像到本地

Part 1 导入函数库

import ee
import geemap
# geemap.set_proxy(port=7897)
geemap.ee_initialize()

Part 2 影像预处理

# 定义研究区
region = ee.Geometry.Rectangle([106.6833, 38.3, 108.9, 40.1833])
Map = geemap.Map(center=[39.25, 107.8], zoom=8)
Map.addLayer(region,{},'边界')

# 导入Landsat 8影像,并筛选无云影像
def applyScaleFactors(image):
    opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2)
    thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0)
    return image.addBands(opticalBands, None, True) \
        .addBands(thermalBands, None, True)

# QA波段去云
def CloudMask(image):
    cloudShadowBitMask = (1 << 4)
    cloudsBitMask = (1 << 3)
    qa = image.select('QA_PIXEL')
    mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0) \
        .And(qa.bitwiseAnd(cloudsBitMask).eq(0))
    return image.updateMask(mask) \
        .copyProperties(image) \
        .copyProperties(image, ["system:time_start"])

# 导入Landsat数据并裁剪
landsatCol = (ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")
           .filterDate('2020-07-01', '2020-08-31')
           .filterBounds(region)
           .filter(ee.Filter.lt('CLOUD_COVER', 30))
           .map(CloudMask)
           .map(applyScaleFactors))
landsat = ee.ImageCollection(landsatCol).median()

Part 3 导入评价因子并重分类

评价因子的选取及分级赋值标注可以参考相关论文,本例使用以下评价体系进行分析赋值:
在这里插入图片描述

# 计算NDVI并按区间分级
ndvi = landsat.normalizedDifference(['SR_B5', 'SR_B4']).rename('NDVI')
ndvi_classified = ndvi.expression(
    "b('NDVI') < 0 ? 9 : " +       # 第一级 [-1, 0], 赋值为9
    "b('NDVI') < 0.25 ? 7 : " +    # 第二级 [0, 0.25], 赋值为7
    "b('NDVI') < 0.5 ? 5 : " +     # 第三级 [0.25, 0.5], 赋值为5
    "b('NDVI') < 0.75 ? 3 : 1"     # 第四级 [0.5, 0.75], 赋值为3, 第五级 [0.75, 1], 赋值为1
)
# 导入DEM并分级
dem = ee.Image("USGS/SRTMGL1_003")
elevation_classified = dem.expression(
    "b('elevation') > 2153 ? 9 : " +
    "b('elevation') > 1950 ? 7 : " +
    "b('elevation') > 1700 ? 5 : " +
    "b('elevation') > 1500 ? 3 : 1"
)
# 计算坡度并分级
slope = ee.Terrain.slope(dem)
slope_classified = slope.expression(
    "b('slope') > 35 ? 9 : " +
    "b('slope') > 25 ? 7 : " +
    "b('slope') > 15 ? 5 : " +
    "b('slope') > 5 ? 3 : 1"
)
# 导入CLCD土地利用分类数据
imgPathGLB30 = 'users/studyroomGEE/LULC_Dataset/LULC_HuangXin/CLCD_v01_2020'
land_cover = ee.Image(imgPathGLB30)

# 将土地利用数据进行重分类
# 原始类别 [1:耕地, 2:林地, 3:灌丛, 4:草地, 5:水域, 6:冰/雪, 7:荒地,8:不透水面,9:湿地]
# 重分类[1:耕地,2:园地,3:林地,4:草地,5:水域,6:建设用地,7:未利用地]
land_cover_reclassified = land_cover.remap(
    [1, 2, 3, 4, 5, 9, 8, 6, 7],  # 原始类别值
    [1, 3, 2, 4, 5, 5, 6, 7, 7]   # 重分类后的值
)

# 土地利用敏感性分级
land_cover_sensitivity = land_cover_reclassified.remap(
    [7, 5, 3, 4, 1, 6],   # 重分类的值
    [9, 7, 7, 5, 3, 1]     # 敏感性赋值
)
# 导入土壤基质数据
soil_texture = ee.Image(
    "OpenLandMap/SOL/SOL_CLAY-WFRACTION_USDA-3A1A1A_M/v02").select('b0')

# 将土壤基质数据重分类为:沙质、砾质、壤质、粘质和基岩
# 基于粘土含量分类:
# 0-10: 沙质, 10-20: 砾质, 20-40: 壤质, 40-60: 粘质, 60以上: 基岩
soil_texture_reclassified = soil_texture.expression(
    "b('b0') < 10 ? 9 : " +        # 沙质
    "b('b0') < 20 ? 7 : " +        # 砾质
    "b('b0') < 40 ? 5 : " +        # 壤质
    "b('b0') < 60 ? 3 : 1"         # 粘质和基岩
)

Part 4 敏感性计算

各因子的评价权重根据层次分析法(AHP)计算出权重,具体如下所示:
在这里插入图片描述

# 将所有因子合成一个多波段影像
combined_image = ndvi_classified.rename('NDVI')\
    .addBands(elevation_classified.rename('Elevation'))\
    .addBands(slope_classified.rename('Slope'))\
    .addBands(land_cover_sensitivity.rename('LandCover'))\
    .addBands(soil_texture_reclassified.rename('SoilTexture'))

# 使用指定的权重进行加权计算生态敏感性
sensitivity = combined_image.expression(
    "(Elevation * 0.0722) + (Slope * 0.2429) + (NDVI * 0.1256) + (LandCover * 0.4683) + (SoilTexture * 0.0900)",
    {
        'Elevation': combined_image.select('Elevation'),
        'Slope': combined_image.select('Slope'),
        'NDVI': combined_image.select('NDVI'),
        'LandCover': combined_image.select('LandCover'),
        'SoilTexture': combined_image.select('SoilTexture')
    }
).rename('sensitivity')

Part 5 敏感性分级与制图

# 计算分位数(五分位数)
quantiles = sensitivity.reduceRegion(
    reducer=ee.Reducer.percentile([20, 40, 60, 80]),
    geometry=region,
    scale=30,
    maxPixels=1e9
).values()

# 获取分位数的实际值
q20, q40, q60, q80 = quantiles.getInfo()

# 使用分位数进行敏感性分级
classified_sensitivity = sensitivity.expression(
    "(sensitivity <= q20) ? 1 : " +   # 非敏感
    "(sensitivity <= q40) ? 2 : " +   # 轻度敏感
    "(sensitivity <= q60) ? 3 : " +   # 中度敏感
    "(sensitivity <= q80) ? 4 : 5",   # 极高度敏感
    {
        'sensitivity': sensitivity,
        'q20': q20,
        'q40': q40,
        'q60': q60,
        'q80': q80
    }
)

# 设置分级可视化参数
sensitivity_vis = {
    'min': 1,
    'max': 5,
    'palette': ['darkgreen', 'lightgreen', 'yellow', 'orange', 'red'],
    'legend': {
        'Non-sensitive': 'darkgreen',
        'Slightly sensitive': 'lightgreen',
        'Moderately sensitive': 'yellow',
        'Highly sensitive': 'orange',
        'Extremely sensitive': 'red'
    }
}

# 添加图层到地图
Map.addLayer(region, {}, '边界')
Map.addLayer(classified_sensitivity.clip(region), sensitivity_vis,
             'Classified Sensitivity Map')
# 显示地图
Map

可选操作(Option)

数据可视化

# Landsat可视化参数
landsat_vis_params = {
    'bands': ['SR_B4', 'SR_B3', 'SR_B2'],  # 使用Landsat的RGB波段
    'min': 0,
    'max': 0.3,
    'gamma': 1.4
}

# 重分类可视化参数
vis_params = {
    'min':1,
    'max':9,
    'palette': ['brown', 'orange', 'yellow', 'lightgreen', 'green']
}
# 可视化Landsat影像
Map.addLayer(landsat, landsat_vis_params, 'Landsat 8 (2020)')

# 可视化高程
Map.addLayer(dem, {'min': 0, 'max': 3000}, 'DEM')

# 可视化坡度
Map.addLayer(slope, {'min': 0, 'max': 45}, 'Slope')

# 可视化土地利用
Map.addLayer(land_cover_sensitivity, vis_params, 'Reclassified Land Cover')

# 可视化土壤基质
Map.addLayer(soil_texture_reclassified, vis_params, 'Soil Texture')

# 可视化重分类NDVI
Map.addLayer(ndvi_classified, vis_params, 'NDVI Classification')

# 可视化重分类高程
Map.addLayer(elevation_classified, vis_params, 'Elevation Classification')

# 可视化重分类坡度
Map.addLayer(slope_classified, vis_params, 'Slope Classification')

Map.addLayer(region, {}, '边界')
Map

导出影像到本地

# 导出生态敏感性图
sensitivity_image = sensitivity.clip(region)
geemap.download_ee_image(
    sensitivity_image,
    filename = 'sensitivity.tif',
    scale = 30,
    crs = "EPSG:4326",
    region = region
)

在这里插入图片描述

参考论文

景艳宾, 孙旭, 刘军, 等. 基于MCR模型的内蒙古鄂托克旗生态廊道构建[J/OL]. 水土保持通报, 2021, 41(2): 170-177. DOI:10.13961/j.cnki.stbctb.2021.02.023.

GitHub

https://github.com/a820936422/Earth-Code

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值