Google Earth Engine:使用地图遍历实现逐年筛选卫星影像

82 篇文章 ¥59.90 ¥99.00
本文介绍如何利用Google Earth Engine JavaScript API,设置地图区域和时间范围,加载Landsat 8卫星数据,按年遍历筛选影像,并进行可视化,以进行时间序列分析和地理空间分析。

介绍
Google Earth Engine(简称GEE)是一个强大的云平台,用于存储、处理和分析地理空间数据。它提供了丰富的卫星影像和地理数据集,以及一系列强大的分析工具。本文将介绍如何使用Google Earth Engine的JavaScript API,通过地图遍历实现逐年筛选卫星影像的功能。

步骤

  1. 设置地图区域和时间范围
    首先,我们需要设置地图的区域和时间范围。在下面的代码中,我们选择了一个矩形区域(经度范围:-180至180,纬度范围:-90至90),并设置了时间范围为2000年至2020年。
// 设置地图区域
var region = ee.Geometry.Rectangle({
   
   
  coords:
<think>好的,我需要帮助用户解决如何使用Google Earth Engine (GEE)计算1990到2024年指定区域水体面积的变化,并生成逐年MNDWI影像的问题。首先,我得回想一下GEE的基本操作和相关指数计算方法。 用户提到的是MNDWI,也就是改进的归一化水体指数。记得MNDWI的公式是使用绿光波段和短波红外波段(SWIR)的差值除以它们的和,即$MNDWI = \frac{Green - SWIR}{Green + SWIR}$。这有助于区分水体和建筑物,比NDWI效果更好。需要确认在GEE中各卫星数据对应的波段名称,比如Landsat的绿光波段通常是'B3',而SWIR可能是'B6'或'B7',不同卫星版本可能不同。 接下来是数据选择的问题。时间范围是1990-2024年,可能需要用到Landsat 5、7、8和9的数据。需要注意不同卫星的可用时间范围,比如Landsat 5在1990年可用,而Landsat 8从2013年开始。因此,用户需要合并多个数据集,并处理不同卫星之间的波段差异,尤其是SWIR波段的位置变化。例如,Landsat 5的SWIR可能是B5,而Landsat 8的SWIR是B6或B7,需要统一波段名称以便计算MNDWI。 然后是去云处理。GEE通常使用预处理的QA波段或像素质量波段来去除云和云影。比如,对于Landsat 8的Surface Reflectance数据,可以使用'QA_PIXEL'波段进行云掩膜。可能需要编写一个函数来为每个影像应用云掩膜,并过滤掉云量较高的影像。此外,不同卫星的云掩膜方法可能不同,需要分别处理。 时间序列分析部分,用户需要逐年生成MNDWI影像并统计水体面积。这里可能需要按年份循环,每年合成该年的影像(比如中值合成),计算MNDWI,然后通过阈值法提取水体。水体面积的统计可以通过将二值图像(水体为1,非水体为0)的区域统计来实现使用ee.Reducer.sum()乘以像元面积得到总面积。 代码结构方面,可能需要先定义研究区域,比如用户上传的矢量边界或手动绘制的几何区域。然后按年份循环,从1990到2023年(因为2024年可能数据不全),针对每个年份选择合适的Landsat数据集,进行去云处理,合成影像,计算MNDWI,应用阈值,统计面积,并将结果保存到表格或地图中。 阈值的选择可能需要用户根据实际情况调整,通常MNDWI大于0被认为是水体,但不同地区可能有差异。建议用户查看直方图或进行样本点测试确定最佳阈值。 最后,导出结果,比如将时间序列的水体面积导出为CSV,或导出每年的MNDWI影像Google Drive。同时,可能需要可视化,比如用GEE的ui.Chart来展示面积变化趋势。 需要注意的是,处理长时间序列数据时,不同卫星间的辐射一致性可能需要校正,或者用户可以选择使用已经过大气校正的地表反射率产品,如Landsat的SR数据。 可能用户还需要了解如何上传自己的研究区域,比如使用Assets上传Shapefile,或者在代码中通过坐标点定义几何区域。此外,GEE的计算资源和导出限制也需要考虑,特别是处理大区域或长时间序列时,可能需要分块处理或使用批处理导出。 总结步骤大致如下: 1. 定义研究区域。 2. 遍历1990-2023年每年数据。 3. 对每年选择合适的Landsat数据集,处理云掩膜。 4. 合成年度影像,计算MNDWI。 5. 应用阈值提取水体,统计面积。 6. 导出结果或可视化。 现在需要将这些步骤转化为具体的GEE JavaScript代码,因为用户请求的是代码实现步骤。可能需要处理不同Landsat版本的兼容问题,例如使用ee.Algorithms.Landsat.simpleComposite()或者手动合并不同数据集。 可能遇到的问题包括不同年份数据缺失(如Landsat 7的条带错误)、云覆盖过高导致合成影像不准确,以及阈值选择的区域差异。因此,代码中需要包含数据可用性的检查,比如过滤掉云量过高的年份,或者使用多个影像的中值来减少云的影响。 此外,生成逐年MNDWI影像可能需要将每年的计算结果作为图像集合导出,供后续分析使用。统计面积时,像元的大小需要根据数据的投影来确定,或者使用ee.Image.pixelArea()来获取每个像元的面积,从而准确计算总面积。 现在,将这些思路整理成结构化的步骤和代码示例,确保语法正确,并给出相关解释,帮助用户理解每个部分的作用。同时,提醒用户可能需要调整的参数,如阈值、研究区域、云掩膜参数等。</think>以下是如何在Google Earth Engine (GEE) 中计算1990-2024年水体面积变化并生成逐年MNDWI影像的完整实现方案: ### 一、MNDWI计算原理 改进的归一化差异水体指数公式: $$ \text{MNDWI} = \frac{\text{Green} - \text{SWIR}}{\text{Green} + \text{SWIR}} $$ 其中: - Landsat 5/7的Green波段为B2,SWIR为B5 - Landsat 8/9的Green波段为B3,SWIR为B6[^1] ### 二、完整代码实现 ```javascript // 1. 定义研究区域(替换为你的AOI) var aoi = ee.Geometry.Rectangle([116.0, 39.0, 117.0, 40.0]); // 2. 创建年份序列 var startYear = 1990; var endYear = 2023; // 2024年数据可能不完整 var years = ee.List.sequence(startYear, endYear); // 3. 定义MNDWI计算函数 function calculateMNDWI(image) { var mndwi = image.normalizedDifference( (image.select('Green').subtract(image.select('SWIR'))) .divide(image.select('Green').add(image.select('SWIR'))) ).rename('MNDWI'); return image.addBands(mndwi); } // 4. 定义年度处理函数 var annualMNDWI = years.map(function(year) { year = ee.Number(year); // 选择对应年份的Landsat数据集 var collection = ee.ImageCollection( ee.Algorithms.If(year.lt(1999), 'LANDSAT/LT05/C02/T1_L2', ee.Algorithms.If(year.lt(2013), 'LANDSAT/LE07/C02/T1_L2', ee.Algorithms.If(year.lt(2021), 'LANDSAT/LC08/C02/T1_L2', 'LANDSAT/LC09/C02/T1_L2'))) ); // 预处理波段 var prep = function(image) { var opticalBands = (image.select('SR_B.').multiply(0.0000275).add(-0.2)); var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0); return image.addBands(opticalBands, null, true) .addBands(thermalBands, null, true); }; // 时间过滤和云掩膜 var filtered = ee.ImageCollection(collection) .filterDate(ee.Date.fromYMD(year, 1, 1), ee.Date.fromYMD(year.add(1), 1, 1)) .filterBounds(aoi) .map(prep) .map(function(img) { var qa = img.select('QA_PIXEL'); var cloud = qa.bitwiseAnd(1 << 3).or(qa.bitwiseAnd(1 << 4)); return img.updateMask(cloud.not()); }); // 合成年度影像 var composite = filtered.median().clip(aoi); // 统一波段命名 var green = composite.select( ee.Algorithms.If(year.lt(2013), 'SR_B2', 'SR_B3') ).rename('Green'); var swir = composite.select( ee.Algorithms.If(year.lt(2013), 'SR_B5', 'SR_B6') ).rename('SWIR'); var withBands = composite.addBands(green).addBands(swir); // 计算MNDWI var mndwiImg = calculateMNDWI(withBands); // 水体提取(阈值可调整) var water = mndwiImg.select('MNDWI').gt(0.2); // 计算水域面积(平方公里) var area = water.multiply(ee.Image.pixelArea()) .reduceRegion({ reducer: ee.Reducer.sum(), geometry: aoi, scale: 30, maxPixels: 1e13 }).get('MNDWI'); return ee.Feature(null, { 'year': year, 'area': area, 'MNDWI_image': mndwiImg.select('MNDWI') }); }); // 5. 结果处理 var resultCollection = ee.FeatureCollection(annualMNDWI); // 6. 可视化参数 var visParams = {min: -1, max: 1, palette: ['red', 'blue']}; // 7. 显示结果 Map.centerObject(aoi, 8); Map.addLayer(aoi, {color: 'yellow'}, 'Study Area'); years.evaluate(function(yrs) { yrs.forEach(function(y) { var feature = ee.Feature(resultCollection.filter(ee.Filter.eq('year', y)).first()); var img = ee.Image(feature.get('MNDWI_image')); Map.addLayer(img, visParams, 'MNDWI '+y); }); }); // 8. 导出面积数据 Export.table.toDrive({ collection: resultCollection.select(['year', 'area']), description: 'WaterArea_Export', fileFormat: 'CSV' }); // 9. 导出影像示例(导出单年) Export.image.toDrive({ image: ee.Image(ee.Feature(resultCollection.first()).get('MNDWI_image')), description: 'MNDWI_1990', region: aoi, scale: 30, maxPixels: 1e13 }); ``` ### 三、关键步骤说明 1. **数据选择**:自动切换不同Landsat卫星数据集: - 1990-1999: Landsat 5 - 1999-2013: Landsat 7 - 2013-2021: Landsat 8 - 2021+: Landsat 9 2. **辐射校正**:使用USGS提供的比例因子(0.0000275)和偏移量(-0.2)进行辐射校正[^2] 3. **云掩膜**:通过QA_PIXEL波段识别云(第3、4位)并进行掩膜 4. **水体提取**:使用经验阈值0.2,建议根据实际情况调整 5. **面积计算**:利用`ee.Image.pixelArea()`计算实际面积,精度达平方公里级 ### 四、使用建议 1. **阈值优化**:通过`MNDWI`直方图分析确定最佳阈值 ```javascript var histogram = ui.Chart.image.histogram({ image: mndwiImg.select('MNDWI'), region: aoi, scale: 30, maxPixels: 1e7 }); print(histogram); ``` 2. **异常值处理**:添加数据完整性检查 ```javascript var count = filtered.size(); print('Year '+year.getInfo()+': '+count.getInfo()+' scenes'); ``` 3. **时间序列分析**:可视化面积变化趋势 ```javascript var chart = ui.Chart.feature.byFeature(resultCollection, 'year', 'area') .setChartType('LineChart') .setOptions({ title: 'Water Area Variation', hAxis: {title: 'Year'}, vAxis: {title: 'Area (sq.km)'} }); print(chart); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值