当使用“st_write”导出一个sf对象时,如何消除“Error in CPL_write_ogr”错误?

mwngjboj  于 2023-02-27  发布在  其他
关注(0)|答案(1)|浏览(118)

我正在尝试交叉美国的两个sf对象(一个在乡镇级别,另一个在人口普查区域级别)。我将同时使用tigristidycensys。我的最终目标是拥有一个包含乡镇级别信息的唯一***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(对象、数据集名称、图层、驱动程序、作为.字符(数据集选项)、:写入错误”

有人知道如何解决这个问题吗?我已经尝试了这么多的方法,我发现在谷歌,但没有一个为我工作。提前非常感谢!!!

dldeef67

dldeef671#

您可以使用函数st_collection_extract并从几何列中仅获取多边形类型,然后可以继续并再次使用st_write

df <- st_collection_extract(final_df, type = "POLYGON")
st_write(df, "Input_Intermediate/final_df.shp",  delete_layer = TRUE)

相关问题