在一条线段上,找到距离起点 x 个单位长度的点。

4

假设有一条长度为len,类为SpatialLines的线段。这条特定的线段从左上角开始。

library(sp)
x <- structure(list(x = c(-7.23437435517476, 6.35937810318614, -5.86718660792582, 
                        7.96094089282062), y = c(7.08139459814975, 6.8633712983227, -7.61337581019376, 
                        -6.2180266913006)), .Names = c("x", "y"))

xline <- SpatialLines(list(Lines(Line(x), ID = 1)))
#len <- LineLength(as.matrix(data.frame(x)))
len <- LineLength(as.matrix(data.frame(coordinates(xline))))

plot(0,0, xlim = c(-10, 10), ylim = c(-10, 10), type = "n")
lines(xline)

查找距离起点一定距离的线上点

我想要在这条直线上找到一个距离起点findme个单位长度的点。例如,如果我想要找到距离起点10个单位长度的点,我会得到一个接近第一段和第二段之间节点的点。欢迎您提供更为健壮的解决方案。

我已经试过使用spsample方法(见下文),但这种方法不太可靠,并且对于位于该直线后半部分的点无法正常工作。

# very approximate method, not very suitable
findme <- 11 # 11, 12 and 13 give same result
segs <- 1/(findme/xline.length)
xsam <- spsample(x = xline, n = segs, type = "regular", offset = 0)
points(xsam)

1
xline.length 是什么?另外,你是想要一个沿着该直线路径寻找 findme 单位的点吗?还是指鸟瞰视角下 findme 单位的距离? - Josh O'Brien
抱歉,xline.lengthxline 的总长度(我放弃了这个方法,并忘记提供 xline.length)。我想要那条特定线上的点。 - Roman Luštrik
2个回答

4
以下步骤将帮助您找到坐标。
线条的一般信息:
library(np)

coord <- coordinates(xline)[[1]][[1]] 
nLines <- nrow(coord) - 1
#lengths <- sapply(seq_len(nLines), function(x) LineLength(coord[c(x, x + 1), ]))
lengths <- LineLength(coord, sum = FALSE)

寻找新坐标:

findme <- 11 # the distance of the new coordinates

distances <- cumsum(lengths) - findme         # distances from the nodes
segment <- which(distances >= 0)[1]           # the segment of interest
distToNode <- distances[segment]
ratio <- distToNode / lengths[segment]
segCoord <- coord[c(segment, segment + 1), ]
newCoord <- (1 - ratio) * segCoord[2 , ] + ratio * segCoord[1 , ] 

剧情:

points(newCoord[1], newCoord[2])

enter image description here


运行得非常好。我添加了一个位,用于替换sapply。 - Roman Luštrik

0

你能否:

  • 确定各段的顺序
  • 确定每段的长度
  • 使用顺序和长度来确定点所在的段
  • 从整个线段的起点减去该段的起点乘以顺序*长度(例如,如果您知道您在第三段上,则从第三段和第二段相交的点的长度(即第1段和第2段的总和)减去整个线段的起点)。因此,如果您试图找到距离线段起点7个单位的点,并且第1段和第2段的总和为5,则剩下2。
  • 然后只需使用this method处理唯一剩下的段,以确定点在该段下方2个单位处的位置。

如果这不是完整的解决方案,我很抱歉。但也许它会给你一个可解决的方法。

希望这有所帮助...


呵呵,这正是我正在尝试实现的方法。 :) - Roman Luštrik
好的.....片段顺序由您最初的(本质上)有序对(x,y)确定。片段长度计算很简单。现在您知道哪个片段包含您的目标距离。使用点斜率方法查找所需距离的坐标。那应该足够简单 :-) - 这基本上就是Sven所做的事情,我想。 - Carl Witthoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接