运行exact_extract出现Unsupported geometry type报错如何解决?
问题描述
运行exact_extract(rasterlayer, sf_object)代码时收到如下报错:
in CPP_exact_extract(x, weights, wkb, default_value, default_weight, : Unsupported geometry type.
使用其他参数几乎一致的sf对象运行相同代码可正常执行,仅当前sf对象触发报错。
报错原因
exact_extract对输入的sf几何类型有严格校验,触发该报错的常见原因包括:
- sf对象内包含混合几何类型,或者存在
GEOMETRYCOLLECTION类型的几何 - 几何携带Z/M三维/度量维度信息,低版本
exactextractr包不支持带额外维度的几何 - sf对象中存在空几何或者无效几何
排查步骤
- 查看sf对象的几何类型分布:运行
table(st_geometry_type(sf_object))确认是否有异常类型 - 检查空几何数量:运行
sum(st_is_empty(sf_object)) - 检查几何维度:运行
st_geometry(sf_object)查看坐标维度是否为XY,是否带Z/M后缀 - 检查几何有效性:运行
sum(!st_is_valid(sf_object))确认无效几何数量
解决方案
- 存在混合几何/
GEOMETRYCOLLECTION时,提取所需的单一类型几何即可:
例如需要保留面要素时运行sf_object <- st_collection_extract(sf_object, type = "POLYGON"),按需替换type参数为POINT/LINESTRING即可 - 几何带Z/M维度时,删除额外维度:
运行sf_object <- st_zm(sf_object, drop = TRUE) - 存在空几何时过滤空值:
运行sf_object <- sf_object[!st_is_empty(sf_object), ] - 存在无效几何时先修复:
运行sf_object <- st_make_valid(sf_object)
内容的提问来源于stack exchange,提问作者vn2021
相关产品推荐
相关产品推荐

