将geos几何转换为sf几何时报错:Not compatible with STRSXP: [type=NULL]
问题原因分析
- 几何列存在无效/空值:纽约DTM子集的原始几何可能包含空对象、自相交图形,或者在
data.table与geos转换过程中丢失了有效几何信息,导致转sf时无法识别合法的空间类型(STRSXP是R空间对象的底层存储类型,type=NULL说明没有有效几何数据)。 - 几何类型不统一:DTM数据可能混合了
POLYGON和MULTIPOLYGON类型,而nc数据集是标准单一类型,转sf时未强制统一类型会触发报错。 - CRS信息缺失:转换回
sf时没有指定坐标系,nc数据集默认携带CRS,DTM子集可能需要手动指定(纽约常用EPSG:2263)。
解决方法
- 清理无效几何
先排查并过滤掉空或无效的几何对象:
library(data.table) library(geos) library(sf) library(tmap) # 假设你的处理后data.table是dt_dtm # 标记有效/空几何 dt_dtm[, valid := geos_is_valid(geometry)] dt_dtm[, is_empty := geos_is_empty(geometry)] # 保留有效非空几何 dt_clean <- dt_dtm[valid & !is_empty]
- 统一几何为MULTIPOLYGON类型
强制将所有几何转为MULTIPOLYGON,避免类型混合:
dt_clean[, geometry := geos_cast(geometry, "MULTIPOLYGON")]
- 正确转换回sf并指定CRS
转换时明确坐标系,确保sf对象完整:
# 转回sf,指定纽约DTM常用的EPSG:2263坐标系 sf_dtm <- st_as_sf(dt_clean, sf_column_name = "geometry", crs = 2263) # 验证几何类型是否统一 unique(st_geometry_type(sf_dtm))
- 修复tmap交互视图报错
检查sf对象有效性后重新绘图:
# 确认所有几何有效 all(st_is_valid(sf_dtm)) # 重置tmap模式后绘图 tmap_mode("view") tm_shape(sf_dtm) + tm_polygons()
内容的提问来源于stack exchange,提问作者vinceroni
相关产品推荐
相关产品推荐

