geemap提取栅格像素值时如何处理同像素重叠采样点
geemap提取Landsat栅格值时单像素多点去重方案
使用geemap的extract_values_to_points()函数从Landsat栅格影像提取波段值时,存在多个采样点落在同一像素内的情况,会生成多条携带相同波段值的重复记录,需要实现每个像素仅提取一次值,优先支持像素内随机选一个采样点保留、过滤其余同像素点。

核心解决逻辑:不要直接将原始采样点集传入提取函数,先基于目标影像的原生投影计算每个采样点对应的像素唯一ID,按ID分组去重后再执行值提取,具体实现代码如下:
import ee import geemap import random # 初始化GEE,已初始化可跳过 geemap.ee_initialize() # ------------------- 替换为你自己的数据源 ------------------- # 目标Landsat影像 target_image = ee.Image("LANDSAT/LC08/C02/T1_L2/LC08_123032_20210515") # 原始采样点要素集 raw_sample_fc = ee.FeatureCollection("你的采样点资源路径/本地加载的矢量点") # 提取结果输出路径 output_csv = "./landsat_pixel_value.csv" # ---------------------------------------------------------- # 1. 获取目标影像的投影与分辨率,用于计算采样点所属像素ID # 选一个30m分辨率的可见光波段取投影即可,和Landsat有效分辨率匹配 img_proj = target_image.select("SR_B2").projection() img_scale = img_proj.nominalScale() def add_pixel_identifier(feature): """为每个采样点添加所属像素的唯一ID字段""" # 将点坐标转换到影像原生投影下,计算对应像素行列号 transformed_coords = feature.geometry().transform(img_proj, 1).coordinates() pixel_x = transformed_coords.get(0).divide(img_scale).floor().int() pixel_y = transformed_coords.get(1).divide(img_scale).floor().int() # 行列号拼接为唯一像素ID return feature.set("pixel_id", pixel_x.format("%d").cat("_").cat(pixel_y.format("%d"))) fc_with_pixelid = raw_sample_fc.map(add_pixel_identifier) # 2. 按像素ID分组,每组随机保留1个采样点 # 给所有点添加0-1区间的随机数列,指定seed可复现随机结果,不需要可删除seed参数 fc_with_rand = fc_with_pixelid.randomColumn(seed=random.randint(1, 10000)) # 分组聚合:按pixel_id分组,每组取随机值最小的点对应的几何信息 grouped_result = fc_with_rand.reduceColumns( reducer=ee.Reducer.min(2).group(groupField=1, groupName="pixel_id"), selectors=["random", "pixel_id", ".geo"] ).get("groups") def rebuild_feature(group): """将分组聚合结果转换回标准要素对象""" group_dict = ee.Dictionary(group) return ee.Feature(group_dict.get(".geo"), {"pixel_id": group_dict.get("pixel_id")}) # 得到去重后的采样点集 dedup_sample_fc = ee.FeatureCollection(ee.List(grouped_result).map(rebuild_feature)) # 3. 用去重后的点集提取波段值,无重复记录 geemap.extract_values_to_points(dedup_sample_fc, target_image, output_csv)
注意事项
- 如果你的目标影像做过裁剪、重投影、重采样等二次处理,一定要用处理完成后的最终影像对象获取投影,不要直接用原始Landsat数据集的投影,否则像素ID计算会错位,导致去重失效。
- 如果不需要随机选点,仅需每个像素保留任意一个点即可,可删除添加随机列的步骤,分组时直接取每组第一个点,运行速度更快。
- 去重后的点集可以直接用
geemap.ee_export_vector()导出为shp/geojson格式,方便后续校验去重效果。
内容的提问来源于stack exchange,提问作者Feesh
相关产品推荐
相关产品推荐

