R 包 concaveman 的替代方案来创建多边形
Alternative for R package concaveman to create polygons
我有一个使用 R 包 'concaveman' 的脚本,但由于 ubuntu 平台上的问题,我需要 运行 我无法安装此包的代码(它我花了三天时间试图解决它)。所以我正在寻找替代方案。
我有一组随机点,范围从 3 到 1000 点不等。我想在最外面的点周围画一个凸 hull/polygon (之后的步骤将是光栅化)。我一直在尝试通过将点转换为栅格,然后使用栅格多边形来做到这一点,但在极少数情况下,点会在同一个栅格单元中,从而导致只有两个独特的点。 Convaveman 会将其变成线性多边形(这是我想要的,无需使用 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,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:
中使用 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))
您可以使用 dismo::convHull
然后使用 predict
或 rasterize
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")
我有一个使用 R 包 'concaveman' 的脚本,但由于 ubuntu 平台上的问题,我需要 运行 我无法安装此包的代码(它我花了三天时间试图解决它)。所以我正在寻找替代方案。
我有一组随机点,范围从 3 到 1000 点不等。我想在最外面的点周围画一个凸 hull/polygon (之后的步骤将是光栅化)。我一直在尝试通过将点转换为栅格,然后使用栅格多边形来做到这一点,但在极少数情况下,点会在同一个栅格单元中,从而导致只有两个独特的点。 Convaveman 会将其变成线性多边形(这是我想要的,无需使用 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,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:
中使用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))
您可以使用 dismo::convHull
然后使用 predict
或 rasterize
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")