R封装凹面人创建多边形的替代方法

问题描述

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

我有一组随机的点,范围是3到1000s。我想在最外面的点周围绘制一个凸包/多边形(第二步是栅格化)。我一直在尝试通过将点转换为栅格,然后使用栅格多边形的方法来完成此操作,但是在极少数情况下,点将位于同一栅格像元中,从而仅产生两个唯一点。 Convaveman会将其制成线性多边形(这是我想要的,而无需使用凹面人)。这是可能有问题的输入数据:

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 +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中使用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),])))
#> POLYGON ((167.117 -20.833,166.8667 -20.6333,166.867 -20.633,167.117 -20.833))
,

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

library(dismo)
xy <- cbind(x=c(1,1,2,2),y=c(3,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")