简介
我想使用重映射在 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














暂无评论内容