rgee调用reduceToImage将FeatureCollection转Image报错修复方案
问题描述
- 已通过rgee提供的
fastDistanceTransform函数成功提取距最近人类聚居点的距离,计算所用原始图层为单幅影像DLR/WSF/WSF2015/v1 - 现需复用该流程计算距最近道路的距离,但道路数据集属于
FeatureCollection类型,无法直接传入距离计算函数,需先转换为影像类型 - 在GEE JavaScript编辑器中已完成格式转换逻辑验证,代码可正常运行,但在R端rgee包中复现时报错
JavaScript端可正常运行的转换代码
var dataset = ee.FeatureCollection('TIGER/2016/Roads') .map(function(feature){ var num = ee.Number.parse(feature.get('linearid')); return feature.set('linearid', num); }); var roads = dataset .reduceToImage({ properties: ['linearid'], reducer: ee.Reducer.first() }); Map.setCenter(-99.976, 40.38, 5); Map.addLayer(roads, {});
R端复现报错信息
出错的R代码
road = ee$FeatureCollection("TIGER/2016/Roads")$ map(function(feature) { num = ee$Number$parse(feature$get('linearid')) return(feature$set('linearid', num)) }) road2 = road$reduceToImage(properties=road$select('linearid'), reducer=ee$Reducer$first()) Map$addLayer(road2, {}, "road2")
返回的报错内容
Error in py_call_impl(callable, dots$args, dots$keywords) : ee.ee_exception.EEException: Collection.reduceToImage, argument 'properties': Invalid type. Expected type: List<String>. Actual type: FeatureCollection.
报错核心原因:
reduceToImage方法的properties参数期望接收元素为字符串的列表类型,实际传入的是经过select处理的FeatureCollection对象,属于参数传值类型错误,和R与JS端的对象类型自动转换逻辑无关。
修复方案
错误出在properties参数的传值:road$select('linearid')的作用是从要素集合中筛选保留linearid属性列,返回结果仍然是FeatureCollection类型,完全不符合参数要求。和JS端的['linearid']对应,R端直接传入包含目标属性名的字符向量即可,rgee会自动将其转换为Earth Engine识别的字符串列表。
修正后的可运行R代码如下:
road = ee$FeatureCollection("TIGER/2016/Roads")$ map(function(feature) { num = ee$Number$parse(feature$get('linearid')) return(feature$set('linearid', num)) }) # 修复点:properties参数直接传入属性名组成的字符向量,不要调用select方法 road2 = road$reduceToImage( properties = c('linearid'), reducer = ee$Reducer$first() ) Map$addLayer(road2, {}, "road2")
转换得到的road2为二值化道路影像,可直接传入fastDistanceTransform函数开展后续距离计算。
内容的提问来源于stack exchange,提问作者Courtney Marneweck
相关产品推荐
相关产品推荐

