You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

geemap提取栅格像素值时如何处理同像素重叠采样点

geemap提取Landsat栅格值时单像素多点去重方案

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

单像素内包含多个采样点的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:54:19