R st_交叉点到spatialpolygon数据帧不工作

R st_交叉点到spatialpolygon数据帧不工作,r,spatial,sf,tigris,R,Spatial,Sf,Tigris,我试图得到两个形状文件的交点(位于某些大都市区域边界内的普查区域)。我能够成功获得相交特征,但是当我尝试将sf_intersect的输出转换为空间多边形数据帧时,我得到错误: “as_Spatial(from)中出错:从要素类型转换 不支持sfc_几何体到sp“ 这是我的代码: library(sf) library(dplyr) library(tigris) library(sp) #download shapefiles corresponding to metro areas met

我试图得到两个形状文件的交点(位于某些大都市区域边界内的普查区域)。我能够成功获得相交特征,但是当我尝试将sf_intersect的输出转换为空间多边形数据帧时,我得到错误:

“as_Spatial(from)中出错:从要素类型转换 不支持sfc_几何体到sp“

这是我的代码:

library(sf)
library(dplyr)
library(tigris)
library(sp)

#download shapefiles corresponding to metro areas 
metro_shapefiles<-core_based_statistical_areas(cb = FALSE, year = 2016)
#convert to sf and filter
metro_shapefiles<-st_as_sf(metro_shapefiles)%>%filter(GEOID==31080 )
#Data for California
census_tracts_california<-tracts(state="CA",year=2016)
census_tracts_california<-st_as_sf(census_tracts_california)

#INTERSECT AND CONVERT BACK TO SP
census_tracts_intersected1<-st_intersection(census_tracts_california,
                                            metro_shapefiles)

#back to spatial
census_tracts_intersected1<-as(census_tracts_intersected1,"Spatial")
库(sf)
图书馆(dplyr)
图书馆(底格里斯)
图书馆(sp)
#下载地铁区域对应的形状文件

metro_形状文件错误消息告诉您无法将
sfc_几何体
转换为
空间
对象。没有
sp
等效对象

在相交结果中,您有一个混合的几何体(因此,您将返回一个
sfc_几何体
作为您的“几何体”)。您可以在此处看到所有几何图形:

types <- vapply(sf::st_geometry(census_tracts_intersected1), function(x) {
    class(x)[2]
}, "")

unique(types)
# [1] "POLYGON"         "MULTILINESTRING" "MULTIPOLYGON"
在这种情况下,这将提供一个单一的对象类型

types <- vapply(sf::st_geometry(sf_join), function(x) {
  class(x)[2]
}, "")

unique(types)
# [1] "MULTIPOLYGON"

## so you can convert to a Spatial object
spPoly <- as(sf_join, "Spatial")

类型错误消息非常清楚。无法将
sfc
对象转换为
sp
。使用
st_join
代替,它返回一个
sf
对象,而不是
sfc
另外,为什么需要
sp
对象
sf
超过了
sp
。如果答案足够清楚,我就不会在这里了,不是吗?我之所以执行交集(如名称所示)也是因为我对获取位于另一个对象边界内的多边形感兴趣;使用union,您可以获得所有特征,无论它们是否相交。
class(census\u tracts\u intersected1)
返回
“sf”数据。frame“
因此,
st\u intersection
的结果似乎是一个
sf
对象,而不是
sfc
。这使得错误信息和之前的评论变得如此清晰。。。顺便说一句,对于与不支持
sf
@Gilles的包的交互,转换回
sp
仍然是必要的-是的,你是对的-我指的是几何列-我不清楚。非常有用的回答,谢谢!是否可以强制交点仅返回多边形或多多边形,以使结果与sp直接兼容?如果我理解清楚,您在之前的评论中建议,这应该可以通过
st_join
实现。我尝试了
res@Gilles我不确定将
LINESTRING
转换为
POLYGON
是否有意义,因为它们是不同的,这会导致结果不正确。另外,请参见我的编辑。我试着添加更多的信息,希望它能让唤醒更多地思考一种方法,要求函数删除线条(就像你在回答中“手动”做的那样),而不是将它们转换成多边形。由于尺寸标注
st_交叉点
不会更改几何图形,因此此交叉点没有问题。当您需要对几何图形执行操作,并且结果是多边形、线条等的混合时,就会出现问题。@SYMBOLXAU AFAIK,在
sf
(以及POSTGIS)中,
st_相交
仅检查两个(或更多)特征在2D中是否相交。它返回一个稀疏(默认)或密集矩阵,告诉您每个x几何体与哪个y几何体相交
st_交叉口
而是“计算”交叉口并返回新的几何图形。@lbusett-这很有意义-感谢您的解释。
sf_join <- sf::st_join(census_tracts_california, metro_shapefiles, join = st_intersects)
types <- vapply(sf::st_geometry(sf_join), function(x) {
  class(x)[2]
}, "")

unique(types)
# [1] "MULTIPOLYGON"

## so you can convert to a Spatial object
spPoly <- as(sf_join, "Spatial")