Converting Alpha-Shapes into SP Objects

Submitted by dylan on Mon, 2010-04-19 21:11.

Just read about a new R package called alphahull (paper) that sounds like it might be a good candidate for addressing this request regarding concave hulls. Below are some notes on computing alpha-shapes and alpha-hulls from spatial data and converting the results returned by ashape() and ahull() into SP-class objects. Note that the functions are attached at the bottom of the page. Be sure to read the license for the alphahull package if you plan to use it in your work.

Alpha-Shape ExampleAlpha-Shape Example

## not widely tested!

# need these


# read point vector in from GRASS
x <- readVECT6('rtk_pts_5_1')

# extract coordinates
x.coords <- coordinates(x)

# alpha-shape: 100 meter threshold <- ashape(x.coords[,1], x.coords[,2], alpha=100)

# alpha-hull: 30 meter threshold
x.ah <- ahull(x.coords[,1], x.coords[,2], alpha=30)

plot(, cex=0.5, pch=4, xlab='Easting (m)', ylab='Northing (m)', main=expression(paste('100m ', alpha, '-Shape')), asp=1)

plot(x.ah, cex=0.5, pch=4, xlab='Easting (m)', ylab='Northing (m)', main=expression(paste('30m ', alpha, '-Hull')), asp=1)

## convert into SP objects

# alpha-shape <- ashape_to_SPLDF(, proj4string=x@proj4string)

# alpha-hull
x.ah.spldf <- ahull_to_SPLDF(x.ah, proj4string=x@proj4string)

# check: OK
pdf(file='ashape_ahull_demo.pdf', width=6, height=6)
lines(x.ah.spldf, col='red')
points(x, cex=0.5, pch=4, col='blue')
legend('bottomright', legend=c(expression(paste('100m ', alpha, '-Shape')), expression(paste('30m ', alpha, '-Hull')), 'Observation'), lty=c(1,1,NA), pch=c(NA,NA,4), col=c('black', 'red', 'blue'), bty='n')

# save back to GRASS: OK
writeVECT6(, 'rtk_ashape')

# save back to GRASS: OK
writeVECT6(x.ah.spldf, 'rtk_ahull')

alpha-functions.R2.06 KB

alphashape to qgis


I have been trying unsuccessfully to import alpha shapes produced by alphahull into QGIS. I ran into your code and I think it might be what I'm looking for. I am not using GRASS but regular SHP files. The alphahull function does create the alpha shape but your alpha-functions choke on the resulting hull.

This is what I'm trying:

polyg = readOGR("/path/to/shapefile",layer="somelayer")
pts=spsample(polyg,n=1000,type="regular") = ashape(coordinates(pts),alpha=0.9)
output = ashape_to_SPLDF(, proj4string=pts@proj4string)

The error I get is:

Error in Lines(l.list, ID = as.character(1:nrow( :
Single ID required
Calls: ashape_to_SPLDF -> Lines
Execution halted

Any help will be greatly appreciated! I have tried dozens of different options and am at a loss!


Mauricio Giraldo
New York Public Library Labs