Соединение двух наборов координат для создания линий с использованием sf / mapview - PullRequest
2 голосов
/ 15 марта 2019

У меня есть набор данных, в котором птица, пойманная в одном месте (Блонг, Блат), затем снова встретилась в другом (Элонг, Элат).Эти координаты представлены в формате широта / долгота, и я хотел бы связать места съемки и встречи с линией и отобразить их в виде карты.

В приведенных ниже данных каждая строка представляет собой отдельную птицу со своимизахватить / встретить координаты и пролет, которому он принадлежит (который я хотел бы использовать, чтобы покрасить линии в виде карты.

dat <- structure(list(Blong = c(-75.58333, -76.08333, -81.08333, -94.25, 
    -75.41667, -99.41667, -77.41667, -116.08333, -89.58333, -77.58333
    ), Blat = c(37.58333, 40.58333, 42.75, 41.91667, 38.25, 28.25, 
    38.91667, 43.58333, 44.25, 38.91667), Elong = c(-65.91667, -75.75, 
    -80.58333, -95.41667, -73.58333, -89.41667, -77.58333, -116.41667, 
    -96.41667, -77.41667), Elat = c(45.91667, 40.58333, 42.75, 29.75, 
    45.58333, 48.25, 38.75, 43.58333, 34.08333, 38.91667), Flyway = structure(c(2L, 
    2L, 2L, 1L, 2L, 2L, 2L, 3L, 2L, 2L), .Label = c("Central", "Eastern", 
    "West"), class = "factor")), .Names = c("Blong", "Blat", "Elong", 
    "Elat", "Flyway"), row.names = c(NA, -10L), class = c("tbl_df", 
    "tbl", "data.frame"))

Просмотр данных:

# A tibble: 10 x 5
    Blong  Blat  Elong  Elat Flyway 
    <dbl> <dbl>  <dbl> <dbl> <fct>  
 1  -75.6  37.6  -65.9  45.9 Eastern
 2  -76.1  40.6  -75.8  40.6 Eastern
 3  -81.1  42.8  -80.6  42.8 Eastern
 4  -94.2  41.9  -95.4  29.8 Central
 5  -75.4  38.2  -73.6  45.6 Eastern
 6  -99.4  28.2  -89.4  48.2 Eastern
 7  -77.4  38.9  -77.6  38.8 Eastern
 8 -116.   43.6 -116.   43.6 West   
 9  -89.6  44.2  -96.4  34.1 Eastern
10  -77.6  38.9  -77.4  38.9 Eastern

Я посмотрел несколько примеров, но не нашел такого, который бы очень походил на мои данные.

1 Ответ

2 голосов
/ 16 марта 2019

Сложно создать действительный объект LINESTRING из пар координат в широком формате. sf ожидает координаты строки в строках матрицы. Вот способ, который работает. Столбец sfc объекта sf представляет собой список, поэтому здесь мы используем lapply для циклического перебора строк предоставленных вами данных.

library(sf)
library(mapview)

b = dat[, c("Blong", "Blat")]
names(b) = c("long", "lat")
e = dat[, c("Elong", "Elat")]
names(e) = c("long", "lat")

dat$geometry = do.call(
  "c", 
  lapply(seq(nrow(b)), function(i) {
    st_sfc(
      st_linestring(
        as.matrix(
          rbind(b[i, ], e[i, ])
        )
      ),
      crs = 4326
    )
  }))

dat_sf = st_as_sf(dat)

mapview(dat_sf, zcol = "Flyway")
...