Добавление точек к фигурам geom_sf не работает при добавлении проекции - PullRequest
0 голосов
/ 13 февраля 2020

Когда я пытаюсь добавить слой точек к слою geom_sf() и проекции, точки оказываются в одном месте в Южном Техасе. Ниже приведен минимальный пример воспроизведения этой проблемы.

library(sf)
library(ggplot2)
# devtools::install_github("hrbrmstr/albersusa")
library(albersusa)
crs_use = "+proj=laea +lat_0=30 +lon_0=-95"

d_points = data.frame(long = c(-110, -103, -84), 
                      lat  = c(45, 40, 41))

A = ggplot(data = usa_sf()) +
  geom_sf() + 
  geom_point(data = d_points, 
             aes(x = long, y = lat), 
             color = "red", size = 5) + 
  theme_minimal() + 
  ggtitle("(A) right point position, wrong projection")

B = ggplot(data = usa_sf()) +
  geom_sf() + 
  geom_point(data = d_points, 
             aes(x = long, y = lat), 
             color = "red", size = 5) + 
  coord_sf(crs = crs_use) + 
  theme_minimal() + 
  ggtitle("(B) right projection, wrong points using geom_point()")

C = ggplot() + 
  geom_sf(data = usa_sf()) + 
  geom_sf(data = st_as_sf(d_points,
                          coords = c("long", "lat"), crs = crs_use), 
          color = "red", size = 5) + 
  coord_sf(crs = crs_use) + 
  theme_minimal() + 
  ggtitle("(C) right projection, wrong points using geom_sf() points")

cowplot::plot_grid(A, B, C, nrow = 3)

enter image description here

Я хочу добавить слой точек на карту США с пользовательской проекцией. Однако всякий раз, когда я использую проекцию, указанные мной точки становятся странным местоположением в юго-восточном Техасе, которого нет в указанном мной месте.

Любые предложения по решению этой проблемы приветствуются. Спасибо!

1 Ответ

3 голосов
/ 13 февраля 2020

Вам также необходимо перепроектировать ваши очки; sf::st_transform() должен выполнить эту работу.

У меня нет доступа к пакету {albersusa}, поэтому я использую {USABoundaries}, чтобы получить карту нижних 48, но это не главное; точка применяет st_transform(crs = crs_use) к обоим вашим пространственным объектам перед построением.

library(sf)
library(ggplot2)
library(USAboundaries)

crs_use <- "+proj=laea +lat_0=30 +lon_0=-95"

usa_sf <- us_boundaries(type="state", resolution = "low") %>% 
  dplyr::filter(!state_abbr %in% c("PR", "AK", "HI")) %>% 
  st_transform(crs = crs_use)

d_points <- data.frame(long = c(-110, -103, -84), 
                      lat  = c(45, 40, 41)) %>% 
  st_as_sf(coords = c("long", "lat"), crs = 4326) %>% 
  st_transform(crs = crs_use)

ggplot(data = usa_sf) +
  geom_sf() + 
  geom_sf(data = d_points, 
             color = "red", size = 5) + 
  theme_minimal()

enter image description here

...