前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >利用GEE计算遥感生态指数(RSEI)

利用GEE计算遥感生态指数(RSEI)

作者头像
Twcat_tree
发布于 2023-10-16 11:02:31
发布于 2023-10-16 11:02:31
1.9K01
代码可运行
举报
文章被收录于专栏:二猫の家二猫の家
运行总次数:1
代码可运行

城市生态与人类生活息息相关,快速 、准确 、客 观地了解城市生态状况已成为生态领域的一个研究重点 。基于遥感技术,提出一个完全基于遥感技术 ,以自然因子为主的遥感生态指数 (RSEI)来对城市的生态状况进行快速监测与评价 。该指数利用主成分分析技术集成了植被指数 、湿度分量、地表温度和建筑指数等 4个评价指标,它们分别代表了绿度、湿度、热度和干度等4大生态要素。 本文基于GEE平台,实现RSEI算法。 运行结果:

第一步:定义研究区,自行更换自己的研究区 第二步:加载数据集,定义去云函数 第三步:主函数,计算生态指标 第四步:PCA融合,提取第一主成分 第五步:利用PC1,计算RSEI,并归一化

完整代码

代码如下(示例):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 第一步:定义研究区,自行更换自己的研究区
var roi = 
    /* color: #98ff00 */
    /* displayProperties: [
      {
        "type": "rectangle"
      }
    ] */
    ee.Geometry.Polygon(
        [[[120.1210075098537, 35.975189051414006],
          [120.1210075098537, 35.886229778229115],
          [120.25764996590839, 35.886229778229115],
          [120.25764996590839, 35.975189051414006]]], null, false);
          
Map.centerObject(roi);
 
// 第二步:加载数据集,定义去云函数
function removeCloud(image){
  var qa = image.select('BQA')
  var cloudMask = qa.bitwiseAnd(1 << 4).eq(0)
  var cloudShadowMask = qa.bitwiseAnd(1 << 8).eq(0)
  var valid = cloudMask.and(cloudShadowMask)
  return image.updateMask(valid)
}

// 数据集去云处理
var L8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA')
           .filterBounds(roi)
           .filterDate('2018-01-01', '2019-12-31')
           .filterMetadata('CLOUD_COVER', 'less_than',50)
           .map(function(image){
                    return image.set('year', ee.Image(image).date().get('year'))                           
                  })
           .map(removeCloud)
 

// 影像合成
var L8imgList = ee.List([])
for(var a = 2018; a < 2020; a++){
   var img = L8.filterMetadata('year', 'equals', a).median().clip(roi)
   var L8img = img.set('year', a)
   L8imgList = L8imgList.add(L8img)
 }

// 第三步:主函数,计算生态指标
var L8imgCol = ee.ImageCollection(L8imgList)
                 .map(function(img){
                      return img.clip(roi)
                   })
                 
L8imgCol = L8imgCol.map(function(img){
  
  // 湿度函数:Wet
  var Wet = img.expression('B*(0.1509) + G*(0.1973) + R*(0.3279) + NIR*(0.3406) + SWIR1*(-0.7112) + SWIR2*(-0.4572)',{
       'B': img.select(['B2']),
       'G': img.select(['B3']),
       'R': img.select(['B4']),
       'NIR': img.select(['B5']),
       'SWIR1': img.select(['B6']),
       'SWIR2': img.select(['B7'])
     })   
  img = img.addBands(Wet.rename('WET'))
  
  
  // 绿度函数:NDVI
  var ndvi = img.normalizedDifference(['B5', 'B4']);
  img = img.addBands(ndvi.rename('NDVI'))
  
  
  // 热度函数:lst 直接采用MODIS产品
  var lst = ee.ImageCollection('MODIS/006/MOD11A1').map(function(img){
                return img.clip(roi)
           })
           .filterDate('2014-01-01', '2019-12-31')
  
  var year = img.get('year')
  lst=lst.filterDate(ee.String(year).cat('-01-01'),ee.String(year).cat('-12-31')).select(['LST_Day_1km', 'LST_Night_1km']);
      
  // reproject主要是为了确保分辨率为1000
  var img_mean=lst.mean().reproject('EPSG:4326',null,1000);
  //print(img_mean.projection().nominalScale())
  
  img_mean = img_mean.expression('((Day + Night) / 2)',{
      'Day': img_mean.select(['LST_Day_1km']),
      'Night': img_mean.select(['LST_Night_1km']),
       })
  img = img.addBands(img_mean.rename('LST'))
  
  
  // 干度函数:ndbsi = ( ibi + si ) / 2
  var ibi = img.expression('(2 * SWIR1 / (SWIR1 + NIR) - (NIR / (NIR + RED) + GREEN / (GREEN + SWIR1))) / (2 * SWIR1 / (SWIR1 + NIR) + (NIR / (NIR + RED) + GREEN / (GREEN + SWIR1)))', {
      'SWIR1': img.select('B6'),
      'NIR': img.select('B5'),
      'RED': img.select('B4'),
      'GREEN': img.select('B3')
    })
  var si = img.expression('((SWIR1 + RED) - (NIR + BLUE)) / ((SWIR1 + RED) + (NIR + BLUE))', {
      'SWIR1': img.select('B6'),
      'NIR': img.select('B5'),
      'RED': img.select('B4'),
      'BLUE': img.select('B2')
    }) 
  var ndbsi = (ibi.add(si)).divide(2)
  return img.addBands(ndbsi.rename('NDBSI'))
})
 
 
var bandNames = ['NDVI', "NDBSI", "WET", "LST"]
L8imgCol = L8imgCol.select(bandNames)
 
//定义归一化函数:归一化
var img_normalize = function(img){
      var minMax = img.reduceRegion({
            reducer:ee.Reducer.minMax(),
            geometry: roi,
            scale: 1000,
            maxPixels: 10e13,
        })
      var year = img.get('year')
      var normalize  = ee.ImageCollection.fromImages(
            img.bandNames().map(function(name){
                  name = ee.String(name);
                  var band = img.select(name);
                  return band.unitScale(ee.Number(minMax.get(name.cat('_min'))), ee.Number(minMax.get(name.cat('_max'))));
                    
              })
        ).toBands().rename(img.bandNames()).set('year', year);
        return normalize;
}
var imgNorcol  = L8imgCol.map(img_normalize);
 
 
// 第四步:PCA融合,提取第一主成分
var pca = function(img){
      
      var bandNames = img.bandNames();
      var region = roi;
      var year = img.get('year')
      // Mean center the data to enable a faster covariance reducer
      // and an SD stretch of the principal components.
      var meanDict = img.reduceRegion({
            reducer:  ee.Reducer.mean(),
            geometry: region,
            scale: 1000,
            maxPixels: 10e13
        });
      var means = ee.Image.constant(meanDict.values(bandNames));
      var centered = img.subtract(means).set('year', year);
      
      
      // This helper function returns a list of new band names.
      var getNewBandNames = function(prefix, bandNames){
            var seq = ee.List.sequence(1, 4);
            //var seq = ee.List.sequence(1, bandNames.length());
            return seq.map(function(n){
                  return ee.String(prefix).cat(ee.Number(n).int());
              });      
        };
      
      // This function accepts mean centered imagery, a scale and
      // a region in which to perform the analysis.  It returns the
      // Principal Components (PC) in the region as a new image.
      var getPrincipalComponents = function(centered, scale, region){
            var year = centered.get('year')
            var arrays = centered.toArray();
        
            // Compute the covariance of the bands within the region.
            var covar = arrays.reduceRegion({
                  reducer: ee.Reducer.centeredCovariance(),
                  geometry: region,
                  scale: scale,
                  bestEffort:true,
                  maxPixels: 10e13
              });
            
            // Get the 'array' covariance result and cast to an array.
            // This represents the band-to-band covariance within the region.
            var covarArray = ee.Array(covar.get('array'));
            
            // Perform an eigen analysis and slice apart the values and vectors.
            var eigens = covarArray.eigen();
        
            // This is a P-length vector of Eigenvalues.
            var eigenValues = eigens.slice(1, 0, 1);
            // This is a PxP matrix with eigenvectors in rows.
            var eigenVectors = eigens.slice(1, 1);
        
            // Convert the array image to 2D arrays for matrix computations.
            var arrayImage = arrays.toArray(1)
            // Left multiply the image array by the matrix of eigenvectors.
            var principalComponents = ee.Image(eigenVectors).matrixMultiply(arrayImage);
        
            // Turn the square roots of the Eigenvalues into a P-band image.
            var sdImage = ee.Image(eigenValues.sqrt())
            .arrayProject([0]).arrayFlatten([getNewBandNames('SD',bandNames)]);
        
            // Turn the PCs into a P-band image, normalized by SD.
            return principalComponents
            // Throw out an an unneeded dimension, [[]] -> [].
            .arrayProject([0])
            // Make the one band array image a multi-band image, [] -> image.
            .arrayFlatten([getNewBandNames('PC', bandNames)])
            // Normalize the PCs by their SDs.
            .divide(sdImage)
            .set('year', year);
        }
        
        // Get the PCs at the specified scale and in the specified region
        img = getPrincipalComponents(centered, 1000, region);
        return img;
  };
  
var PCA_imgcol = imgNorcol.map(pca)
 
Map.addLayer(PCA_imgcol.first(), {"bands":["PC1"]}, 'pc1')
 
// 第五步:利用PC1,计算RSEI,并归一化
var RSEI_imgcol = PCA_imgcol.map(function(img){
        img = img.addBands(ee.Image(1).rename('constant'))
        var rsei = img.expression('constant - pc1' , {
             constant: img.select('constant'),
             pc1: img.select('PC1')
         })
        rsei = img_normalize(rsei)
        return img.addBands(rsei.rename('rsei'))
    })
print(RSEI_imgcol)
 
var visParam = {
    palette: '040274, 040281, 0502a3, 0502b8, 0502ce, 0502e6, 0602ff, 235cb1, 307ef3, 269db1, 30c8e2, 32d3ef, 3be285, 3ff38f, 86e26f, 3ae237, b5e22e, d6e21f, fff705, ffd611, ffb613, ff8b13, ff6e08, ff500d, ff0000, de0101, c21301, a71001, 911003'
 };
 
Map.addLayer(RSEI_imgcol.first().select('rsei'), visParam, 'rsei')
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
GEE基于Landsat 8数据反演绿度/热度/湿度/干度,并计算生态遥感指数代码分享
//导入自己的研究区,将其定义为roi var star_date = '2018-01-01'//定义起始时间 var end_date = '2018-12-30'//定义终止时间 var L8_SR = ee.ImageCollection("LANDSAT/LC08/C01/T1_SR")//加载L8_SR影像 var img_SR = L8_SR.filterBounds(roi) .filterDate(star_date, end_date) .f
气象学家
2022/01/18
3.1K1
【GEE】基于PCA的LANDSAT 8计算遥感生态指数(RSEI)
Twcat_tree
2024/04/08
5710
【GEE】基于PCA的LANDSAT 8计算遥感生态指数(RSEI)
【GEE】时间序列多源遥感数据随机森林回归预测|反演|验证|散点图|完整代码
分类和回归之间的主要区别在于,在分类中,我们的预测目标是离散的类别,而在回归中,预测目标是连续的预测值。
Twcat_tree
2023/12/08
3K1
【GEE】时间序列多源遥感数据随机森林回归预测|反演|验证|散点图|完整代码
GEE实现图像随机森林分类
对图像进行土地利用分类,因此下面是监督分类的流程以及代码案例。 1.首先分类最开始应该建立样本数据集,在这里我分了四类,然后就开始自己的采样,设立好分类后,对目标进行分类。
Twcat_tree
2023/01/30
1.7K0
GEE:获取sentinel2指定区域多个单景影像的值(样本点提取)
本教程的主要目的是获取指定单景影像,然后获取指定波段的影像值,按照获取指定波段的影像进行值提取至点,因为这里暂时没有好的方法对哨兵数据的具体属性值进行提取,所以在筛选哨兵影像的时候,需要手动获取每一景影像的id,然后按照单一影像多波段的组合来实现整体的值提取至点,这里的需要提前准备好你所需提取的矢量数据集合.
此星光明
2024/02/02
4690
GEE:获取sentinel2指定区域多个单景影像的值(样本点提取)
PIE-Engine APP:广东省生态遥感指数研究
本文以广东省为研究区,分别计算NDBSI\WET\NDVI\LST各个指数的的计算后遥感生态指数。本文使用的影像是MODIS影像(USGS/MOD09A1/006、USGS/MOD11A2/006、USGS/MOD13A1/006)然后利用QA波段进行去云,然后通过影像集合进行影像筛选和相关去云操作,然后设定可视化参数,之后就是计算每一个指数的参数以及可视化参数。最后我们将chart图表的样式进行设定,然后导出影像。本文所需的函数
此星光明
2024/02/02
2330
PIE-Engine APP:广东省生态遥感指数研究
GEE 更新和优化:利用GEE在线处理1985-2024年NDVI、EVI、SAVI、NDMI等指数归一化教程!(Landsat C02 数据)
本次的归一化教程,优化了数据去云,预处理等过程,同事将landsat 5/7/8集合分别进行了数据整合,也就是原始波段的处理,从而我们可以调用1985-至今任何一个时期的影像进行归一化处理。具体的原文介绍 请看原始的博客
此星光明
2024/09/02
7230
GEE 更新和优化:利用GEE在线处理1985-2024年NDVI、EVI、SAVI、NDMI等指数归一化教程!(Landsat C02 数据)
【GEE学习笔记】Landsat 8的NDVI指数计算
根据植被的光谱特性,将卫星可见光和近红外波段进行组合,形成了各种植被指数。植被指数是对地表植被状况的简单、有效和经验的度量,目前已经定义了40多种植被指数,广泛地应用在全球与区域土地覆盖、植被分类和环境变化,第一性生产力分析,作物和牧草估产、干旱监测等方面;并已经作为全球气候模式的一部分被集成到交互式生物圈模式和生产效率模式中;且被广泛地用于诸如饥荒早期警告系统等方面的陆地应用;植被指数还可以转换成叶冠生物物理学参数。
郭好奇同学
2021/05/28
5.5K0
【GEE学习笔记】Landsat 8的NDVI指数计算
利用GEE(Google Earth Engine)在线处理NDVI、EVI、SAVI、NDMI等指数归一化教程!
以上部分各指数的计算过程我就不一一解释了,因为指数就是波段运算的结果,自己进行公式表达就行了。
此星光明
2024/02/01
1.2K0
利用GEE(Google Earth Engine)在线处理NDVI、EVI、SAVI、NDMI等指数归一化教程!
利用GEE对季节性地物进行分类的代码实现
首先,制作一个包含多波段的影像,每个波段作为随机森林分类器的一个feature输入,提升feature的丰富度以保证分类精度。
Twcat_tree
2023/11/04
5110
利用GEE对季节性地物进行分类的代码实现
PIE-engine APP 教程 ——太湖生态环境智能监测系统
本次开发教程是基于太湖生态环境智能监测系统,这个我们首先预加载我们所选的研究区,这次研究区是在太湖研究区,首秀按需要转化为几何,预加载持续时间,颜色图层预设,波段(MODIS、Landsat的QA波段去云函数)去云效果,然后UI界面的设定,这个界面非常长,所以设定了很多label标签、复选框、按钮和textbox,当然每一个部分都在一个面板,最后就是程序的嵌套和各个部分的,本此APP主要分为三个部分:第一部分就是太湖湖泊的监测、第二部分是基于Landsat数据月季年监测、第三部分太湖周围生态监测,最后是其它功能监测,这里每一个部分其实所用到的数据基本上上是相互独立的,这样有利于减少云计算的过程,减少运算压力。每一个部分都可以拿出来单独的使用,每一个部分都是一个单独的APP。
此星光明
2024/02/02
3720
PIE-engine APP 教程 ——太湖生态环境智能监测系统
【GEE】7、利用GEE进行遥感影像分类【随机森林分类】
图像分类 人类自然倾向于将空间信息组织成组。从上面,我们识别出常见的地貌,如湖泊和河流、建筑物和道路、森林和沙漠。我们将这种具有相似特征的对象分组称为“图像分类”。但在全球范围内手动对对象进行分类和赋值将是一项无休止的任务。值得庆幸的是,使用遥感数据将不同的景观特征划分为分类类别已成为过去 40 年生态研究的主要内容。从农业发展和土地覆盖变化,到造林实践和污染监测,所有领域都进行了分类。
Twcat_tree
2023/11/08
1.9K0
【GEE】7、利用GEE进行遥感影像分类【随机森林分类】
Google Earth Engine(GEE)——用填充后的Landsat7影像进行LST地表温度计算(C值转化为K值)
很多时候我们在长时间序列的研究中会忽略使用Landsat7 因为充满条带,而且在使用的时候我们因为需要填充,所以比较麻烦,但是我们今天使用一个填充函数来快速实现后,然后进行下一步ndvi和LST的计算。
此星光明
2024/02/02
6600
Google Earth Engine(GEE)——用填充后的Landsat7影像进行LST地表温度计算(C值转化为K值)
GEE 案例:利用sentinel-2数据计算的NDVI指数对比植被退化情况
NDVI(Normalized Difference Vegetation Index,归一化植被指数)是通过计算红外波段和可见光波段的反射值之间的差异来评估植被的状况。利用NDVI指数可以监测植被的退化情况。
此星光明
2024/09/19
1.2K0
GEE 案例:利用sentinel-2数据计算的NDVI指数对比植被退化情况
Google Earth Engine(GEE)——提取指定矢量集合中的NDVI值并附时间属性
本教程的主要目的是实现影像转化为数组,然后我们需要直到其转化为的数组的轴,然后根据轴的信息进行切片,切片后完成时间属性的标准转化,这里一定要对影像结果提取完成后再对矢量集合进行操作,最后就可以提取指定的属性信息。
此星光明
2024/02/02
6330
GEE教程:利用sentinel-2数据进行ndwi和ndci指数的计算和下载
NDWI(Normalized Difference Water Index,归一化差异水体指数)和NDCI(Normalized Difference Chlorophyll Index,归一化差异叶绿素指数)都是一种利用遥感影像数据来评估特定地物或地表类型的指数。
此星光明
2024/09/25
4250
GEE教程:利用sentinel-2数据进行ndwi和ndci指数的计算和下载
GEE 案例:如何利用Landsat 8 数据和NDWI指数来计算指定区域的水域面积
这里我们进行影像的水域面积计算,这里出了影像预处理后,最主要的过程就是如何进行像素面积计算,另外,如何利用统计函数来进行sum来统计整个像素内的面积是多少。
此星光明
2024/09/13
5530
GEE 案例:如何利用Landsat 8 数据和NDWI指数来计算指定区域的水域面积
Google Earth Engine(GEE)——当我们遇到色差问题应该如何处理?
这里的这个代码是有问题的,本来代码的本意是想去除条带,可以他采取的做法却是利用mean或者median等方式来进行,这只是影像聚合的一种方式,并不是通过改变影像的DN值来改变影像的的色调,所以我们可以先看下面的代码,然后回给大家在文章末尾提供两个直方图匹配的修复方案!
此星光明
2024/02/02
2520
Google Earth Engine(GEE)——当我们遇到色差问题应该如何处理?
GEE代码实例教程详解:植被状况指数(VCI)与干旱监测
在本篇博客中,我们将使用Google Earth Engine (GEE) 进行植被状况指数(Vegetation Condition Index, VCI)的计算和干旱监测。通过MODIS NDVI数据,我们可以评估2001年至2024年间的植被状况和干旱等级。
Twcat_tree
2024/07/09
5280
GEE代码条带问题——sentinel-1接缝处理的问题
我有兴趣确定 NDVI 损失最大的年份。我创建了一个函数来收集所有陆地卫星图像并应用预处理。当我导出结果以识别 NDVI 损失最大年份时,生成的数据产品与陆地卫星场景足迹有可怕的接缝线。造成这种情况的原因是什么以及如何调整代码?
此星光明
2024/03/08
2950
GEE代码条带问题——sentinel-1接缝处理的问题
推荐阅读
GEE基于Landsat 8数据反演绿度/热度/湿度/干度,并计算生态遥感指数代码分享
3.1K1
【GEE】基于PCA的LANDSAT 8计算遥感生态指数(RSEI)
5710
【GEE】时间序列多源遥感数据随机森林回归预测|反演|验证|散点图|完整代码
3K1
GEE实现图像随机森林分类
1.7K0
GEE:获取sentinel2指定区域多个单景影像的值(样本点提取)
4690
PIE-Engine APP:广东省生态遥感指数研究
2330
GEE 更新和优化:利用GEE在线处理1985-2024年NDVI、EVI、SAVI、NDMI等指数归一化教程!(Landsat C02 数据)
7230
【GEE学习笔记】Landsat 8的NDVI指数计算
5.5K0
利用GEE(Google Earth Engine)在线处理NDVI、EVI、SAVI、NDMI等指数归一化教程!
1.2K0
利用GEE对季节性地物进行分类的代码实现
5110
PIE-engine APP 教程 ——太湖生态环境智能监测系统
3720
【GEE】7、利用GEE进行遥感影像分类【随机森林分类】
1.9K0
Google Earth Engine(GEE)——用填充后的Landsat7影像进行LST地表温度计算(C值转化为K值)
6600
GEE 案例:利用sentinel-2数据计算的NDVI指数对比植被退化情况
1.2K0
Google Earth Engine(GEE)——提取指定矢量集合中的NDVI值并附时间属性
6330
GEE教程:利用sentinel-2数据进行ndwi和ndci指数的计算和下载
4250
GEE 案例:如何利用Landsat 8 数据和NDWI指数来计算指定区域的水域面积
5530
Google Earth Engine(GEE)——当我们遇到色差问题应该如何处理?
2520
GEE代码实例教程详解:植被状况指数(VCI)与干旱监测
5280
GEE代码条带问题——sentinel-1接缝处理的问题
2950
相关推荐
GEE基于Landsat 8数据反演绿度/热度/湿度/干度,并计算生态遥感指数代码分享
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验