首页 > 解决方案 > 使用 ggplot2 在 R 中绘制连接的 sf 几何图形时出错

问题描述

我一直在使用一组网格单元的 shapefile 来制作没有问题的地图。最近,我收到了一个略有不同的网格单元 shapefile,并要求我将两者合并并重新生成相同的地图。现在我已经加入了两个 sf 对象,我无法绘制地图。

我不确定如何为此创建一个代表。shapefile 本身可在此处免费caltrawl.zip获得:ftp: //ftp.dfg.ca.gov/R7_MR/MANAGEMENT/CRFS/MAN_CA_CRFS_microblocks2013.zip

这是原始代码,绘制得很好(这只是为了将“微块”总结为感兴趣的分辨率以创建更粗/更小的对象):

microblocks <- read_sf("CRFS_microblocks/MAN_CA_CRFS_microblocks2013.shp") 

blocks1 <- microblocks %>% 
  st_buffer(0) %>% # magical function that prevents errors when combining polygons below 
  group_by(BLOCK10_ID) %>% # so it doesn't just lump into one giant polygon ... 
  mutate(
    Xmean = mean(X),
    Ymean = mean(Y)
  ) %>% 
  ungroup() %>% 
  group_by(BLOCK10_ID, Xmean, Ymean) %>% 
  summarise() %>% # should yield a sf object 
  ungroup() %>% 
  st_transform(crs="+proj=longlat +datum=NAD83") 

并且ggplot(blocks1) + geom_sf()工作正常。

但是,当我尝试加入第二个几何图形时caltrawl...

caltrawl <- read_sf("caltrawl/caltrawl.shp") %>% 
  dplyr::select(BLOCK10_ID) %>% 
blocks2 <- microblocks %>% 
  st_buffer(0) %>% # magical function that prevents errors when combining polygons below 
  group_by(BLOCK10_ID) %>% # so it doesn't just lump into one giant polygon ... 
  mutate(
    Xmean = mean(X),
    Ymean = mean(Y)
  ) %>% 
  ungroup() %>% 
  group_by(BLOCK10_ID, Xmean, Ymean) %>% 
  summarise() %>% # should yield a sf object 
  ungroup() %>% 
  dplyr::select(-Xmean, -Ymean) %>% # since we're adding more blocks 
  as.data.frame() %>% # necessary to de-sf-ify to join the other blocks
  full_join(caltrawl, by="BLOCK10_ID") %>% # full join retains blocks from both
  st_sf(sf_column_name = 'geometry.x') %>% 
  st_transform(crs="+proj=longlat +datum=NAD83")   as.data.frame()

我得到一个绘制良好的对象plot(blocks2),但是当我尝试时ggplot(blocks2) + geom_sf(),我收到以下错误:

Don't know how to automatically pick scale for object of type standardGeneric. Defaulting to continuous.
Error: Column `geometry` must be a 1d atomic vector or a list

还值得注意的是,它们都是 sf 对象,但类在某种程度上有所不同:

> class(blocks1)
[1] "sf"         "tbl_df"     "tbl"        "data.frame"
> class(blocks2)
[1] "sf"         "data.frame"

在这种情况下我做错了blocks2什么?

标签: rggplot2sf

解决方案


推荐阅读