GEE错误:FeatureCollection.remap()方法的一个文档与实际行为不符的问题

简介

我想使用重映射在 FeatureCollection 中创建一个新的 String 属性。由于我需要将一个 String 值重映射到另一个 String 值,所以我在 ee.FeatureCollection().remap() (‘lookupOut expects List’) 中遇到了错误。
FeatureCollection (Error)
Collection.remap, argument ‘lookupOut’: Invalid type.
Expected type: List.
Actual type: List.
Actual value: [natural, natural, developed, developed]

全部代码


// Google Earth Engine JavaScript API 错误报告
// FeatureCollection.remap() 文档说明它接受字符串和整数
// 但在使用字符串时会抛出错误

// 创建一个包含字符串属性的虚拟要素集合
var dummyFeatures = ee.FeatureCollection([
  ee.Feature(ee.Geometry.Point([0, 0]), {land_cover: 'forest', id: 1}),      // 森林
  ee.Feature(ee.Geometry.Point([1, 1]), {land_cover: 'water', id: 2}),       // 水体
  ee.Feature(ee.Geometry.Point([2, 2]), {land_cover: 'urban', id: 3}),       // 城市
  ee.Feature(ee.Geometry.Point([3, 3]), {land_cover: 'agriculture', id: 4}), // 农业
  ee.Feature(ee.Geometry.Point([4, 4]), {land_cover: 'forest', id: 5})       // 森林
]);

// 打印原始集合信息
print('原始集合大小:', dummyFeatures.size());
print('原始要素示例:', dummyFeatures.limit(3));

// 定义使用字符串的重映射列表(根据文档说明应该是支持的)
var fromListStrings = ee.List(['forest', 'water', 'urban', 'agriculture']);  // 原始值列表
var toListStrings = ee.List(['natural', 'natural', 'developed', 'developed']); // 目标值列表

print('原始列表(字符串):', fromListStrings);
print('目标列表(字符串):', toListStrings);

// 错误:根据文档这应该能工作,但实际上会抛出错误
// 文档说明:"lookupIn (List): 输入映射值。限制为字符串和整数。"
try {
  // 尝试使用字符串进行重映射
  var remappedStrings = dummyFeatures.remap(fromListStrings, toListStrings, 'land_cover');
  print('成功:字符串重映射工作正常!');
  print('使用字符串重映射的结果:', remappedStrings.limit(3));
} catch (error) {
  // 捕获并显示错误信息
  print('字符串重映射错误:', error);
}

// 解决方法:使用整数可以正常工作
var fromListInts = ee.List([1, 2, 3, 4]);    // 原始整数值列表
var toListInts = ee.List([10, 10, 20, 20]);  // 目标整数值列表

// 首先需要将字符串转换为整数
var withIntegers = dummyFeatures.map(function(feature) {
  var landCover = feature.get('land_cover');  // 获取土地覆盖类型字符串
  
  // 将字符串映射为整数值
  var intValue = ee.Algorithms.If(ee.String(landCover).compareTo('forest').eq(0), 1,        // forest -> 1
    ee.Algorithms.If(ee.String(landCover).compareTo('water').eq(0), 2,                      // water -> 2
      ee.Algorithms.If(ee.String(landCover).compareTo('urban').eq(0), 3,                    // urban -> 3
        ee.Algorithms.If(ee.String(landCover).compareTo('agriculture').eq(0), 4, 0)         // agriculture -> 4, 其他 -> 0
      )
    )
  );
  
  // 添加整数类型的土地覆盖属性
  return feature.set('land_cover_int', intValue);
});

// 使用整数重映射可以正常工作
var remappedInts = withIntegers.remap(fromListInts, toListInts, 'land_cover_int');
print('成功:整数重映射工作正常!');
print('使用整数重映射的结果:', remappedInts.limit(3));

// 期望行为:字符串和整数版本都应该能工作
// 实际行为:只有整数版本能工作
// 文档问题:说明支持字符串但实际上不支持

/*
错误总结:
1. 函数:FeatureCollection.remap(lookupIn, lookupOut, columnName)
2. 文档声称:"lookupIn (List): 输入映射值。限制为字符串和整数。"
3. 期望:字符串和整数都应该能工作
4. 实际:只有整数能工作,字符串会抛出错误
5. 影响:遵循文档的用户会遇到意外错误
6. 建议:要么修复实现以支持字符串,要么更新文档以反映仅支持整数的限制
*/

代码说明:

这段代码演示了Google Earth Engine中FeatureCollection.remap()方法的一个文档与实际行为不符的问题。主要功能包括:

问题重现:创建一个包含字符串土地覆盖类型的要素集合,尝试使用字符串进行重映射错误演示:展示使用字符串时出现的错误,尽管文档说明支持字符串解决方案:提供将字符串转换为整数后再进行重映射的变通方法对比验证:证明整数重映射可以正常工作,凸显字符串重映射的问题

这是一个典型的API文档与实现不一致的案例,代码通过实际测试验证了这个问题,并为用户提供了可行的替代方案。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
江停兔兔的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容