从多个纬度中创建SF点

时间:2018-09-28 08:07:05

标签: r sf

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组经/纬度的数据框,我想将其转换为点。

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相同的结果。

enter image description here

如果我更改这两个语句的顺序,都将给出(lat2,long2)的要点

enter image description here

如何创建每行多点的df?

1 个答案:

答案 0 :(得分:0)

问题是st_geometry创建了一个粘性列,用于标识sf对象的几何形状。对已存在且处于活动状态的几何列使用st_as_sf会忽略任何其他指定几何列的尝试。为了创建第二个几何列,我们可以暂时删除sf类(使用(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