sp
- это более старый пакет, который постепенно сокращается в пользу более нового пакета "Simple Features" sf
. Дайте мне знать, если вы открыты для использования оператора pipe %>%
из пакета magrittr
, поскольку он прекрасно работает с пакетом sf
(как и dplyr
и purrr
).
Используя sf
, вы могли бы сделать:
library(sf)
# Replace this with the path to the geojson file
geojson_path <- "path/to/file.geojson"
boroughs <- sf::st_read(dsn = geojson_path, stringsAsFactors = FALSE)
Теперь создаем очень простой пространственный точечный объект для замены данных «поездов».
# Make test data.frame
test_df <-
data.frame(
# Random test point I chose, a couple of blocks from Central Park
a = "manhattan_point",
y = 40.771959,
x = -73.964128,
stringsAsFactors = FALSE)
# Turn the test_df into a spatial object
test_point <-
sf::st_as_sf(
test_df,
# The coords argument tells the st_as_sf function
# what columns store the longitude and latitude data
# which it uses to associate a spatial point to each
# row in the data.frame
coords = c("x", "y"),
crs = 4326 # WGS84
)
Теперь мы готовы к определить, в какой полигон (ы) попадает наша точка:
# Get the sparse binary predicate. This will give a list with as
# many elements as there are spatial objects in the first argument,
# in this case, test_point, which has 1 element.
# It also has attributes which detail what the relationship is
# (intersection, in our case)
sparse_bin_pred <- sf::st_intersects(test_point, boroughs)
# Output the boro_name that matched. I think the package purrr
# offers some more intuitive ways to do this, but
lapply(
sparse_bin_pred,
function(x) boroughs$boro_name[x]
)
Эта последняя часть выводит:
[[1]]
[1] "Manhattan"