解决此错误:“无法转换缺少crs的sfc对象”

3

我试图在整个美国的州范围内概述一组特定的人口普查区域。

这是我试图运行的代码:

sf_states <- sf::st_as_sf(fifty_states, coords = c("long", "lat")) %>%
  group_by(id, piece) %>%
  summarize(do_union = FALSE) %>%
  st_cast("POLYGON") %>%
  ungroup()

illinois <- sf_states %>%
  filter(id == "illinois")

arlington.crs <- arlington.test %>%
  st_set_crs(4326)

ggplot() +
  theme_minimal() +
  geom_sf(data = illinois) +
  geom_sf(data = arlington.crs, col = "green", alpha = 0, size = 2)
arlington.test 数据来自于 tidycensus 包,包含每个人口普查区域的相关几何信息。

然而,当我运行代码时,出现以下错误:

Error in st_transform.sfc(st_geometry(x), crs, ...) : 
  cannot transform sfc object with missing crs

我尝试了StackOverflow上的许多不同答案,但似乎没有任何答案能够使其正常工作。
更奇怪的是,我可以单独运行两个geom_sf函数和ggplot,它们都可以正常绘图。只有当我试图将它们一起运行时,就像上面的ggplot代码一样,才会出现错误。
还有其他想法/建议吗?
提前感谢。
编辑(回答下面的问题):
> sf::st_crs(arlington.test)
Coordinate Reference System:
  User input: NAD83 
  wkt:
GEOGCRS["NAD83",
    DATUM["North American Datum 1983",
        ELLIPSOID["GRS 1980",6378137,298.257222101,
            LENGTHUNIT["metre",1]]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS["latitude",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433]],
        AXIS["longitude",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433]],
    ID["EPSG",4269]]
> 

1
我刚刚对原帖进行了编辑,以包含那些信息(在原帖中阅读比在评论中发布更容易)。 - bcongelio
2个回答

3

您的arlington.test对象似乎处于EPSG:4269中;您尝试通过sf::st_set_crs(4326)将其覆盖为WGS 84。您确定您的意思不是sf::st_transform(4326)吗?

最好保留设置crs的情况,只有当您确定CRS格式错误/不正确时才使用它(当*.shp形状文件中的*.prj丢失时可能会发生此情况)。这不是{tidycensus}数据的典型用例。

要从一个已知CRS投影更改为另一个CRS,sf::st_transform()效果最佳。


0
函数 polygon_from_extent() 似乎已经弃用并且会丢失 CRS 信息。您可以编写自己的函数来解决此问题,并创建具有 CRS 的多边形:
# Function to replace 'polygon_from_extent()'
my_polygon_from_extent <- function(x, my_crs){
  x <- FedData:::template_to_sf(x)
  sf::st_crs(x)<-my_crs
  x <- sf:::st_bbox(x)
  x <- sf:::st_as_sfc(x)
  return(x)
}

# Polygon shape you want to build
my_extent <- raster::extent(
  as.numeric(
    sf::st_bbox(dat)[c("xmin","xmax","ymin","ymax")] +
      c(-.05,.05,-.05,.05)
  )
)

# Assign appropriate CRS
my_polygon <- my_polygon_from_extent(my_extent, 4326)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接