Google Earth Engine合并ee.FeatureCollection时如何保留原有属性?
问题根因
你当前的写法是将type、status属性设置在了FeatureCollection集合对象的层面,而非集合内包含的单个Feature要素上。merge()方法只会合并两个集合中的要素,不会自动把集合层面的属性继承到要素上,因此合并后查看要素时看不到对应属性。
方法1:创建集合时直接将属性挂载到Feature上(推荐)
创建FeatureCollection时,先给单个Feature设置属性,再封装为集合,合并后属性自然会保留,示例代码如下:
var trees = ee.FeatureCollection( ee.Feature(ee.Geometry.Point([-122.22599, 37.17605])) .set('type','Sycamore') .set('status', 'dead') ); var trees2 = ee.FeatureCollection( ee.Feature(ee.Geometry.Point([-125.3456, 38.16578])) .set('type','Aspen') .set('status','alive') ); var treesMerge = trees.merge(trees2); print(treesMerge);
方法2:已设置集合层面属性的补救方案
如果不方便修改之前的集合创建代码,可以先遍历集合,把集合层面的属性同步到每个要素上,再执行合并操作:
// 你原先的集合定义 var trees = ee.FeatureCollection(ee.Geometry.Point([-122.22599, 37.17605])).set('type','Sycamore').set('status', 'dead'); var trees2 = ee.FeatureCollection(ee.Geometry.Point([-125.3456, 38.16578])).set('type','Aspen').set('status','alive'); // 定义工具函数:将集合的所有属性复制到内部每个要素上 function copyCollectionPropsToFeatures(collection) { // 获取集合所有属性的键值对 var propKeys = collection.propertyNames(); var propValues = propKeys.map(function(key) { return collection.get(key); }); var propDict = ee.Dictionary.fromLists(propKeys, propValues); // 遍历所有要素赋值 return collection.map(function(feature) { return feature.set(propDict); }); } // 处理后合并 var treesMerge = copyCollectionPropsToFeatures(trees).merge(copyCollectionPropsToFeatures(trees2)); print(treesMerge);
如果你使用R语言的rgee包实现该逻辑,只需要将JS的链式调用替换为rgee的$调用语法即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Alexis Moyer
相关产品推荐
相关产品推荐

