【问题标题】:Alternative for R package concaveman to create polygonsR包凹人创建多边形的替代方案
【发布时间】:2020-11-08 11:53:19
【问题描述】:

我有一个使用 R 包“concaveman”的脚本,但由于 ubuntu 平台上的问题,我需要在上面运行代码,我无法安装这个包(我花了三天时间试图解决它)。所以我正在寻找替代方案。

我有一组随机的点,从 3 到 1000 点不等。我想在最外面的点周围绘制一个凸包/多边形(之后是光栅化)。我一直试图通过将点转换为栅格,然后使用 rastertopolygons 来做到这一点,但在极少数情况下,点会位于同一个栅格单元中,导致只有两个独特的点。 Convaveman 会将它变成一个线性多边形(这是我想要的,不使用 concaveman)。以下是可能有问题的输入数据:

x <- structure(list(x = c(166.867, 166.867, 167.117, 166.8667), y = c(-20.6333, 
-20.633, -20.833, -20.6333)), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame"))

这是我没有尝试过的(我得到的错误):

SP_pt       <- SpatialPoints(x, proj4string=crs("+proj=longlat +ellps=WGS84 `+towgs84=0,0,0,0,0,0,0 +no_defs"))`
gridded(SP_pt) <- T
SP_pt_R     <- raster(SP_pt)
SP_poly     <- rasterToPolygons(SP_pt_R, dissolve = T)

suggested tolerance minimum: 0.333333 
Error in points2grid(points, tolerance, round) : 
  dimension 1 : coordinate intervals are not constant

【问题讨论】:

    标签: r gis polygon raster


    【解决方案1】:

    您可以在基础 R 中使用chull

    sp::Polygon(x[c(chull(x), chull(x)[1]), ])
    #> An object of class "Polygon"
    #> Slot "labpt":
    #> [1] 166.95023 -20.69977
    #> 
    #> Slot "area":
    #> [1] 6.75e-05
    #> 
    #> Slot "hole":
    #> [1] FALSE
    #> 
    #> Slot "ringDir":
    #> [1] 1
    #> 
    #> Slot "coords":
    #>             x        y
    #> [1,] 167.1170 -20.8330
    #> [2,] 166.8667 -20.6333
    #> [3,] 166.8670 -20.6330
    #> [4,] 167.1170 -20.8330
    
    

    或者如果你想使用sf 包:

    sf::st_polygon(list(as.matrix(x[c(chull(x), chull(x)[1]),])))
    #> POLYGON ((167.117 -20.833, 166.8667 -20.6333, 166.867 -20.633, 167.117 -20.833))
    

    【讨论】:

    • 谢谢!不知何故,我无法将生成的多边形转换为 sf.. 有什么想法吗?
    • 如果我尝试,我会收到以下错误: UseMethod("st_cast") 中的错误:没有适用于 'st_cast' 的方法应用于类 "c('Polygon', 'Line') "
    • @Shark167 如果你想使用sf,为什么不直接创建st_polygon?查看我的更新
    • 好点,但它仍然不会让我光栅化:(函数(类,fdef,mtable)中的错误:无法为签名“XY”找到函数“光栅化”的继承方法", "RasterLayer"' 另外:警告消息:未知或未初始化的列:individualCount
    • 编辑:实际上想使用'fasterize'对其进行光栅化,但这给了我以下消息:fasterize(y,WorldGrd,field = NULL)中的错误:无法使用R函数进行转换:as .data.frame.
    【解决方案2】:

    您可以使用dismo::convHull,然后使用predictrasterize

    library(dismo)
    xy <- cbind(x=c(1,1,2,2), y=c(3,2,1,2))
    # must be matrix or data.frame, not a tbl
    ch <- convHull(xy)
    plot(ch)
    
    # predict
    r <- raster(xmn=0, xmx=5, ymn=0, ymx=5, res=.25)
    p <- predict(ch, r)
    
    # Or rasterize
    sp <- polygons(ch)
    x <- rasterize(sp, r)
    

    为了更快的光栅化,您可以使用terra

    library(terra)
    v <- vect(sp)
    rr <- rast(r)
    y <- rasterize(v, rr)
    

    sp 转换为 sf

    sf <- as(sp, "sf")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 2016-07-28
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多