Я использовал шейп-файл из набора ячеек сетки, чтобы создавать карты без проблем. Недавно мне дали немного другой шейп-файл ячеек сетки и попросили объединить их и заново сгенерировать те же карты. Теперь, когда я соединил два sf-объекта, я не могу получить карту для построения.
Я не уверен, как создать представление для этого. Сами шейп-файлы свободно доступны как caltrawl.zip
и CRFS/MAN_CA_CRFS_microblocks2013.zip
здесь: ftp: //ftp.dfg.ca.gov/R7_MR/MANAGEMENT/
Вот оригинальный код, который хорошо отображается (это просто для суммирования "микроблоков" до разрешения, представляющего интерес для создания более крупного / меньшего объекта):
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
случае?