Geographic Information Systems Asked by Adam Matan on July 9, 2021
A convex hull of a shape is defined as:
In mathematics, the convex hull or convex envelope for a set of points X in a real vector space V is the minimal convex set containing X (Wikipedia)
Wikipedia visualizes it nicely using a rubber band analogy, and there are some good algorithms to compute it.
A concave hull is visualized using the red line in the image below (the blue line visualizes the convex hull). Intuitively, it is a polygon which embraces all the points, but has less (minimal?) area compared to the convex hull. As a result, the polygon’s boundary length is longer.
A concave hull may be the solution for some real-world problems (e.g. finding the reasonable boundary of a city).
I have failed to find a proper definition, algorithm and practical solution for the notion of a Concave Hull. The Grass Wiki has some descriptions and images, and there is a commercial solution in concavehull.com.
Any ideas, algorithms and links?
As scw points out, you want an implementation of α-shapes.
Alpha shapes can be considered a generalisation of the convex hull. They were first described in 1981 in:
Edelsbrunner, H.; Kirkpatrick, D.; Seidel, R.; , "On the shape of a set of points in the plane," Information Theory, IEEE Transactions on , vol.29, no.4, pp. 551- 559, Jul 1983
Open source implementations exist for the environments you are interested in:
If you are using the PostGIS stack, pgRouting's optional Driving Distance extension exposes an alpha shape implementation. I'm not sure if you can vary the alpha parameter, however.
Usage is below:
SELECT the_geom AS alpha_shape
FROM
points_as_polygon(
'SELECT id, ST_X(your_geom) AS x, ST_Y(your_geom) AS y FROM your_table');
There are probably many python modules you could use. I have heard good things about CGAL, a C++ computational geometry library. Python wrappers exist for parts of CGAL, including exposing CGAL's alpha shape implementation to Python.
Be aware that parts of CGAL are licensed under the QPL, which means that if you distribute your program, linked to CGAL, you may need to release it under the QPL. It is fine to keep your code proprietary if you do not redistribute your program code or binaries.
Correct answer by fmark on July 9, 2021
This seems to be a specific application of alpha shapes, which are from my reading a more general form of this problem. R has the alphahull module, which has excellent documentation on computing alpha shapes. Also check this detailed background on alpha shapes. If you only want to compute convex/concave hulls, check out lasboundary, part of lastools, it scales well and can handle millions of input points.
Finally, this interesting application of alpha shapes by Flickr made the rounds a while ago, showing their utility for aggregating user generated point content:
Answered by scw on July 9, 2021
Here is what you are looking for.
You can download and test the program: (in java, under GPL license)
The paper presenting the algorithm is there:
Answered by julien on July 9, 2021
JTS (https://github.com/locationtech/jts) provides a Convex Hull implementation. Martin Davies also mentioned having an Alpha Shape algorithm in the works so you might want to check the SVN repository to see if it is in yet if that's what you want.
Answered by Ian Turton on July 9, 2021
About R implementation Alpha-Shapes, there's an article about "Converting Alpha-Shapes into SP Objects"
It's based on alphahull, sp and spgrass6 http://casoilresource.lawr.ucdavis.edu/drupal/node/919
Answered by ThomasG77 on July 9, 2021
Speaking about JTS, you can use Geoscript for manipulating JTS library. http://geoscriptblog.blogspot.com/2010/06/unwrapped-jts-with-python.html for an article about convex hull. GeoScript implementations are available in JavaScript, Python, Scala, and Groovy. The official website : http://geoscript.org
Answered by ThomasG77 on July 9, 2021
There is an implementation of ST_ConcaveHull in PostGIS trunk. http://postgis.net/docs/ST_ConcaveHull.html
Answered by Nicklas Avén on July 9, 2021
I created a highly-efficient tool, called lasboundary (1,2), that computes a concave hull for LIDAR in LAS/LAZ/SHP/ASCII format and stores the result as a vector boundary polygon in ESRI Shapefile format or a geo-referenced KML file.
Here is an example run:
C:lastoolsbin>lasboundary -i SerpentMound.las -o SerpentMound_boundary.shp
reading 3265110 points and computing convex hull for 3265110 points
growing inward towards concave hull (with concavity = 50)
outputting the concave hull
concave hull has 1639 points
Some result pictures are here.
Answered by Martin Isenburg on July 9, 2021
Here's a program written in C that computes convex hulls, alpha shapes, Delauney triangluations and Voronoi volumes:
Another convex hull algorithm with C and Java implementations is here:
Answered by blah238 on July 9, 2021
Here is an R function that implements the Alpha Hull model. The output is an sp polygon object. Please see the example in the header. It requires the sp, alphahull and maptools packages.
**Update (01-15-2018) There have been numerous changes to the resulting objects produced by the alphahull package. As such, I needed to rewrite the function. I added a convexHull function to the spatialEco package. However, due to licensing restrictions in the alphahull package this function is only available in the development version on GitHub. The development version can be installed using:
library(devtools)
install_github("jeffreyevans/spatialEco")
Here is an example of the functions usage
library(sp)
library(spatialEco)
data(meuse)
coordinates(meuse) = ~x+y
a <- convexHull(meuse, alpha=100000)
plot(a)
points(meuse, pch=19)
Convert the resulting SpatialLinesDataFrame to SpatialPolygonsDataFrame
library(sf)
a <- sf::st_as_sf(a)
a <- sf::st_polygonize(a)
class( a <- as(a, "Spatial") )
plot(a)
Test multiple alpha values
par(mfcol=c(2,2))
for (a in c(500, 1500, 5000, 100000)) {
ch <- convexHull(meuse, alpha = a)
plot(ch)
points(meuse, pch=19)
title( paste0("alpha=", a))
}
Answered by Jeffrey Evans on July 9, 2021
There is a new Addon for GRASS GIS 7 available: v.concave.hull. See also http://grasswiki.osgeo.org/wiki/Create_concave_hull
Answered by markusN on July 9, 2021
To help with the "proper definition" part of your question; you may have looked at https://en.wikipedia.org/wiki/Convex_hull and gotten what could well be considered a "proper" definition, but found it lacking, so perhaps a more "useful" definition is:
For every point inside a convex hull, a straight line to any point not within the hull will only intersect the hull once.
This is useful because given a point you can construct a line through it and test for that constructed line intersecting segments of the hull.
Answered by user29206 on July 9, 2021
To add to previous answers for this post, at least as of QGIS 2.6 does have concave hull algorithm
Parameters
Input point layer [vector: point]
put parameter description hereThreshold (0-1, where 1 is equivalent with Convex Hull) [number]
put parameter description here
Default: 0.3Allow holes [boolean]
put parameter description here
Default: TrueSplit multipart geometry into singleparts geometries [boolean]
Default: FalseOutputs Concave hull [vector]
put output description hereConsole usage
processing.runalg('qgis:concavehull', input, alpha, holes, no_multigeometry, output)
Also, Esri has a tool Minimum Bounding Geometry (Data Management)
Which allows you to choose the geometry type, which includes convex hull
Answered by whyzar on July 9, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP