st_intersects在st_crs(x)== st_crs(y)不为TRUE时出错。

3
library(tidyverse) 
library(tigris) 
library(sf)
santacruz <- tracts("CA", "Santa Cruz")
coords_sf <- locations %>% st_as_sf(coords = c("Longitude", "Latitude"), crs=4269) 

这个应该拥有相同的CRS,但是当我尝试时

st_intersects(coords_sf, santacruz)

我遇到了一个问题:

错误:st_crs(x) == st_crs(y) 不为 TRUE

我尝试了以下方法:

st_set_crs(santacruz, 4269)
st_set_crs(coords_sf, 4269)
st_transform(santacruz, 4269)
st_transform(coords_sf, 4269)

它不起作用。我还尝试了

st_transform(santacruz, crs = "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs")

st_transform(coords_sf, crs = "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs")

无论我如何尝试设置CRS并在尝试时进行转换,都无法解决问题。
st_intersects(coords_sf, santacruz)

我遇到了一个问题:

错误:st_crs(x)== st_crs(y)不为TRUE

目前我还不能确定是设置CRS或转换还是st_intersects函数有问题。谢谢。


1
locations 是什么? - thelatemail
1
你能提供一个包含locations样本点的可重现示例吗?其中一件事是,除非你设置了全局选项,否则tigris默认不提供sf类对象,否则它将是一个SpatialPolygonsDataFrame。尝试使用tigris::tracts("CA", "Santa Cruz", class = "sf")创建santacruz对象?特别是,st_crs(santacruz)的结果是什么? - Calum You
我在写作中忘记列出它,但我有 options(tigris_class = "sf")。然而,当我添加 santacruz <- st_as_sf(santacruz) %>% st_set_crs(4269) 时,它可以工作了。之前,当我遇到错误时,我看到的是 `> st_crs(santacruz) Coordinate Reference System: EPSG: 4269 proj4string: "+proj=longlat +datum=NAD83 +no_defs"
st_crs(coords_sf) Coordinate Reference System: EPSG: 4269 proj4string: "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs"`
- Dobrowski
2个回答

7
st_set_crs(santacruz, 4269)

设置返回对象的CRS,但不替换santacruz。您需要保存它:

santacruz <- st_set_crs(santacruz, 4269)

或者采用另一种方式。
st_crs(santacruz) <- 4269 

替换CRS。

1
我没有你的位置数据,但如果我使用sf的nc数据集,这对我有效:
library(tidyverse) 
library(tigris) 
library(sf)
santacruz <- tracts("CA", "Santa Cruz")
santacruz <- st_as_sf(santacruz) %>% st_set_crs(4269)
nc <- st_read(system.file('shape/nc.shp', package = 'sf')) %>%
  st_transform(4269)
st_intersects(nc, santacruz)

#> Sparse geometry binary predicate list of length 100, where the predicate was `intersects'
#> first 10 elements:
#>  1: (empty)
#>  2: (empty)
 #> 3: (empty)
 #> 4: (empty)
 #> 5: (empty)
 #> 6: (empty)
 #> 7: (empty)
 #> 8: (empty)
 #> 9: (empty)
 #> 10: (empty)

请注意,在对santacruz对象进行st_set_crs之前,需要先执行st_as_sf操作。

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