점에서 선 스트링을 효율적으로 만드는 방법은 무엇입니까?

Dec 30 2020

두 개의 개별 데이터 프레임에 geom POINT가 있습니다. 제가하고 싶은 것은 점을 선 (나중에지도에서)으로 연결하는 것이므로, 이러한 데이터 프레임에서 각 점 쌍에 대한 선 스트링을 만들고 싶습니다. 나는 이것을 이렇게 만들었다.

coordsCust <- table %>%
  st_as_sf(coords = c("lonCust","latCust"), crs = 4326)

coordsApp <- table %>%
  st_as_sf(coords = c("lonApp","latApp"), crs = 4326) %>%
  st_geometry()

및 Linestring :

lines <- st_sfc(mapply(function(a,b){
  st_cast(st_union(a,b),"LINESTRING")}, 
  coordsCust$geometry, coordsApp$geometry, SIMPLIFY=FALSE))

이 코드는 작동합니다. 각 포인트 쌍에 대해 행별로 라인 스트링을 만들 수 있습니다.

LINESTRING (14.035 51.65182, 14.33418 53.53346)
LINESTRING (20.42767 49.98073, 16.62978 52.31037)
LINESTRING (20.18762 50.03337, 16.62978 52.31037)
LINESTRING (19.04625 49.79234, 16.62978 52.31037)
LINESTRING (21.35808 50.92382, 16.62978 52.31037)

문제는 3 만 행에 대해이 솔루션이 약 21 초로 매우 느리게 작동한다는 것입니다. 점에서 선 스트링을 만드는 다른 방법이 있습니까? 훨씬 빠르게 작동하는 것? 웹에서 몇 가지 솔루션을 검색했지만 헛된 것입니다. sf를 행렬로 변환하고 사용 pmap하는 방법에 대해 읽었 지만 여기에서 구현하는 방법을 모릅니다.

업데이트 : sfheaders :: sf_linestring 함수를 사용하려면 두 데이터 집합의 도형을 조인해야합니다. 나는 이것을 이렇게한다 :

df <- cbind(coordsCust,coordsApp)

최종 데이터 프레임 (가장 중요한 부분을 보여주었습니다)은 다음과 같습니다.

불행히도 sf_linestring은이 데이터 프레임에서 제대로 작동하지 않습니다. 화면에 표시된 것처럼 각 행에 대해 POINT 사이에 선 스트링을 별도로 만들어야합니다.

답변

2 SymbolixAU Dec 30 2020 at 04:49

exmaple 데이터 세트가 없으면 질문에 완전히 답하기가 어렵습니다. 그러나 data.frame을 'long'형식으로 가져올 수 있다면 sfheaders즉시 할 수 있습니다.

n <- 30000
df <- data.frame(
  x = rnorm(n)
  , y = rnorm(n)
)

df$id <- rep(1:(n/2), each = 2)

sfheaders::sf_linestring(
  obj = df
  , x = "x"
  , y = "y"
  , linestring_id = "id"
)

# Simple feature collection with 15000 features and 1 field
# geometry type:  LINESTRING
# dimension:      XY
# bbox:           xmin: -4.297631 ymin: -4.118291 xmax: 3.782847 ymax: 4.053399
# CRS:            NA
# First 10 features:
#   id                       geometry
# 1   1 LINESTRING (0.2780517 0.243...
# 2   2 LINESTRING (0.4261505 2.503...
# 3   3 LINESTRING (0.8662821 -0.11...
# 4   4 LINESTRING (-0.5335952 -0.1...
# 5   5 LINESTRING (1.154309 -1.352...
# 6   6 LINESTRING (0.05512324 -0.4...
# 7   7 LINESTRING (1.945868 -0.744...
# 8   8 LINESTRING (0.0427066 -0.08...
# 9   9 LINESTRING (0.06738045 0.41...
# 10 10 LINESTRING (0.4128964 -0.04...