Как рассчитать расстояние между точками от опорной точки с помощью R? - PullRequest
1 голос
/ 10 февраля 2020

У меня есть этот фрейм данных individual_dets, в котором есть значения lat и long. Это фрейм данных

individual_dets = structure(list(location = c("ARB-04", "BIRCHY HEAD", "Boca1", 
"BON-AR-S2", "BON-AR-S2", "BON-W-S5"), month = structure(c(12L, 
10L, 10L, 8L, 11L, 2L), .Label = c("Jan", "Feb", "Mar", "Apr", 
"May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), class = c("ordered", 
"factor")), year = c(2018, 2018, 2018, 2018, 2018, 2018), detection_count = c(3L, 
256L, 2L, 4L, 2L, 2L), num_unique_tags = c(1L, 1L, 1L, 1L, 1L, 
1L), total_res_time_in_seconds = c(0, 1182040, 0, 2732221, 0, 
0), latitude = c(24.94808, 44.5713, 26.32559, -49.27732, -49.27732, 
-49.27985), longitude = c(-80.45412, -64.03512, -80.07108, 69.48038, 
69.48038, 69.47853)), class = c("grouped_df", "tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -6L), groups = structure(list(
    location = c("ARB-04", "BIRCHY HEAD", "Boca1", "BON-AR-S2", 
    "BON-AR-S2", "BON-W-S5"), month = structure(c(12L, 10L, 10L, 
    8L, 11L, 2L), .Label = c("Jan", "Feb", "Mar", "Apr", "May", 
    "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), class = c("ordered", 
    "factor")), .rows = list(1L, 2L, 3L, 4L, 5L, 6L)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"), .drop = TRUE))

Однако мой фрейм данных содержит 4247 наблюдений.

Значения широты и долготы указаны для координат через океан в северо-западной части Атланти c. Я пытаюсь вычислить расстояние от Галифакса этих широт и длинных значений.

Мне сказали использовать эту функцию snap points to line, а затем использовать lappy, но я смотрю на структуру, и я так растерялся. Кто-нибудь понимает, как кодировать, используя функцию snap points to line и lappy, чтобы получить приблизительное расстояние?

1 Ответ

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

Вы можете использовать st_distance() из пакета sf:

library(sf)
library(dplyr)

individual_dets_sf <- st_as_sf(individual_dets, coords = c("longitude", "latitude"),
                               crs = 4326) %>% 
  ungroup()
halifax <- data.frame("longitude" = -63.5752, "latitude" = 44.6488)
halifax_sf <- st_as_sf(halifax, 
                       coords = c("longitude", "latitude"),
                       crs = 4326,
                       remove = FALSE) 

individual_dets_sf_2 <- individual_dets_sf %>% 
  mutate(distances = st_distance(., halifax_sf, by_element = TRUE))

individual_dets_sf_2$distances

Units: [m]
[1]  2664402.84    37510.33  2513963.08 16466708.65 16466708.65 16466623.17

Если вы хотите его визуализировать (Галифакс в синем):

library(tmap)

tmap_mode("view")

tm_shape(individual_dets_sf_2 %>% mutate(distances = units::drop_units(distances))) + tm_dots(col = "distances") +
  tm_shape(halifax_sf) + tm_dots(col = "blue")

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...