我有x-y坐标的空间数据点。它们代表了渠道的银行。现在,我需要使这个渠道银行线更加密集。我想通过给出所有插值点必须相互具有的最小距离(米)来线性插值存储点。
例如:蓝点是原始点。红色是插值点。它们彼此相距至少1米。右下角的两个蓝点不会接收插值。
我怎样才能做到这一点?
修改
Downvoting问题似乎是新的爱好。我能做些什么让你们开心?我的努力?
par = list()
par$bank.min.dist = 6 # meters
for(i in c(2:length(data$x[ix]))){
# add the actual point
banks$x[[bank]] = c(banks$x[[bank]], data$x[ix.l][i-1])
banks$y[[bank]] = c(banks$y[[bank]], data$y[ix.l][i-1])
# calculate distance between consecutive bank points
cb_dist = ( ( data$x[ix][i] - data$x[ix][i-1] )^2 + ( data$y[ix][i] - data$y[ix][i-1] )^2 ) ^(1/2)
# if distance larger than threshold distance interpolate
if(cb_dist > par$bank.min.dist){
# calculate number of artificial points
nr_of_pts = ceiling(cb_dist / par$bank.min.dist)
ap = ap + nr_of_pts
# add artificial points
for(ido in c(1: (nr_of_pts-1))){
banks$x[[bank]] = c(banks$x[[bank]], data$x[ix][i-1] + ( ( (data$x[ix][i] - data$x[ix][i-1]) / nr_of_pts ) * ido ) )
banks$y[[bank]] = c(banks$y[[bank]], data$y[ix][i-1] + ( ( (data$y[ix][i] - data$y[ix][i-1]) / nr_of_pts ) * ido ) )
}
}
}
目前我正在使用循环进行此操作。哪个很慢但有效。
G5W的建议正在发挥作用!但是,它没有在橙色点中加入蓝点。当然,我可以稍后将蓝点添加到插值的橙色点。但我需要完整的点顺序以便以后处理。
由于我认为G5W是R的专家,我不认为有一个单行命令可以做到这一点。因此,我坚持循环我。这是一个时间图(我执行了10次运行以制作箱图):
注意:这里绝对运行时间减少,因为我将最小距离设置得相当高。
答案 0 :(得分:1)
这与您所做的基本相同,但使用矢量化函数而不是循环。看看这对你有效。
## Set up test data
x = c(1, 2.5, 5, 8, 8.8)
y = c(6.5, 7, 4.2, 0, 0)
plot(x,y, pch=21, bg="blue")
MinD = 1
## Get the distances between successive points
DM = as.matrix(dist(data.frame(x,y)))
Distances = DM[row(DM) == col(DM) + 1]
NumPts = ceiling(Distances/MinD) + 1
InterpX = unlist(sapply(1:(length(x)-1),
function(i) {
PAll = seq(x[i], x[i+1], length.out=NumPts[i])
PAll[-c(length(PAll))]
} ))
InterpX = c(InterpX, x[length(x)])
InterpY = unlist(sapply(1:(length(x)-1),
function(i) {
PAll = seq(y[i], y[i+1], length.out=NumPts[i])
PAll[-c(length(PAll))]
} ))
InterpX = c(InterpX, x[length(x)])
points(InterpX, InterpY , pch=16, col="orange")