Is there an efficient algorithm to generate a 2D concave hull?
Asked Answered
K

10

67

Having a set of (2D) points from a GIS file (a city map), I need to generate the polygon that defines the 'contour' for that map (its boundary). Its input parameters would be the points set and a 'maximum edge length'. It would then output the corresponding (probably non-convex) polygon.

The best solution I found so far was to generate the Delaunay triangles and then remove the external edges that are longer than the maximum edge length. After all the external edges are shorter than that, I simply remove the internal edges and get the polygon I want. The problem is, this is very time-consuming and I'm wondering if there's a better way.

Kopp answered 17/9, 2008 at 14:4 Comment(15)
You say you have a gis file - are you not using a GIS mapping application / software? I know that ArcGIS server will happily consume any number of points and draw up a map overlain with the resulting polygon.Dogy
Yes, I have a GIS file but I need to write the algorithm (in C or C++, probably), this is to be placed inside an already existing program and it shouldn't use external tools (like ArcGIS) to do that, it needs to be self-contained.Kopp
Actually, I don't think ArcGIS has a built-in algorithm to do what he wants. ArcGIS has the ability to do convex hulls, but concave ones are considerably more complicated.Shondrashone
Could you define your problem more precisely? :) With 5 points: 4 corners of a square, and its centre. What would your boundary be? If your maximum edge length allowed the centre, it's completely arbitrary as to which of the 4 edges of the square you would 'bend in' to include the middle point.Rheology
In the example you gave, the answer would always be the square. As a general rule, given each point, and having the distances for the 2 nearest other points, you can assume that the maximum edge length would never be smaller than the second one - so there should never be 'orphaned' points.Kopp
@Fabio Ceconello - Did you ever implement an algorithm for this?Kranz
Yes, I did, the way I mentioned in the question (with the Delaunay triangles). Later I did some work on the alpha shapes concept pointed by nsanders below, but before I made it work the issue got its priority lowered and I moved to another one.Kopp
Delaunay has correct complexity (O(n log n)). I doubt you can do much better asymptotically.Causative
You've accepted an answer after just 9 years!Linstock
@Linstock I had accepted an answer right away, but it was removed later for some reason, so when I noticed that I accepted another - that would be my "second best".Kopp
@Linstock I'm of the opinion no answer should be accepted until someone provides proper code. If Fabio posts even a snippet his code, I would upvote his over any of these answers and downvote all the rest to move it up the listDeste
Also, I'm confused about your solution. Did you have to manually remove edges, or was your solution automatic? (ie. code solved the whole thing end-to-end) At the very least, it sounds like you had to pick the "maximum edge length" by trial and error, rather than in any algorithmic wayDeste
@Linstock thinking about it I guess you're right, I'll leave it without an accepted answer. About the snippet, I'll have to revisit some old code and I don't even remember how small (or big) such snippet would be and how much I'll have to edit to make it understandable. If feasible, I'll post it.Kopp
@frank It was not manual, it was part of an automated tool to process maps for a GPS nav app. It was indeed arbitrary in my specific case - the points were street corners, and the resulting polygon would be the contour for a city. I used an arbitrary value that would give me a detailed enough polygon that wouldn't be too heavy to render. I think it has to be this way, you have to determine the maximum length according to the needs of your application - I don't see how you could calculate it automatically beforehand.Kopp
@FabioCeconello Noo! If the answer answers the question, then accept it! I was so happy that I found the longest accepted question, I didn't want you unaccept it!Linstock
C
5

This paper discusses the Efficient generation of simple polygons for characterizing the shape of a set of points in the plane and provides the algorithm. There's also a Java applet utilizing the same algorithm here.

Carbo answered 15/2, 2014 at 10:19 Comment(3)
Link dead. Java source seems to be at ambientspatial.net/ddo/?p=143Dogy
@Dogy The second link is also deadAngeles
@Angeles Wow, that was six years ago. I really can't remember a thing about it now, sorry.Dogy
K
11

One of the former students in our lab used some applicable techniques for his PhD thesis. I believe one of them is called "alpha shapes" and is referenced in the following paper:

http://www.cis.rit.edu/people/faculty/kerekes/pdfs/AIPR_2007_Gurram.pdf

That paper gives some further references you can follow.

Kid answered 17/9, 2008 at 14:24 Comment(2)
alpha shapes are based on the Delaunay triangulation, so it will for sure involve one Delaunay trinagulation computationMantra
It seems to me alpha shapes is only a concept.Misnomer
C
5

This paper discusses the Efficient generation of simple polygons for characterizing the shape of a set of points in the plane and provides the algorithm. There's also a Java applet utilizing the same algorithm here.

Carbo answered 15/2, 2014 at 10:19 Comment(3)
Link dead. Java source seems to be at ambientspatial.net/ddo/?p=143Dogy
@Dogy The second link is also deadAngeles
@Angeles Wow, that was six years ago. I really can't remember a thing about it now, sorry.Dogy
P
3

The guys here claim to have developed a k nearest neighbors approach to determining the concave hull of a set of points which behaves "almost linearly on the number of points". Sadly their paper seems to be very well guarded and you'll have to ask them for it.

Here's a good set of references that includes the above and might lead you to find a better approach.

Potential answered 17/9, 2008 at 14:39 Comment(2)
It looks like this is the paper in question: repositorium.sdum.uminho.pt/bitstream/1822/6429/1/… The idea is exceptionally clever and simple--it's just a straightforward modification of the Graham scan technique for convex nulls, as far as I understand it. No need for finding a Delaunay triangulation, etc.Ferroelectric
Said paper name is "Concave hull: a k-nearest neighbours approach for the computation of the region occupied by a set of points" It's available here: repositorium.sdum.uminho.pt/handle/1822/6429Oilstone
T
2

The answer may still be interesting for somebody else: One may apply a variation of the marching square algorithm, applied (1) within the concave hull, and (2) then on (e.g. 3) different scales that my depend on the average density of points. The scales need to be int multiples of each other, such you build a grid you can use for efficient sampling. This allows to quickly find empty samples=squares, samples that are completely within a "cluster/cloud" of points, and those, which are in between. The latter category then can be used to determine easily the poly-line that represents a part of the concave hull.

Everything is linear in this approach, no triangulation is needed, it does not use alpha shapes and it is different from the commercial/patented offering as described here ( http://www.concavehull.com/ )

Trochee answered 29/1, 2012 at 15:40 Comment(0)
L
1

A quick approximate solution (also useful for convex hulls) is to find the north and south bounds for each small element east-west.

Based on how much detail you want, create a fixed sized array of upper/lower bounds. For each point calculate which E-W column it is in and then update the upper/lower bounds for that column. After you processed all the points you can interpolate the upper/lower points for those columns that missed.

It's also worth doing a quick check beforehand for very long thin shapes and deciding wether to bin NS or Ew.

Layne answered 17/9, 2008 at 14:25 Comment(0)
R
1

Good question! I haven't tried this out at all, but my first shot would be this iterative method:

  1. Create a set N ("not contained"), and add all points in your set to N.
  2. Pick 3 points from N at random to form an initial polygon P. Remove them from N.
  3. Use some point-in-polygon algorithm and look at points in N. For each point in N, if it is now contained by P, remove it from N. As soon as you find a point in N that is still not contained in P, continue to step 4. If N becomes empty, you're done.
  4. Call the point you found A. Find the line in P closest to A, and add A in the middle of it.
  5. Go back to step 3

I think it would work as long as it performs well enough — a good heuristic for your initial 3 points might help.

Good luck!

Rikki answered 17/9, 2008 at 14:37 Comment(0)
S
1

A simple solution is to walk around the edge of the polygon. Given a current edge om the boundary connecting points P0 and P1, the next point on the boundary P2 will be the point with the smallest possible A, where

H01 = bearing from P0 to P1
H12 = bearing from P1 to P2
A = fmod( H12-H01+360, 360 )
|P2-P1| <= MaxEdgeLength

Then you set

P0 <- P1
P1 <- P2

and repeat until you get back where you started.

This is still O(N^2) so you'll want to sort your pointlist a little. You can limit the set of points you need to consider at each iteration if you sort points on, say, their bearing from the city's centroid.

Seclusion answered 17/9, 2008 at 14:42 Comment(0)
D
1

You can do it in QGIS with this plug in; https://github.com/detlevn/QGIS-ConcaveHull-Plugin

Depending on how you need it to interact with your data, probably worth checking out how it was done here.

Dangerfield answered 18/2, 2016 at 23:1 Comment(0)
T
1

As a wildly adopted reference, PostGIS starts with a convexhull and then caves it in, you can see it here.

https://github.com/postgis/postgis/blob/380583da73227ca1a52da0e0b3413b92ae69af9d/postgis/postgis.sql.in#L5819

Theravada answered 29/11, 2017 at 18:14 Comment(0)
A
1

The Bing Maps V8 interactive SDK has a concave hull option within the advanced shape operations.

https://www.bing.com/mapspreview/sdkrelease/mapcontrol/isdk/advancedshapeoperations?toWww=1&redig=D53FACBB1A00423195C53D841EA0D14E#JS

Within ArcGIS 10.5.1, the 3D Analyst extension has a Minimum Bounding Volume tool with the geometry types of concave hull, sphere, envelope, or convex hull. It can be used at any license level.

There is a concave hull algorithm here: https://github.com/mapbox/concaveman

Abell answered 13/2, 2018 at 22:6 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.