У меня есть набор данных точек широты / долготы, которые стремятся преобразовать в простой объект (sf) в R. Моя цель - нанести эти местоположения на карту США с полигонами, полученными из библиотеки urbnmapr.

Построение графика с географической привязкой, как показано в коде, приводит к отображению всех точек.

Когда точки строятся с помощью geom_sf (), они оказываются в Южной Дакоте. Кажется, что точки широты / долготы не преобразуются в правильную систему координат, несмотря на то, что я считаю правильным использованием функции st_as_sf ().

Какое исправление необходимо внести в этот код, чтобы правильно показать распределение местоположений ветряных турбин на карте США? Текущий результат карты

# Map the locations of US Wind Turbines
library(urbnmapr)
library(ggplot2)
library(readr)
library(dplyr)
library(sf)

# This file is available from https://eerscmap.usgs.gov/uswtdb/assets/data/uswtdbCSV.zip
turbine <- read_csv("C:\\mydir\\uswtdb_v3_1_20200717.csv")

# Convert lat/long to a sf
turbine_sf <- turbine %>%
  st_as_sf(coords = c("xlong", "ylat"), crs=2163)

# obtain state geometries
states_sf <- get_urbn_map(map = "states", sf = TRUE)

# Remove AK, HI from state and PR and GU from turbines as well
states_sf <- states_sf[!(states_sf$state_abbv %in% c("HI","AK")),]
turbine   <- turbine  [!(turbine$t_state      %in% c('HI','AK','PR','GU')),]

# simple plot shows all locations
ggplot(turbine, aes(x=xlong, y=ylat)) + geom_point()

#plot locations over map
  ggplot() +
  geom_sf(data = turbine_sf) + 
  geom_sf(data = states_sf, fill = NA, color = "black", size = 0.15, alpha = 0) +
  coord_sf(datum = st_crs(2163)) +   
  labs(fill  = "", 
       title = "",
       caption='') + 
  theme_bw()
r sf
0
JFD 29 Авг 2020 в 19:28

2 ответа

Лучший ответ

Ваш набор данных турбины содержит «xlong» и «ylat» в градусах, то есть географическую систему координат с датумом WGS84 (код EPSG: 4326). Итак, сначала сделайте это как crs = 4326, а затем используйте st_transform(turbine_sf, crs=2163), чтобы создать ту же систему координат с states_sf. Вы можете использовать следующий код

# Map the locations of US Wind Turbines
library(urbnmapr)
library(ggplot2)
library(readr)
library(dplyr)
library(sf)

# This file is available from https://eerscmap.usgs.gov/uswtdb/assets/data/uswtdbCSV.zip
turbine <- read_csv("uswtdb_v3_1_20200717.csv")

# Convert lat/long to a sf
turbine_sf <- turbine %>%
  st_as_sf(coords = c("xlong", "ylat"), crs=4326)

turbine_sf_t <- st_transform(turbine_sf, crs=2163)
# obtain state geometries
states_sf <- get_urbn_map(map = "states", sf = TRUE)

st_crs(states_sf)
# Remove AK, HI from state and PR and GU from turbines as well
states_sf <- states_sf[!(states_sf$state_abbv %in% c("HI","AK")),]
turbine   <- turbine  [!(turbine$t_state      %in% c('HI','AK','PR','GU')),]

# simple plot shows all locations
ggplot(turbine, aes(x=xlong, y=ylat)) + geom_point()

#plot locations over map
ggplot() +
  geom_sf(data = turbine_sf_t) + 
  geom_sf(data = states_sf, fill = NA, color = "black", size = 0.15, alpha = 0) +
  coord_sf(datum = st_crs(2163)) +   
  labs(fill  = "", 
       title = "",
       caption='') + 
  theme_bw()

enter image description here

3
Bappa Das 29 Авг 2020 в 17:31

Выполняя st_as_sf(coords = c("xlong", "ylat"), crs=2163), вы говорите, что исходное длинное, широта из вашей turbine таблицы основано на CRS 2163. Я думаю, вы хотите установить их как 4326, что длинный шир под WGS84.

После установки начального CRS используйте st_transform(), чтобы преобразовать CRS вашей формы в новый CRS, например turbine_sf <- st_transform(turbine_sf, crs=2163)

1
Ben Toh 29 Авг 2020 в 17:24