Apa itu Definisi, Algoritma, dan Solusi Praktis untuk Concave Hull? [Tutup]


116

Convex Hull

Lambung cembung bentuk didefinisikan sebagai:

Dalam matematika, cembung cembung atau amplop cembung untuk satu set titik X dalam ruang vektor nyata V adalah set cembung minimal yang berisi X ( Wikipedia )

Wikipedia memvisualisasikannya dengan baik menggunakan analogi karet gelang, dan ada beberapa algoritma yang baik untuk menghitungnya .

Cekung Hull

Lambung cekung divisualisasikan menggunakan garis merah pada gambar di bawah (garis biru memvisualisasikan lambung cembung). Secara intuitif, ini adalah poligon yang mencakup semua titik, tetapi memiliki area (minimal?) Lebih sedikit dibandingkan dengan cembung cembung. Akibatnya, panjang batas poligon lebih panjang.

Lambung cekung dapat menjadi solusi untuk beberapa masalah dunia nyata (misalnya menemukan batas kota yang wajar).

masukkan deskripsi gambar di sini

Saya gagal menemukan definisi yang tepat, algoritme, dan solusi praktis untuk gagasan tentang Concave Hull. The Wiki Rumput memiliki beberapa deskripsi dan gambar , dan ada solusi komersial di concavehull.com .

Adakah ide, algoritme, dan tautan?


Dalam konteks apa Anda ingin membuat bentuk lambung cekung / alfa? Di PostGIS, ArcMap, peta web, perangkat lunak Anda sendiri?
fmark

Baik PostGIS dan skrip Python saya sendiri.
Adam Matan

Apakah ada versi implementasi algoritma concave hull yang kompatibel dengan C ++ Linux?
Sylv255

Jika Anda memiliki pertanyaan baru, silakan tanyakan dengan mengklik tombol Ajukan Pertanyaan . Sertakan tautan ke pertanyaan ini jika itu membantu memberikan konteks. - Dari Ulasan
Evil Genius

Computational Geometry Algorithms Library (CGAL) adalah perpustakaan C ++ dengan Bentuk Alpha. Ini memiliki unduhan Linux dan dilisensikan sebagai GPL / LGPL untuk versi> = 4.0.
klewis

Jawaban:


57

Seperti yang ditunjukkan oleh scw , Anda menginginkan implementasi bentuk-a .

Bentuk alfa dapat dianggap sebagai generalisasi cembung cembung. Mereka pertama kali dijelaskan pada tahun 1981 di:

Edelsbrunner, H .; Kirkpatrick, D .; Seidel, R .; , "Pada bentuk seperangkat titik di pesawat," Teori Informasi, Transaksi IEEE on, vol.29, no.4, hlm. 551-559, Jul 1983

Implementasi open source ada untuk lingkungan yang Anda minati:

PostGIS

Jika Anda menggunakan tumpukan PostGIS, ekstensi Driving Distance opsional pgRouting memperlihatkan implementasi bentuk alpha. Saya tidak yakin apakah Anda dapat memvariasikan parameter alpha.

Penggunaan di bawah:

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

Python

Mungkin ada banyak modul python yang bisa Anda gunakan. Saya telah mendengar hal-hal baik tentang CGAL , pustaka geometri komputasi C ++. Pembungkus Python ada untuk bagian-bagian CGAL, termasuk mengekspos implementasi bentuk alpha CGAL ke Python .

Ketahuilah bahwa sebagian CGAL dilisensikan di bawah QPL, yang berarti bahwa jika Anda mendistribusikan program Anda, yang tertaut ke CGAL, Anda mungkin perlu merilisnya di bawah QPL. Tidak apa-apa menjaga kode Anda tetap milik jika Anda tidak mendistribusikan kembali kode program atau binari Anda.


Saya tidak bisa membuat pembungkus python dari CGAL untuk dikompilasi --- sepertinya ini belum didukung dalam beberapa saat dan tidak lagi bekerja dengan versi CGAL terbaru.
conradlee

2
@ tanda: Tautan kedua yang Anda poskan tampaknya sudah mati.
radek

1
@ tanda tautan PostGIS sepertinya sudah mati ..
radek


29

Ini tampaknya merupakan aplikasi spesifik dari bentuk alpha , yang dari bacaan saya bentuk yang lebih umum dari masalah ini. R memiliki modul alphahull , yang memiliki dokumentasi yang sangat baik tentang komputasi bentuk alpha . Periksa juga latar belakang terperinci ini pada bentuk alfa. Jika Anda hanya ingin menghitung lambung cembung / cekung, periksa lasboundary , bagian dari lastools , itu skala dengan baik dan dapat menangani jutaan titik input.

Akhirnya, aplikasi bentuk alpha yang menarik ini oleh Flickr membuat putaran beberapa waktu lalu, menunjukkan utilitas mereka untuk mengumpulkan konten titik yang dibuat pengguna:

alpha hull dari texas dari flickr


1
Sumber OMG ditulis dalam FORTRAN :-)
Adam Matan

Ada paket clustr yang ditulis dalam C ++ jika itu cocok untuk Anda; tapi hati-hati dengan lisensi pada CGAL: github.com/straup/Clustr
scw

2
Contoh dunia nyata yang bagus.
DavidF


19

Saya membuat alat yang sangat efisien, yang disebut [perbatasan] [1,2], yang menghitung lambung cekung untuk LIDAR dalam format LAS / LAZ / SHP / ASCII dan menyimpan hasilnya sebagai poligon batas vektor dalam format ESRI Shapefile atau geo File KML-direferensikan.

Ini adalah contoh run:

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

Beberapa gambar hasil ada di sini .



10

Berikut adalah fungsi R yang mengimplementasikan model Alpha Hull. Outputnya adalah objek sp poligon. Silakan lihat contoh di header. Ini membutuhkan paket sp, alphahull dan maptools.

** Pembaruan (01-15-2018) Ada banyak perubahan pada objek yang dihasilkan yang dihasilkan oleh paket alphahull. Karena itu, saya perlu menulis ulang fungsinya. Saya menambahkan fungsi convexHull ke paket spatialEco. Namun, karena pembatasan lisensi dalam paket alphahull fungsi ini hanya tersedia dalam versi pengembangan di GitHub. Versi pengembangan dapat diinstal menggunakan:

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

Berikut adalah contoh penggunaan fungsi

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

Ubah SpatialLinesDataFrame yang dihasilkan menjadi SpatialPolygonsDataFrame

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

Uji beberapa nilai alpha

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

berbagai parameter ahull alpha


+1 Bisakah Anda menjelaskan bagaimana ini berbeda dari paket bentuk alpha ?
whuber

3
Output dari objek alphahull disimpan sebagai matriks dan harus dipaksa ke objek sp yang dapat digunakan. Saya akan menganggap ini sebagai fungsi "pembantu" untuk membuat poligon yang dapat diekspor ke format GIS. Fungsi ini menggunakan paket alphahull untuk membuat objek matriks lambung, membuat objek sp dan kemudian meledak slot poligon sehingga merupakan objek dataframe poligon bagian tunggal. Tidak ada yang muncul dalam bantuan paket tetapi mungkin ada pemaksaan asli yang baru diimplementasikan ke objek kelas sp yang saya tidak sadari. Jika demikian, beri tahu saya agar saya dapat menonaktifkan fungsi ini.
Jeffrey Evans

Apa bahasa pemrogramannya?
Adam Matan

Terima kasih @JeffreyEvans, saya berhasil membuatnya berfungsi. Bisakah Anda menjelaskan parameternya? Saya telah melihat kertas jstatsoft yang ditautkan, tetapi cukup sulit ditembus.
geoteori

9

JTS ( http://tsusiatsoftware.net/jts/main.html ) menyediakan implementasi Convex Hull. Martin Davies juga menyebutkan memiliki algoritma Bentuk Alpha dalam karya sehingga Anda mungkin ingin memeriksa repositori SVN untuk melihat apakah ada di belum jika itu yang Anda inginkan.


Masih tidak ada penerapan bentuk cekung hull / alpha per Juni 2012 sejauh yang saya tahu.
blah238

Masih belum ada di bulan Mei 2013.
Crescent Fresh

Apakah JTS hidup? Versi terakhir adalah dari 19 Desember 2006. vividsolutions.com/jts/JTSHome.htm
angelcervera

coba tautan di jawabannya
Ian Turton

JTS sekarang ada di Github, dan sedang mendekati versi 1.15: github.com/locationtech/jts Meskipun sejauh yang saya tahu, tampaknya masih belum ada implementasi Alpha Shapes.
Colin Woodbury


7

Berikut adalah program yang ditulis dalam C yang menghitung lambung cembung, bentuk alfa, triangluasi Delauney, dan volume Voronoi:

  • Hull - Ken Clarkson (2002)

Algoritma convex hull lain dengan implementasi C dan Java ada di sini:


7

Untuk menambah jawaban sebelumnya untuk posting ini, setidaknya pada QGIS 2.6 memang memiliki algoritma cekung lambung

Parameter
Lapisan titik masukan [vektor: titik]
masukkan deskripsi parameter di sini

Ambang batas (0-1, di mana 1 sama dengan Convex Hull) [angka]
masukkan deskripsi parameter di sini
Default: 0.3

Izinkan lubang [boolean]
masukkan deskripsi parameter di sini
Default: True

Membagi geometri multi bagian menjadi geometri singleparts [boolean]
Default: False

Keluaran Cekung lambung [vektor]
masukkan deskripsi keluaran di sini


Processing.runal penggunaan penggunaan konsol ('qgis: concavehull', input, alpha, lubang, no_multigeometry, output)

Juga, Esri memiliki alat Minimum Bounding Geometry (Manajemen Data)

Yang memungkinkan Anda untuk memilih jenis geometri, yang termasuk convex hull

masukkan deskripsi gambar di sini



3

Untuk membantu bagian "definisi yang tepat" dari pertanyaan Anda; Anda mungkin telah melihat https://en.wikipedia.org/wiki/Convex_hull dan mendapatkan apa yang bisa dianggap sebagai definisi yang "tepat", tetapi ternyata tidak ada, jadi mungkin definisi yang lebih "berguna" adalah:

Untuk setiap titik di dalam lambung cembung, garis lurus untuk setiap titik tidak dalam lambung hanya akan berpotongan lambung sekali.

Ini berguna karena diberikan titik Anda dapat membangun garis melaluinya dan menguji untuk garis yang dibangun memotong segmen lambung.

  • Tidak ada titik persimpangan tidak di lambung.
  • Satu persimpangan titik adalah di lambung kapal.
  • Dua persimpangan titiknya adalah di dalam lambung
  • Garis lurus tidak dapat memotong lambung cembung lebih dari dua kali

2
op bertanya tentang lambung cekung, dan bukan lambung cembung
ditangguhkan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.