代码之家  ›  专栏  ›  技术社区  ›  Jack M

R中的三维相交(空间分析)

  •  1
  • Jack M  · 技术社区  · 7 年前

    嗨,R爱好者们,

    我很难找到解决R中几何问题的方法。我有一个光栅数据集,它表示有障碍物的地形(障碍物为5米)。

     dat1=list()
     dat1$x=seq(481018,by=10,len=10)
     dat1$y=seq(5628255,by=10,len=10)
     dat1$z=matrix(c(rep(1,40),rep(5,20),rep(1,40)),10,10)
     r=raster(dat1)
     crs(r) <- "+proj=utm +zone=32 +datum=WGS84"
    

    我还有一个空间线数据帧,它与 有了那个障碍。线路的一点位于障碍物下方(2 m),另一点位于障碍物上方(7 m)。

    x <- c(481060,481060)
    y <- c(5628340,5628260)
    line <- SpatialLines(list(Lines(Line(cbind(x,y)), ID="a")))
    line <- SpatialLinesDataFrame(sl = line, data = data.frame("p1"=2,"p2"=7),   match.ID = FALSE)
    proj4string(line) <-CRS("+proj=utm +zone=32 +datum=WGS84")
    

    3D Intersection of raster and spatial line .


    我怎样才能知道这条线是否与障碍物相交,以及在哪里相交?这是否一定是一个3D问题,或者也可以在2D中解决?我在不同的解决方案上搜索了很长时间,但还没有找到任何有用的方法。

    1 回复  |  直到 7 年前
        1
  •  0
  •   JMenezes    7 年前

    有一个简单的解决方案,但肯定不是最有效的。假设光栅中单元的值为高度。

    e<-extract(r,line,cellnumbers=T)[[1]]
    

    给出了线穿过的每个单元格的高度,以及我们稍后需要的单元格编号。

    下一步是计算这些单元格中线条的高度。因为有起点和终点,所以可以计算斜率。

    slope <- (line@data[1,2]-line@data[1,1])/dist(cbind(x,y))
    

    cellcenters <- xyFromCell(r, e[,1], spatial=FALSE) #find the coordinates for the center of the cell
    dists <- spDistsN1(cellcenters, c(x[1],y[1]), longlat = FALSE) #calculate the distance to the beginning of the line
    height <- dists*slope
    

    现在,为了找到交点,我们只需要看看线的高度在哪里小于或等于从光栅中提取的值:

    any(height<=e[,2])