沿R中的(多边形)线创建等距点

沿R中的(多边形)线创建等距点,r,R,如果我有这样一个空间线对象: require(sp) x <- c(18.25721, 18.25763,18.25808,18.25846,18.25864,18.25886,18.25892,18.25913,18.25940,18.25962, 18.25976,18.25997,18.26021,18.26048,18.26061,18.26086,18.26107,18.26128,18.26154,18.26219, 18.26276,18.263

如果我有这样一个空间线对象:

require(sp)

x <- c(18.25721, 18.25763,18.25808,18.25846,18.25864,18.25886,18.25892,18.25913,18.25940,18.25962,
       18.25976,18.25997,18.26021,18.26048,18.26061,18.26086,18.26107,18.26128,18.26154,18.26219,
       18.26276,18.26350,18.26445,18.26510,18.26584,18.26668,18.26704,18.26807,18.26850,18.26944,
       18.27020,18.27080,18.27111,18.27134,18.27168,18.27191,18.27217,18.27254,18.27309,18.27345,
       18.27368,18.27389,18.27398,18.27400,18.27392,18.27383,18.27370) 

y <- c(44.69540,44.69539,44.69544,44.69552,44.69563,44.69586,44.69608,44.69644,44.69672,44.69687
       ,44.69701,44.69718,44.69737,44.69763,44.69771,44.69778,44.69781,44.69781,44.69782,44.69776
       ,44.69772,44.69778,44.69794,44.69805,44.69814,44.69822,44.69824,44.69826,44.69821,44.69805
       ,44.69775,44.69737,44.69728,44.69717,44.69701,44.69687,44.69671,44.69649,44.69616,44.69598
       ,44.69578,44.69560,44.69539,44.69513,44.69490,44.69476,44.69453)

river<-SpatialLines(list(Lines(Line(cbind(x,y)), ID="a")))
proj4string(river) <- CRS("+init=epsg:4326")
require(sp)

x不知道任何库,但您可以通过以下方式获得结果:

norm_vec <- function(x) sqrt(sum(x^2))
new_point <- function(p0, p1, di) { # Finds point in distance di from point p0 in direction of point p1
    v = p1 - p0
    u = v / norm_vec(v)
    return (p0 + u * di)
}

find <- function(river, M) {

  result = river[1,,drop=FALSE] 
  # for all subsequent points p1, p2 in this data.frame norm_vec(p2 - p1) = M at all times
  equidistantPoints = river[1,,drop=FALSE] 
  river = tail(river, n = -1)
  accDist = 0


  while (length(river) > 0) {
    point = river[1,]
    lastPoint = result[1,]

    dist = norm_vec(point - lastPoint)    

    if ( accDist + dist > M ) {
      np = new_point(lastPoint, point, M - accDist)
      equidistantPoints = rbind(np, equidistantPoints) # add np to equidistantPoints
      result = rbind(np, result) # add np to result
      accDist = 0 # reset accDist
    } else {
      #move point from river to result  
      river = tail(river, n = -1)
      result = rbind(point, result)    
      #update accDist  
      accDist = accDist + dist
    }
  }
  allPoints = result[NROW(result):1,] # reverse result
  return(list(newPoints = equidistantPoints, allPoints = allPoints))
}

基本思想是,当我们意识到
accDist+dist>M
时,我们继续沿着河流移动,并计算距离最后一个“检查点”的距离,这意味着在
lastPoint
point
之间必须创建一个新点
np
,以便
accDist+dist\u to\u new\u point=M
。我们将这一点添加到结果中,并沿着河流移动。

来自的spsample()函数如何?您只需采样n个点,其中

numOfPoints  <-  gLength(river) / 3
spsample(river, n = numOfPoints, type = "regular")

numOfPoints这就是插值函数的用途。或者您正在询问如何打印符号,以及如何打印旋转文本?如果是后者,请澄清,因为我在某处有一些代码可以做这类事情。对不起,我不够清楚。我想计算这些x/y坐标。你知道如何计算点之间的距离,或者做线积分吗?我对这类东西很陌生,但我想我知道如何计算点之间的距离,但我对线积分一无所知。这段代码似乎很管用,谢谢!有没有可能粗略地解释一下(背后的想法)?我试图理解,但我不明白。我比上一个答案更喜欢这个答案,因为它更直截了当。问题的作者能否将公认的答案改为这个?
numOfPoints  <-  gLength(river) / 3
spsample(river, n = numOfPoints, type = "regular")