从多个经纬度创建 SF 点

Creating SF points from multiple lat longs

library(sf)

DT <- data.frame(
  lat1=c(-26.3, -27.1, -26.8),
  long1=c(27.3, 28.5, 28.2),
  lat2=c(-26.5, -26.9, -27.2),
  long2=c(28.3, 27.5, 28.1)
)

DT$p1 <- st_geometry(st_as_sf(DT,coords = c("lat1","long1")))
DT$p2 <- st_geometry(st_as_sf(DT,coords = c("lat2","long2")))

我有一个包含 2 组 lat/longs 的数据框,我想将其转换为点。

DT$p1 <- st_geometry(st_as_sf(DT,coords = c("lat1","long1")))

给出了预期的结果,但是

DT$p2 <- st_geometry(st_as_sf(DT,coords = c("lat2","long2")))

给我的结果与 DT$p1 相同。

如果我改变这两个语句的顺序,它们都会给出 (lat2,long2)

如何创建每行有多个点的 df?

问题是 st_geometry 创建了一个粘性列,用于标识 sf 对象的几何形状。将 st_as_sf 与已存在且处于活动状态的几何列一起使用将忽略任何其他指定几何列的尝试。为了创建第二个几何列,我们可以暂时删除 sf class(使用 (as.data.frame).

library(sf)

DT = data.frame(
  lat1=c(-26.3, -27.1, -26.8),
  long1=c(27.3, 28.5, 28.2),
  lat2=c(-26.5, -26.9, -27.2),
  long2=c(28.3, 27.5, 28.1)
)

DT = st_as_sf(DT, coords = c("long1","lat1"), remove = FALSE)
DT$p2 = st_as_sf(as.data.frame(DT), coords = c("long2","lat2"))

DT

# Simple feature collection with 3 features and 4 fields
# Active geometry column: geometry
# geometry type:  POINT
# dimension:      XY
# bbox:           xmin: 27.3 ymin: -27.1 xmax: 28.5 ymax: -26.3
# epsg (SRID):    NA
# proj4string:    NA
#    lat1 long1  lat2 long2           geometry                 p2
# 1 -26.3  27.3 -26.5  28.3 POINT (27.3 -26.3) POINT (28.3 -26.5)
# 2 -27.1  28.5 -26.9  27.5 POINT (28.5 -27.1) POINT (27.5 -26.9)
# 3 -26.8  28.2 -27.2  28.1 POINT (28.2 -26.8) POINT (28.1 -27.2)

st_geometry(DT)

# Geometry set for 3 features 
# geometry type:  POINT
# dimension:      XY
# bbox:           xmin: 27.3 ymin: -27.1 xmax: 28.5 ymax: -26.3
# epsg (SRID):    NA
# proj4string:    NA
# POINT (27.3 -26.3)
# POINT (28.5 -27.1)
# POINT (28.2 -26.8)

另外,请注意正确的坐标规范是 x,y 因此 long,lat 而不是 lat,long