我正在尝试交叉美国的两个sf对象(一个在乡镇级别,另一个在人口普查区域级别)。我将同时使用tigris
和tidycensys
。我的最终目标是拥有一个包含乡镇级别信息的唯一***sf对象***(具有来自原始乡镇和人口普查区域级别SF对象的信息)。并且在我完成这个交集之后,我想使用sf
包中的st_write
导出这个sf对象,下面是我使用的代码:
library(tigris)
library(sf)
library(purrr)
library(tidycensus)
library(tidyr)
library(dplyr)
##Data at township level
#---------------------------#
MN_Township_SHP <- county_subdivisions("Minnesota", cb = TRUE)%>% st_transform(., crs=32618)
MN_Township_SHP$County <- substr(MN_Township_SHP$NAMELSADCO,1,nchar(MN_Township_SHP$NAMELSADCO)-7)
Dataset <- MN_Township_SHP
#Data at census tract level
#---------------------------#
Sys.getenv("CENSUS_API_KEY")
my_vars <-
c(total_pop = "B01003_001",
race_denominator = "B02001_001", #Total
white = "B02001_002")
mn <- unique(fips_codes$state)[24]
MN_CensusTract_SHP <-map_df(mn, function(x) {
get_acs(geography = "tract",
geometry = T,
variables = my_vars,
state = mn) })
MN_CensusTract_SHP <- MN_CensusTract_SHP %>% dplyr::select(-moe)
Social_Dat <-
MN_CensusTract_SHP %>%
as.data.frame() %>%
pivot_wider(names_from = variable,
values_from = c(estimate)) %>%
dplyr::mutate(year=2021) %>%
dplyr::rename_all(funs(paste0("ACS_", .)))
Social_Dat$ACS_year <- as.double(Social_Dat$ACS_year)
Social_Dat$ACS_GEOID <- as.double(Social_Dat$ACS_GEOID)
Social_Dat <- st_as_sf(Social_Dat, sf_column_name = 'ACS_geometry')%>% st_transform(., crs=32618)
#Intersection between township and census tract levels
#---------------------------#
final_df <- st_intersection(Dataset, Social_Dat, all=TRUE)
#Export sf object as shapefile
#---------------------------#
st_write(final_df, "Input_Intermediate/final_df.shp", delete_layer = TRUE)
但是,当我运行这最后一步时,我得到了以下错误:
“CPL_write_ogr(对象、数据集名称、图层、驱动程序、作为.字符(数据集选项)、:写入错误”
有人知道如何解决这个问题吗?我已经尝试了这么多的方法,我发现在谷歌,但没有一个为我工作。提前非常感谢!!!
1条答案
按热度按时间dldeef671#
您可以使用函数st_collection_extract并从几何列中仅获取多边形类型,然后可以继续并再次使用st_write。