r-从数据框中同一行中的两个点创建线串 [英] r - Create linestring from two points in same row in dataframe
问题描述
我想知道是否有一种方法可以从新几何列中数据框中同一行中给定的两个点创建 linestring
.换句话说,这两个点的经度和纬度在数据框中给出,如下所示:
I was wondering if there is a way to create linestring
from two points given in the same row in a dataframe in a new geometry column. In other words longitudes and latitudes of the two points are given in a dataframe like the following:
df <- data.frame(id = c("a", "b"), lon1 = c(1,2), lat1 = c(3,4), lon2 = c(5,6), lat2 = c(7,8))
其中 lon1
和 lat1
代表第一个点的坐标,而 lon2
和 lat2
是第二点.所需的数据框将具有两行两列- id
列和 geometry
列.
where lon1
and lat1
represent the coordinates of the first point and lon2
and lat2
are the coordinates of the second point. The desired dataframe would have two rows and two columns - the id
column and a geometry
column.
我尝试使用 sf :: st_linestring
,但似乎此函数仅适用于矩阵.
I tried with sf::st_linestring
but seems this function only works with matrices.
所需数据框:
desired_df <- data.frame(id = c("a", "a", "b", "b"), lon = c(1,2,5,6), lat = c(3,4,7,8)) %>% st_as_sf(coords = c("lon", "lat"), dim = "XY") %>% st_set_crs(4236) %>% group_by(id) %>% summarise(geometry = st_union(geometry), do_union = FALSE) %>% st_cast("LINESTRING")
推荐答案
更新-2021年1月30日
我最初回答的问题是它没有正确设置边界框.
Update - 30th Jan 2021
The issue with my original answer is it doesn't correctly set the bounding box.
今天,我将通过 sfheaders
和 data.table
library(data.table)
library(sfheaders)
dt <- as.data.table(df)
## To use `sfheaders` the data needs to be in long form
dt1 <- dt[, .(id, lon = lon1, lat = lat1)]
dt2 <- dt[, .(id, lon = lon2, lat = lat2)]
## Add on a 'sequence' variable so we know which one comes first
dt1[, seq := 1L ]
dt2[, seq := 2L ]
## put back together
dt <- rbindlist(list(dt1, dt2), use.names = TRUE)
setorder(dt, id, seq)
sf <- sfheaders::sf_linestring(
obj = dt
, x = "lon"
, y = "lat"
, linestring_id = "id"
)
sf
# Simple feature collection with 2 features and 1 field
# geometry type: LINESTRING
# dimension: XY
# bbox: xmin: 1 ymin: 3 xmax: 6 ymax: 8
# CRS: NA
# id geometry
# 1 a LINESTRING (1 3, 5 7)
# 2 b LINESTRING (2 4, 6 8)
原始答案
使用 data.table
要求(数据表)
dt <- as.data.table(df)
sf <- dt[
, {
geometry <- sf::st_linestring(x = matrix(c(lon1, lon2, lat1, lat2), nrow = 2, ncol = 2))
geometry <- sf::st_sfc(geometry)
geometry <- sf::st_sf(geometry = geometry)
}
, by = id
]
sf::st_as_sf(sf)
# Simple feature collection with 2 features and 1 field
# geometry type: LINESTRING
# dimension: XY
# bbox: xmin: 1 ymin: 3 xmax: 5 ymax: 7
# epsg (SRID): NA
# proj4string: NA
# id geometry
# 1 a LINESTRING (1 3, 5 7)
# 2 b LINESTRING (2 4, 6 8)
这篇关于r-从数据框中同一行中的两个点创建线串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!