R 使用sf/mapview连接两组坐标以创建线

R 使用sf/mapview连接两组坐标以创建线,r,sf,r-mapview,R,Sf,R Mapview,我有一个数据集,其中一只鸟在一个位置(勃隆,布拉特)捕获,然后在另一个位置(埃隆,埃拉特)再次遇到。这些坐标是lat/long格式,我想用一条线连接捕获和遭遇位置,并在mapview中绘制它们 在下面的数据中,每一行都是一只单独的鸟,带有它的捕获/遭遇坐标,以及它所属的飞行路线(我想用它在mapview中为线条着色) dat <- structure(list(Blong = c(-75.58333, -76.08333, -81.08333, -94.25, -75.41667

我有一个数据集,其中一只鸟在一个位置(勃隆,布拉特)捕获,然后在另一个位置(埃隆,埃拉特)再次遇到。这些坐标是lat/long格式,我想用一条线连接捕获和遭遇位置,并在mapview中绘制它们

在下面的数据中,每一行都是一只单独的鸟,带有它的捕获/遭遇坐标,以及它所属的飞行路线(我想用它在mapview中为线条着色)

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"))

dat棘手的事情是从宽格式的坐标对中创建一个有效的
LINESTRING
对象。
sf
需要矩阵行中的LINESTRING坐标。下面是一种可行的方法。
sf
对象的
sfc
列是一个列表,因此这里我们使用
lappy
来循环da的行你提供的助教

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")
相关/可能重复:
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")