使用geemap提取Landsat 8点像素值存CSV时遇ee.Image类型报错求助
问题解决与代码修正
错误原因
geemap.extract_values_to_points() 函数要求输入参数为 单个 ee.Image 对象,但你传入的是 ee.ImageCollection(Landsat 影像集合)。虽然你已经用 collection.toBands() 将影像集合转换为单幅影像(每个日期的波段作为单独波段),但并未在提取时使用这个转换后的对象,导致报错。
修正后的完整代码
import os import ee import geemap # 初始化 Earth Engine ee.Initialize() Map = geemap.Map() # 加载研究区域和点要素集 india = ee.FeatureCollection("users/GEE_work/INDIA_WITH_KASHMIR") pt = ee.FeatureCollection("users/GEE_work/stations") # 构建 Landsat 8 影像集合:选择B5(NIR)和B6(SWIR),过滤日期、区域和云量 collection = ( ee.ImageCollection("LANDSAT/LC08/C02/T2_L2") .filter(ee.Filter.date('2014-01-01', '2022-12-31')) .select(['SR_B5', 'SR_B6']) .filterBounds(india) .filter(ee.Filter.lt('CLOUD_COVER', 20)) # 过滤云量<20%的影像,提升数据质量 ) # 将影像集合转换为单幅影像(每个日期的波段作为独立波段) stacked_image = collection.toBands() # 可视化参数(仅用于地图展示) vis_params = { 'min': 1, 'max': 65455, 'palette': ['FFFFFF', 'CE7E45', 'DF923D', 'F1B555', 'FCD165', '99B718', '74A901', '66A000', '529400', '3E8601', '207401', '056201', '004C00', '023B01', '012E01', '011D01', '011301'] } # 添加图层到地图 Map.addLayer(collection.median(), vis_params, "L8 NIR Median") # 用中位数合成展示 Map.addLayer(stacked_image.select('.*_SR_B5'), vis_params, "L8 NIR Time Series") Map.setCentre(79, 30, 8) Map # 设置输出目录和文件名(使用原始字符串避免转义字符问题) work_dir = os.path.expanduser(r'C:\Users\Hp\Downloads') out_csv = os.path.join(work_dir, 'L8_B5_B6_2014_22.csv') # 提取点要素的像素值到CSV geemap.extract_values_to_points(pt, stacked_image, out_csv)
关键修改说明
- 影像集合转单幅影像:使用
collection.toBands()将时间序列影像转换为单幅影像,每个波段名称包含日期(如20140101_SR_B5),确保CSV中能区分不同日期的观测值。 - 选择双波段:将
.select(['SR_B5'])改为.select(['SR_B5', 'SR_B6']),同时获取近红外和短波红外数据。 - 云量过滤:新增
.filter(ee.Filter.lt('CLOUD_COVER', 20)),排除云量过高的影像,提升数据可靠性。 - 路径修正:将文件路径改为原始字符串
r'C:\Users\Hp\Downloads',避免Windows路径中的转义字符问题。 - 地图展示优化:用
collection.median()生成中位数合成影像,更适合可视化;时间序列影像仅展示NIR波段避免图层混乱。
内容的提问来源于stack exchange,提问作者Moumita Marandi
相关产品推荐
相关产品推荐

