【问题标题】:On a line of segments, find a point that is x units along the line在一条线段上,找到沿线 x 个单位的点
【发布时间】:2012-11-13 16:58:42
【问题描述】:

让我们假设一条线段属于SpatialLines,长度为len。此特定行从左上角开始。

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)

【问题讨论】:

  • 什么是xline.length?另外,你的意思是你想要一个沿线形成的路径为findme 个单位的点吗?还是 findme 乌鸦飞过的单位?
  • 对不起,xline.lengthxline 的总长度(我放弃了这种方法,忘记提供xline.length)。我想要那条特定线上的点。

标签: r geospatial spatial


【解决方案1】:

以下步骤将帮助您找到坐标。

线路的一般信息:

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

【讨论】:

  • 像魅力一样工作。我添加了一个替换 sapply 的位。
【解决方案2】:

你能:

  • 确定段的顺序
  • 确定每个段的长度
  • 使用顺序和长度来确定点在哪一段
  • 从 order * length 中减去段的开头(例如,如果您知道自己在第三段,则应减去第三段和第二段相交点的长度(这只是总和)段 1 和 2)从整行开始)。因此,如果您试图从线的起点处找到 7 个单位的点,并且线段 1 和 2 的总和为 5,那么您将得到 2。
  • 然后只需使用this method 处理唯一剩余的段,以确定该段下 2 个单位的点。

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

希望对您有所帮助...

【讨论】:

  • 呵呵,这就是我们说话时我试图实施的方法。 :)
  • 嗯.... 段顺序由您的原始(基本上)有序对 (x,y) 集确定。段长度计算是微不足道的。现在您知道哪个段包含您的目标距离。使用点斜法找到所需距离的坐标。这应该很简单 :-) ——我认为 Sven 所做的差不多。
猜你喜欢
  • 2019-12-16
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 2018-08-03
  • 1970-01-01
  • 2013-04-08
相关资源
最近更新 更多