İçbükey Gövde Tanımı, Algoritmaları ve Pratik Çözümleri Nelerdir? [kapalı]


116

Dışbükey örtü

Bir şeklin dışbükey bir kabuğu şöyle tanımlanır:

Matematikte, gerçek bir vektör uzayında (X) bir dizi nokta için dışbükey gövde veya dışbükey zarf, X ( Wikipedia ) içeren minimum dışbükey kümedir.

Wikipedia bir lastik bant benzetmesi kullanarak güzel bir şekilde görselleştiriyor ve hesaplamak için bazı iyi algoritmalar var .

İçbükey Hull

Bir içbükey gövde aşağıdaki resimde kırmızı çizgi kullanılarak görselleştirilir (mavi çizgi dışbükey gövdeyi görselleştirir). Sezgisel olarak, tüm noktaları kucaklayan ancak dışbükey gövdeye kıyasla daha az (en az?) Alana sahip bir çokgendir. Sonuç olarak, çokgenin sınır uzunluğu daha uzundur.

İçbükey bir gövde, bazı gerçek dünya problemlerinin çözümü olabilir (örneğin, bir şehrin makul sınırlarını bulmak).

görüntü tanımını buraya girin

İçbükey Gövde kavramı için uygun bir tanım, algoritma ve pratik bir çözüm bulamadım. Çim Wiki bazı açıklamalar ve resimler vardır ve ticari bir çözüm yoktur concavehull.com .

Herhangi bir fikir, algoritma ve bağlantı var mı?


Hangi bağlamda içbükey gövde / alfa şekilleri oluşturmak istiyorsunuz? PostGIS'te, bir web haritası olan ArcMap, kendi yazılımınız mı?
fmark

Hem PostGIS hem de kendi Python scriptlerim.
Adam Matan

İçbükey gövde algoritmasının uygulanmasının C ++ Linux uyumlu bir sürümü var mı?
Sylv255

Yeni bir sorunuz varsa, lütfen Soru Sor düğmesine tıklayarak sorun . Bağlam sağlamaya yardımcı oluyorsa, bu soruya bir bağlantı ekleyin. - Şu kaynaktan
Evil Genius

Hesaplamalı Geometri Algoritmaları Kütüphanesi (CGAL), Alpha Shapes içeren bir C ++ kütüphanesidir. Bir Linux indirme sistemine sahiptir ve>> 4.0 sürümü için GPL / LGPL olarak lisanslanmıştır.
klewis

Yanıtlar:


57

Scw'in işaret ettiği gibi , α-şekillerinin uygulanmasını istersiniz .

Alfa şekilleri dışbükey gövdenin genelleştirilmesi olarak düşünülebilir. İlk olarak 1981’de:

Edelsbrunner, H .; Kirkpatrick, D; Seidel, R.; , "Düzlemdeki bir dizi nokta biçiminde," Bilgi Teorisi, IEEE İşlemleri, c.29, no.4, sf. 551-559, Tem 1983

İlgilendiğiniz ortamlar için açık kaynak uygulamaları var:

PostGIS

Eğer PostGIS yığını kullanıyorsanız, pgRouting 'ın opsiyonel Sürüş Mesafe uzantısı bir alfa şekil uygulamasını ortaya çıkarır. Ancak, alfa parametresini değiştirebildiğinizden emin değilim.

Kullanım aşağıda:

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

piton

Muhtemelen kullanabileceğiniz birçok python modülü vardır. C ++ hesaplamalı bir geometri kütüphanesi olan CGAL hakkında iyi şeyler duydum . Python sarmalayıcıları CGAL en açığa dahil CGAL bölgelerinde, şu ana kadar alfa şekil uygulanmasını için Python .

CGAL’nin bazı bölümlerinin QPL kapsamında lisanslı olduğunu unutmayın; bu, programınızı dağıtırsanız, CGAL’ye bağlı olarak QPL altında yayınlamanız gerekebileceği anlamına gelir. Program kodunuzu veya ikili dosyalarınızı yeniden dağıtamazsanız, kodunuzu özel tutmak iyidir.


CGAL'in python sarmalayıcılarını derleme yapamıyorum - bunların bir süredir desteklenmediği ve yeni bir CGAL sürümü ile çalışmadığı görülüyor.
conradlee

2
@fmark: Gönderdiğiniz ikinci bağlantı ölü gibi görünüyor.
radek

1
@fmark PostGIS bağlantıları ölü gibi görünüyor ..
radek


29

Bu , bu problemin daha genel bir formunu okuduğumdan, alfa şekillerinin özel bir uygulaması gibi görünüyor . R, alfa şekilleri hakkında mükemmel belgeleri olan alfa modülüne sahiptir . Ayrıca , alfa şekillerdeki bu ayrıntılı arka planı da kontrol edin . Eğer sadece dışbükey / içbükey gövdeleri hesaplamak istiyorsanız, lastoollerin bir parçası olan kuyu sınırlarını kontrol edin , iyi ölçeklenir ve milyonlarca giriş noktasını idare edebilir.

Son olarak, Flickr'ın alfa şekillerinin bu ilginç uygulaması, bir süre önce turu gerçekleştirdi ve kullanıcı tarafından oluşturulan nokta içeriğinin toplanmasına yardımcı oldu:

texas'ın flickr'dan alfa gövdesi


1
OMG kaynak FORTRAN :-)'da yazılmıştır
Adam Matan

Size daha uygunsa, C ++ ile yazılmış clustr paketi var; fakat CGAL'deki lisanslama konusunda dikkatli olun: github.com/straup/Clustr
scw

2
Güzel gerçek dünya örneği.
DavidF


19

LAS / LAZ / SHP / ASCII formatında LIDAR için içbükey bir gövde hesaplayan ve sonucu ESRI Shapefile biçiminde veya bir coğrafyada vektör sınır poligonu olarak saklayan, [lasboundary] [1,2] adlı yüksek verimli bir araç yarattım referanslı KML dosyası.

İşte bir örnek çalışma:

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

Bazı sonuç resimleri burada .



10

İşte Alfa Hull modelini uygulayan bir R işlevi. Çıktı, bir sp çokgen nesnesidir. Lütfen başlıktaki örneğe bakın. Sp, alphahull ve maptools paketlerini gerektirir.

** Güncelleme (01-15-2018) alphahull paketi tarafından üretilen sonuç nesnelerinde çok sayıda değişiklik yapıldı. Bu nedenle, işlevi yeniden yazmak gerekiyordu. SpatialEco paketine bir convexHull işlevi ekledim. Ancak, alphahull paketindeki lisanslama kısıtlamaları nedeniyle, bu işlev yalnızca GitHub'daki geliştirme sürümünde kullanılabilir. Geliştirme sürümü aşağıdakiler kullanılarak kurulabilir:

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

İşlev kullanımına bir örnek

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

Elde edilen SpatialLinesDataFrame öğesini SpatialPolygonsDataFrame öğesine dönüştürün

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

Birden çok alfa değerini test et

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

çeşitli ahull alfa parametreleri


+1 Bunun alfa şekilleri paketinden ne kadar farklı olduğunu açıklayabilir misiniz ?
whuber

3
Alphahull nesnesinin çıktısı bir matris olarak saklanır ve kullanılabilir bir sp nesnesine zorlanmalıdır. Bunun bir GIS formatına dışa aktarılabilen bir çokgen oluşturmak için bir "yardımcı" işlevi olduğunu düşünürdüm. Bu işlev, gövde matris nesnesini oluşturmak için alphahull paketini kullanır, bir sp nesnesi oluşturur ve ardından çokgen yuvasını patlatarak tek parçalı çokgen veri çerçevesi nesnesidir. Paketin yardımında hiçbir şey görünmüyor, ancak bilmediğim bir sp sınıfı nesneye yeni uygulanan yerel zorlama olabilir. Bu durumda lütfen bana bildirin, böylece bu işlevi devre dışı bırakabilirim.
Jeffrey Evans,

Programlama dili nedir?
Adam Matan

Teşekkürler @JeffreyEvans Bu çalışmayı başarmayı başardım. Parametreleri açıklayabilir misiniz? Bağlantılı jstatsoft kağıdına bir göz atmıştım, ama bu kesinlikle aşılamaz.
geotheory

9

JTS ( http://tsusiatsoftware.net/jts/main.html ) bir Dışbükey Gövde uygulaması sağlar. Martin Davies ayrıca çalışmalarında bir Alpha Shape algoritmasına sahip olduğundan bahsetti, böylece SVN deposunu kontrol etmek isteyip istemediğinizi kontrol etmek isteyebilirsiniz.


Yine de içbükey gövde / alfa, Haziran 2012'den itibaren uygulayabildiğim kadarıyla uygulamayı şekillendirmiyor.
blah238

Hala Mayıs 2013'te hiçbir şey yok.
Crescent Fresh

JTS yaşıyor mu? Son sürüm 19 Aralık 2006’dan itibarendir
angelcervera


JTS şu an Github'da ve 1.15 versiyonuna yaklaşıyor: github.com/locationtech/jts Anlatabildiğim kadarıyla hala bir Alpha Shapes uygulaması gibi görünmüyor.
Colin Woodbury


7

İşte dışbükey gövdeleri, alfa şekilleri, Delauney üçgenlerini ve Voronoi hacimlerini hesaplayan C dilinde yazılmış bir program:

  • Hull - Ken Clarkson (2002)

C ve Java uygulamaları ile başka bir dışbükey gövde algoritması burada:


7

Bu yazı için önceki cevaplara eklemek için, en azından QGIS 2.6'dan itibaren içbükey gövde algoritması var.

Parametreler
Giriş noktası katmanı [vector: point]
, parametre açıklamasını buraya koy

Eşik (0-1, burada 1, Convex Hull ile eşdeğerdir) [sayı]
burada parametre tanımını koyuyor
Varsayılan: 0.3

Deliklerin [boolean]
parametre açıklamasını buraya koymasına izin ver
Varsayılan: Doğru

Çok parçalı geometriyi tek parça geometrilere ayırın [boolean]
Varsayılan: Yanlış

Çıktılar İçbükey gövde [vektör]
çıktı tanımını buraya koy

Konsol kullanımı
processing.runalg ('qgis: concavehull', giriş, alfa, delikler

Ayrıca, Esri'nin bir Minimum Sınırlama Geometrisi aracı vardır (Veri Yönetimi)

Dışbükey gövde içeren geometri tipini seçmenize izin verir

görüntü tanımını buraya girin



3

Sorunuzun "doğru tanım" kısmına yardım etmek için; https://en.wikipedia.org/wiki/Convex_hull sayfasını incelemiş ve "uygun" bir tanım olarak kabul edilebilecek bir şey bulmuş olabilirsiniz, ancak eksik buldum, belki de "faydalı" bir tanım:

İçin her bir dışbükey gövdesinde noktasına kadar düz bir çizgi herhangi değil gövde içinde noktadan yalnızca bir kez gövdeyi kesişecektir.

Bu yararlıdır, çünkü bir noktaya göre bir çizgi oluşturabilir ve gövdenin kesişen kesimlerini oluşturan bu çizgi için test yapabilirsiniz.

  • Kavşak yok, nokta gövdede değil.
  • Bir kesişme noktası, gövde üzerindedir.
  • İki kesişme noktası gövde içindedir.
  • Düz bir çizgi dışbükey bir kabuğu iki defadan fazla kesişemez

2
op içbükey gövdeler hakkında sorular soruyor ve dışbükey gövdeler değil
winwaed
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.