GEE Python API map采样报Invalid GeoJSON geometry错误求解
问题根因
这个报错和你上传的Asset几何有效性无关,核心原因是Python API对ee.Algorithms.If的分支返回类型校验比网页端JS编辑器严格,你的代码存在明确的类型不匹配问题:
- 存在匹配影像时,
filtered_img.sample()的返回值是ee.FeatureCollection——哪怕采样区域是单个点,返回结果也是包含1个点要素的要素集合 - 无匹配影像时,你写的返回值是
ee.Image类型,和if分支的返回类型完全不一致
GEE执行map()操作前会做全链路类型校验,尝试将两个分支的返回值强制对齐为要素集合类型时,会尝试读取ee.Image对象的几何属性做GeoJSON解析,而你返回的自掩膜空影像没有绑定合法矢量几何,就会抛出Invalid GeoJSON geometry异常。
JS端能正常运行是因为网页编辑器做了隐式类型容错,不代表这段逻辑本身是严谨的。
修复代码
把else分支的返回值改成和if分支完全一致的ee.FeatureCollection类型,直接用输入点的几何创建一个标记isNull=True的空要素即可,修正后的完整逻辑如下:
def extract_values(feat): # 解析要素日期构造筛选时间窗 date = ee.Date.parse('YYYY-MM-dd HH:mm:ss', feat.get('date')) start = date.advance(-10, 'minute') end = date.advance(20, 'minute') # 取时间窗内第一景可用影像 filtered_img = filtered.filterDate(start, end).first() training_samps = ee.Algorithms.If( filtered_img, # 有可用影像时执行采样,返回FeatureCollection filtered_img.sample( region=feat.geometry(), scale=2000, geometries=True ).set('isNull', False), # 无可用影像时返回同类型结果,用当前点几何构造空要素 ee.FeatureCollection([ ee.Feature(feat.geometry()).set('isNull', True) ]) ) return training_samps # 注意:每个输入要素映射后返回的是子FeatureCollection,必须调用flatten()打平为单层要素集合 final_result = relatos_asset.map(extract_values).flatten()
注意事项
- 遍历
ee.FeatureCollection执行map()时,映射函数所有分支的返回值类型必须严格统一,禁止混合返回Image、Feature、FeatureCollection等不同类型的对象 - 你之前尝试手动重构Point几何不生效,是因为问题根源不在输入几何,而在返回值类型不匹配
- 必须加
flatten()操作,否则最终得到的是嵌套结构的要素集合,后续导出、计算都会触发新的类型错误。
内容的提问来源于stack exchange,提问作者Caio Atila
相关产品推荐
相关产品推荐

