如何解决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
,然后再使用predict
或rasterize
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")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。