วิธีสร้าง Linestrings จากจุดอย่างมีประสิทธิภาพ?

Dec 30 2020

ฉันมี geom POINT ในกรอบข้อมูลสองเฟรมที่แยกจากกัน สิ่งที่ฉันต้องการทำคือการเชื่อมต่อจุดด้วยเส้น (ในภายหลังบนแผนที่) ดังนั้นฉันจึงต้องการสร้าง Linestring สำหรับแต่ละคู่ของจุดจากกรอบข้อมูลเหล่านั้น ฉันทำแบบนี้:

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

รหัสนี้ใช้งานได้ฉันสามารถสร้าง Linestrings สำหรับจุดแต่ละคู่ทีละแถว:

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)

ปัญหาคือสำหรับ 30,000 แถวโซลูชันนี้ทำงานได้ช้ามาก - ประมาณ 21 วินาที มีวิธีอื่นในการสร้าง linestrings จากจุดหรือไม่? สิ่งที่ทำงานได้เร็วขึ้นมาก? ฉันค้นหาวิธีแก้ปัญหาบางอย่างบนเว็บ แต่ก็ไร้ผล ฉันได้อ่านบางอย่างเกี่ยวกับการแปลง sf เป็นเมทริกซ์และการใช้งานpmapแต่ไม่รู้ว่าจะใช้งานได้อย่างไรที่นี่

UPDATE:ถ้าฉันต้องการใช้ฟังก์ชัน sfheaders :: sf_linestring ฉันต้องเข้าร่วมรูปทรงเรขาคณิตจากทั้งสองชุดข้อมูล ฉันทำแบบนี้:

df <- cbind(coordsCust,coordsApp)

และกรอบข้อมูลสุดท้าย (ฉันแสดงส่วนที่สำคัญที่สุดของมัน) แสดงอยู่ด้านล่าง:

ขออภัย sf_linestring ทำงานไม่ถูกต้องบนดาต้าเฟรมนี้ ฉันต้องการสร้าง linestring ระหว่าง POINT สำหรับแต่ละแถวแยกกันดังที่แสดงบนหน้าจอ

คำตอบ

2 SymbolixAU Dec 30 2020 at 04:49

หากไม่มีชุดข้อมูล exmaple ก็ยากที่จะตอบคำถามของคุณได้อย่างสมบูรณ์ แต่ถ้าคุณสามารถทำให้ data.frame ของคุณอยู่ในรูปแบบ 'ยาว' คุณ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...