Cosa sono la definizione, gli algoritmi e le soluzioni pratiche per lo scafo concavo? [chiuso]


116

Scafo convesso

Uno scafo convesso di una forma è definito come:

In matematica, lo scafo convesso o l'inviluppo convesso per un insieme di punti X in uno spazio vettoriale reale V è l'insieme convesso minimo contenente X ( Wikipedia )

Wikipedia lo visualizza bene usando un'analogia con l'elastico, e ci sono alcuni buoni algoritmi per calcolarlo .

Scafo concavo

Uno scafo concavo viene visualizzato utilizzando la linea rossa nell'immagine seguente (la linea blu visualizza lo scafo convesso). Intuitivamente, è un poligono che abbraccia tutti i punti, ma ha un'area (minima?) Minore rispetto allo scafo convesso. Di conseguenza, la lunghezza del contorno del poligono è più lunga.

Uno scafo concavo può essere la soluzione per alcuni problemi del mondo reale (ad esempio, trovare il limite ragionevole di una città).

inserisci qui la descrizione dell'immagine

Non sono riuscito a trovare una definizione, un algoritmo e una soluzione pratica adeguati per l'idea di uno scafo concavo. Il Wiki Grass ha alcune descrizioni e immagini , e c'è una soluzione commerciale in concavehull.com .

Qualche idea, algoritmo e link?


In quale contesto desideri generare scafi / forme alfa concavi? In PostGIS, ArcMap, una mappa web, il tuo software?
fmark

Sia PostGIS che i miei script Python.
Adam Matan,

Esiste una versione di implementazione C ++ compatibile con Linux dell'algoritmo concave dello scafo?
Sylv255

Se hai una nuova domanda, chiedila facendo clic sul pulsante Poni domanda . Includi un link a questa domanda se aiuta a fornire un contesto. - Dalla recensione
Evil Genius

Computational Geometry Algorithms Library (CGAL) è una libreria C ++ con Alpha Shapes. Ha un download Linux ed è concesso in licenza come GPL / LGPL per la versione> = 4.0.
Klewis

Risposte:


57

Come sottolinea scw , vuoi un'implementazione delle forme α .

Le forme alfa possono essere considerate una generalizzazione dello scafo convesso. Sono stati descritti per la prima volta nel 1981 in:

Edelsbrunner, H .; Kirkpatrick, D .; Seidel, R .; , "Sulla forma di una serie di punti nel piano", Teoria dell'informazione, Transazioni IEEE su, vol.29, n. 4, pagg. 551-559, luglio 1983

Esistono implementazioni open source per gli ambienti a cui sei interessato:

PostGIS

Se si utilizza lo stack PostGIS, l' estensione opzionale Driving Distance di pgRouting espone un'implementazione a forma di alfa. Non sono sicuro se è possibile variare il parametro alfa, tuttavia.

L'uso è sotto:

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');

Pitone

Probabilmente ci sono molti moduli Python che potresti usare. Ho sentito cose positive su CGAL , una libreria di geometria computazionale C ++. Involucri pitone esistono per parti di CGAL, tra esponendo di CGAL attuazione forma alfa a Python .

Tenere presente che alcune parti di CGAL sono concesse in licenza in base al QPL, il che significa che se si distribuisce il programma, collegato a CGAL, potrebbe essere necessario rilasciarlo in base al QPL. Va bene mantenere il codice proprietario se non si ridistribuisce il codice del programma o i file binari.


Non riesco a compilare i wrapper Python di CGAL --- sembra che questi non siano stati supportati da un po 'e non funzionino più con una versione recente di CGAL.
Conradlee,

2
@fmark: il secondo link che hai pubblicato sembra essere morto.
Radek,

1
@fmark I link PostGIS sembrano essere morti ..
radek,


29

Questa sembra essere un'applicazione specifica delle forme alfa , che dalla mia lettura rappresentano una forma più generale di questo problema. R ha il modulo alphahull , che ha un'ottima documentazione sul calcolo delle forme alfa . Controlla anche questo sfondo dettagliato sulle forme alfa. Se vuoi solo calcolare scafi convessi / concavi, controlla lasboundary , parte di lastools , si ridimensiona bene e può gestire milioni di punti di input.

Infine, questa interessante applicazione di forme alfa di Flickr ha fatto il giro un po 'di tempo fa, mostrando la loro utilità per aggregare il contenuto dei punti generati dagli utenti:

scafo alfa del texas da flickr


1
OMG la fonte è scritta in FORTRAN :-)
Adam Matan il

C'è il pacchetto clustr scritto in C ++ se ti va meglio; ma fai attenzione con la licenza su CGAL: github.com/straup/Clustr
scw

2
Bel esempio del mondo reale.
DavidF,


19

Ho creato uno strumento altamente efficiente, chiamato [lasboundary] [1,2], che calcola uno scafo concavo per LIDAR in formato LAS / LAZ / SHP / ASCII e memorizza il risultato come poligono di confine vettoriale in formato ESRI Shapefile o geo file KML con riferimento.

Ecco un esempio:

C:\lastools\bin>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

Alcune immagini dei risultati sono qui .



10

Ecco una funzione R che implementa il modello Alpha Hull. L'output è un oggetto poligono sp. Vedi l'esempio nell'intestazione. Richiede i pacchetti sp, alphahull e maptools.

** Aggiornamento (01-15-2018) Vi sono state numerose modifiche agli oggetti risultanti prodotti dal pacchetto alphahull. Come tale, avevo bisogno di riscrivere la funzione. Ho aggiunto una funzione convexHull al pacchetto spatialEco. Tuttavia, a causa delle restrizioni di licenza nel pacchetto alphahull, questa funzione è disponibile solo nella versione di sviluppo su GitHub. La versione di sviluppo può essere installata utilizzando:

library(devtools)
install_github("jeffreyevans/spatialEco")

Ecco un esempio dell'uso delle funzioni

library(sp)
library(spatialEco)
data(meuse)
 coordinates(meuse) = ~x+y
a <- convexHull(meuse, alpha=100000)
  plot(a)
    points(meuse, pch=19)

Converti SpatialLinesDataFrame risultante in SpatialPolygonsDataFrame

library(sf)
a <- sf::st_as_sf(a) 
a <- sf::st_polygonize(a)
class( a <- as(a, "Spatial") )
  plot(a)

Prova più valori alfa

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))      
   }

vari parametri alfa ahull


+1 Potresti spiegare in che modo differisce dal pacchetto di forme alfa ?
whuber

3
L'output dell'oggetto alphahull è memorizzato come matrice e deve essere forzato su un oggetto sp utilizzabile. Considererei questa una funzione di "aiuto" per creare un poligono che può essere esportato in un formato GIS. Questa funzione utilizza il pacchetto alphahull per creare l'oggetto matrice scafo, crea un oggetto sp e quindi esplode lo slot poligono in modo che sia un oggetto dataframe poligonale a parte singola. Nella guida del pacchetto non viene visualizzato nulla, ma potrebbe esserci una coercizione nativa recentemente implementata su un oggetto di classe sp di cui non sono a conoscenza. Se questo è il caso, per favore fatemi sapere in modo da poter disattivare questa funzione.
Jeffrey Evans,

Qual è il linguaggio di programmazione?
Adam Matan,

Grazie @JeffreyEvans sono riuscito a farlo funzionare. Potresti forse spiegare i parametri? Ho dato un'occhiata al documento jstatsoft collegato, ma è piuttosto impenetrabile.
geoteca

9

JTS ( http://tsusiatsoftware.net/jts/main.html ) fornisce un'implementazione dello scafo convesso. Martin Davies ha anche detto di avere un algoritmo Alpha Shape in lavorazione, quindi potresti voler controllare il repository SVN per vedere se è ancora presente se è quello che vuoi.


Ancora nessuna implementazione concava di forme scafo / alfa a partire da giugno 2012, per quanto ne so.
blah238,

Ancora niente nel maggio 2013.
Crescent Fresh

JTS è vivo? L'ultima versione è del 19 dic 2006. vividsolutions.com/jts/JTSHome.htm
angelcervera

prova il link nella risposta
Ian Turton

JTS è ora su Github ed è in arrivo la versione 1.15: github.com/locationtech/jts Sebbene per quanto ne sappia, non sembra esserci ancora un'implementazione di Alpha Shapes.
Colin Woodbury,


7

Ecco un programma scritto in C che calcola scafi convessi, forme alfa, triangluazioni Delauney e volumi Voronoi:

  • Hull - Ken Clarkson (2002)

Un altro algoritmo di scafo convesso con implementazioni C e Java è qui:


7

Per aggiungere le risposte precedenti a questo post, almeno a partire da QGIS 2.6 ha un algoritmo di scafo concavo

Parametri
Livello punto di input [vettore: punto]
inserire qui la descrizione del parametro

Soglia (0-1, dove 1 equivale a Convex Hull) [numero]
inserire qui la descrizione del parametro
Predefinito: 0,3

Consenti fori [booleano]
inserisci qui la descrizione del parametro
Predefinito: Vero

Dividi geometria multipart in geometrie singleparts [booleano]
Impostazione predefinita: Falso

Output Scafo concavo [vettore]
inserisci qui la descrizione dell'output

Utilizzo della console
processing.runalg ('qgis: concavehull', input, alpha, holes, no_multigeometry, output)

Inoltre, Esri ha uno strumento Geometria limite minima (Gestione dati)

Ciò consente di scegliere il tipo di geometria, che include lo scafo convesso

inserisci qui la descrizione dell'immagine



3

Aiutare con la parte "corretta definizione" della tua domanda; potresti aver guardato https://en.wikipedia.org/wiki/Convex_hull e ottenuto quella che potrebbe essere considerata una definizione "corretta", ma trovarla carente, quindi forse una definizione più "utile" è:

Per ogni punto all'interno di uno scafo convesso, una linea retta verso qualsiasi punto non all'interno dello scafo interseca lo scafo solo una volta.

Questo è utile perché, dato un punto, puoi costruire una linea attraverso di essa e testare quella linea costruita che interseca i segmenti dello scafo.

  • Nessun incrocio il punto non è nello scafo.
  • Un incrocio il punto è sullo scafo.
  • Due incroci il punto è all'interno dello scafo
  • Una linea retta non può intersecare uno scafo convesso più di due volte

2
l'operazione chiede informazioni sugli scafi concavi e non sugli scafi convessi
vinto il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.