A reader recently posted a comment on my plotting convex hull post asking how to calculate the area of a convex hull. While this never occurred to me before, I decided to make a quick post on how to do it. To make this snippet of script work, you’ll need to install the package “sp” using the `install.pacakages()`

function.

First I’ll create some dummy data, in this case, it will be a simple box (so we can make sure that the area is correct):

box.coords <- matrix(c(1, 1,
4, 1,
1, 4,
4, 4), nrow = 4, ncol = 2, byrow = T)
plot(box.coords[,1], box.coords[,2], pch = 20)

We have a square with sides of length 3. So, we know beforehand that we should get an area of 9. Next, we will use the `chull()`

to extract the coordinates that make up the convex hull (in this case, all of the points, since we only have 4 points!). Also, we’ll need to close the convex hull by repeating the first row in the last row. The reason for this will be apparent in minute. Finally, we create a new matrix with the convex hull points, that includes the repeated coordinates to close off the convex hull:

box.hpts <- chull(x = box.coords[,1], y = box.coords[,2])
box.hpts <- c(box.hpts, box.hpts[1])
box.chull.coords <- box.coords[box.hpts,]

Finally, we load the “sp” package so we can use the function `Polygon()`

. If you read the help files for `Polygon()`

, you’ll see the first argument is the a two row matrix of coordinates (x, y), with the coordinates in the first repeated again in the last row (aha!) This will close off the polygon and allow `Polygon()`

to calculate an area. To extract the area of the polygon, you need to access the attributes of a SpatialPolygon object, using the `@area`

symbol:

chull.poly <- Polygon(box.chull.coords, hole=F)
chull.area <- chull.poly@area
> chull.area
[1] 9

Not too hard! You can do this with any polygon, as long as it is a valid SpatialPolygon object. Here is a quick examples using more realistic data:

library(sp)
x1 <- rnorm(100, 0.8, 0.3)
y1 <- rnorm(100, 0.8, 0.3)
hpts <- chull(x = x1, y = y1)
hpts <- c(hpts, hpts[1])
xy.coords <- cbind(x1, y1)
chull.coords <- xy.coords[hpts,]
chull.poly <- Polygon(chull.coords, hole=F)
chull.area <- chull.poly@area

Just remember, that calculating an area of a convex hull only makes sense if the units of the X and Y axes are the same. Hope this answers the question!

### Like this:

Like Loading...

*Related*