คำจำกัดความอัลกอริธึมและแนวทางแก้ปัญหาสำหรับเรือเว้าคืออะไร [ปิด]


116

ฮัลล์นูน

ฮัลล์นูนของรูปร่างถูกกำหนดเป็น:

ในวิชาคณิตศาสตร์เปลือกนูนหรือซองจดหมายนูนสำหรับชุดของจุด X ในพื้นที่เวกเตอร์จริง V เป็นชุดนูนน้อยที่สุดที่มี X ( Wikipedia )

วิกิพีเดีย visualizes มันอย่างใช้ยางวงคล้ายคลึงและมีบางขั้นตอนวิธีการที่ดีในการคำนวณมัน

ลำเรือเว้า

ฮัลล์แบบเว้าจะเห็นภาพโดยใช้เส้นสีแดงในภาพด้านล่าง (เส้นสีน้ำเงินแสดงภาพของตัวนูน) โดยสังหรณ์ใจมันเป็นรูปหลายเหลี่ยมที่รวบรวมทุกจุด แต่มีพื้นที่น้อย (น้อยที่สุด) เมื่อเทียบกับตัวเรือนูน เป็นผลให้ความยาวขอบเขตของรูปหลายเหลี่ยมยาวกว่า

ฮัลล์แบบเว้าอาจเป็นวิธีการแก้ปัญหาในโลกแห่งความจริงบางอย่าง (เช่นการหาขอบเขตที่เหมาะสมของเมือง)

ป้อนคำอธิบายรูปภาพที่นี่

ฉันไม่สามารถหาคำจำกัดความที่เหมาะสมอัลกอริทึมและวิธีแก้ปัญหาในทางปฏิบัติสำหรับแนวคิดของเรือเว้า หญ้าวิกิพีเดียมีรายละเอียดบางส่วนและภาพและมีวิธีการแก้ปัญหาในเชิงพาณิชย์ในconcavehull.com

ความคิดอัลกอริทึมและลิงก์ใด ๆ


ในบริบทใดที่คุณต้องการสร้างรูปร่างฮัลล์ / อัลฟาเว้า? ใน PostGIS, ArcMap, แผนที่เว็บ, ซอฟต์แวร์ของคุณเองหรือ
fmark

ทั้ง PostGIS และสคริปต์ Python ของฉันเอง
Adam Matan

มี C ++ Linux รุ่นที่ใช้งานร่วมกับอัลกอริทึมฮัลล์เว้าได้หรือไม่?
Sylv255

หากคุณมีคำถามใหม่โปรดขอได้โดยคลิกที่ถามคำถามปุ่ม รวมลิงค์ไปยังคำถามนี้หากช่วยระบุบริบท - จากการทบทวน
Evil Genius

Computational Geometry Algorithms Library (CGAL) เป็นห้องสมุด C ++ ที่มีรูปร่างแบบอัลฟ่า มีการดาวน์โหลด Linux และได้รับสิทธิ์การใช้งานเป็น GPL / LGPL สำหรับรุ่น> = 4.0
klewis

คำตอบ:


57

ในฐานะที่เป็นSCW ชี้ให้เห็นที่คุณต้องการการดำเนินการของαรูปร่าง

รูปร่างของอัลฟ่านั้นถือได้ว่าเป็นลักษณะทั่วไปของตัวเรือนูน พวกเขาอธิบายครั้งแรกในปี 1981 ใน:

Edelsbrunner, H.; Kirkpatrick, D. ; Seidel, R.; , "บนรูปร่างของชุดของจุดในระนาบ" ทฤษฎีข้อมูลธุรกรรม IEEE บน, vol.29, no.4, pp. 551- 559, ก.ค. 1983

มีการนำโอเพ่นซอร์สมาใช้สำหรับสภาพแวดล้อมที่คุณสนใจ:

PostGIS

หากคุณใช้กองซ้อน PostGIS ส่วนขยาย Driving Distance ที่เป็นตัวเลือกของpgRoutingจะทำให้เกิดการใช้รูปร่างอัลฟ่า ฉันไม่แน่ใจว่าคุณสามารถเปลี่ยนแปลงพารามิเตอร์อัลฟาได้หรือไม่

การใช้งานด้านล่าง:

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

หลาม

อาจมีโมดูลหลามจำนวนมากที่คุณสามารถใช้ได้ ฉันเคยได้ยินเรื่องดีๆเกี่ยวกับCGALซึ่งเป็นห้องสมุดคำนวณเรขาคณิต C ++ ห่องูหลามที่มีอยู่สำหรับส่วนของ CGAL รวมทั้งการเปิดเผย CGAL ของการดำเนินงานรูปทรงอัลฟาจะหลาม

โปรดระวังว่าส่วนของ CGAL ได้รับอนุญาตภายใต้ QPL ซึ่งหมายความว่าหากคุณเผยแพร่โปรแกรมของคุณซึ่งเชื่อมโยงกับ CGAL คุณอาจต้องเผยแพร่ภายใต้ QPL เป็นการดีที่จะรักษารหัสของคุณไว้ถ้าคุณไม่แจกจ่ายรหัสโปรแกรมหรือไบนารี


ฉันไม่สามารถรวบรวมไพธัลของ CGAL ได้ - ดูเหมือนว่าสิ่งเหล่านี้ไม่ได้รับการสนับสนุนในขณะที่และไม่สามารถทำงานกับ CGAL เวอร์ชันล่าสุดได้อีกต่อไป
conradlee

2
@fmark: ลิงก์ที่สองที่คุณโพสต์ดูเหมือนว่าจะตาย
radek

1
การเชื่อมโยง @fmark PostGIS ดูเหมือนจะตาย ..
Radek

41

นี่คือสิ่งที่คุณกำลังมองหา

คุณสามารถดาวน์โหลดและทดสอบโปรแกรม: (ใน java ภายใต้ใบอนุญาต GPL)

ข้อความแสดงแทน

กระดาษนำเสนออัลกอริทึมอยู่ที่นั่น:

Duckham, M. , Kulik, L. , Worboys, MF, Galton, A. (2008) การสร้างรูปหลายเหลี่ยมแบบง่ายที่มีประสิทธิภาพสำหรับการจำแนกรูปร่างของชุดของจุดในระนาบ การจดจำรูปแบบ v41, 3224-3236


29

นี่น่าจะเป็นแอพพลิเคชั่นเฉพาะของรูปร่างอัลฟาซึ่งมาจากการอ่านของฉันในรูปแบบทั่วไปของปัญหานี้ R มีโมดูล alphahullซึ่งมีเอกสารที่ดีในการใช้คอมพิวเตอร์รูปทรงอัลฟา ตรวจสอบรายละเอียดพื้นหลังนี้ในรูปร่างอัลฟ่า หากคุณต้องการคำนวณลำตัวนูน / เว้าให้ตรวจสอบlasboundaryซึ่งเป็นส่วนหนึ่งของlastoolsมันปรับขนาดได้ดีและสามารถจัดการกับจุดอินพุตนับล้านได้

ในที่สุดแอปพลิเคชั่นที่น่าสนใจของรูปร่างอัลฟ่าโดย Flickrทำรอบในขณะที่ผ่านมาแสดงยูทิลิตี้ของพวกเขาสำหรับการรวมเนื้อหาที่ผู้ใช้สร้างขึ้น:

alpha hull of texas จาก flickr


1
OMG แหล่งที่มาถูกเขียนใน FORTRAN :-)
Adam Matan

มีแพ็คเกจแบบ clustr ที่เขียนด้วย C ++ ถ้ามันเหมาะกับคุณมากกว่า แต่ต้องระวังด้วยการออกใบอนุญาตใน CGAL: github.com/straup/Clustr
scw

2
ตัวอย่างโลกแห่งความจริงที่ดี
DavidF


19

ฉันสร้างเครื่องมือที่มีประสิทธิภาพสูงเรียกว่า [lasboundary] [1,2] ซึ่งคำนวณลำเรือเว้าสำหรับ LIDAR ในรูปแบบ LAS / LAZ / SHP / ASCII และเก็บผลลัพธ์เป็นรูปหลายเหลี่ยมขอบเขตเวกเตอร์ในรูปแบบ ESRI Shapefile หรือตำแหน่งทางภูมิศาสตร์ - ไฟล์ KML ที่อ้างถึง

นี่คือตัวอย่างการเรียกใช้:

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

บางภาพที่ผลเป็นที่นี่



10

นี่คือฟังก์ชั่น R ที่ใช้อัลฟ่าฮัลล์โมเดล ผลลัพธ์เป็นวัตถุรูปหลายเหลี่ยม sp โปรดดูตัวอย่างในส่วนหัว มันต้องมีแพ็คเกจ sp, alphahull และ maptools

** อัปเดต (01-15-2018) มีการเปลี่ยนแปลงมากมายกับวัตถุที่เป็นผลลัพธ์ที่ผลิตโดยแพคเกจ alphahull ดังนั้นฉันจึงจำเป็นต้องเขียนฟังก์ชันใหม่ ฉันเพิ่มฟังก์ชั่น convexHull ให้กับแพ็คเกจ spatialEco อย่างไรก็ตามเนื่องจากข้อ จำกัด สิทธิ์ใช้งานในแพคเกจ alphahull ฟังก์ชันนี้มีให้เฉพาะในรุ่นที่พัฒนาบน GitHub เท่านั้น เวอร์ชันการพัฒนาสามารถติดตั้งได้โดยใช้:

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

นี่คือตัวอย่างการใช้งานฟังก์ชั่น

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

แปลง SpatialLinesDataFrame ผลลัพธ์เป็น SpatialPolygonsDataFrame

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

ทดสอบค่าอัลฟาหลายค่า

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

พารามิเตอร์ ahull alpha ต่างๆ


+1 คุณสามารถอธิบายได้ว่าสิ่งนี้แตกต่างจากแพ็คเกจรูปร่างอย่างไร
whuber

3
เอาท์พุทของวัตถุอัลฟาฮัลล์จะถูกเก็บไว้เป็นเมทริกซ์และจะต้องรวมเข้ากับวัตถุ sp ที่ใช้งานได้ ฉันจะพิจารณาฟังก์ชันนี้เป็น "ตัวช่วย" เพื่อสร้างรูปหลายเหลี่ยมที่สามารถส่งออกเป็นรูปแบบ GIS ฟังก์ชันนี้ใช้แพคเกจ alphahull เพื่อสร้างวัตถุเมทริกฮัลล์สร้างวัตถุ sp จากนั้นจะกระจายสล็อตโพลีกอนดังนั้นจึงเป็นออบเจ็กต์รูปหลายเหลี่ยมส่วนเดียว ไม่มีสิ่งใดปรากฏขึ้นในความช่วยเหลือของแพคเกจ แต่อาจมีการบีบบังคับดั้งเดิมที่นำไปใช้กับวัตถุคลาส sp ที่ฉันไม่ทราบ หากเป็นกรณีนี้โปรดแจ้งให้เราทราบเพื่อที่ฉันจะได้รื้อถอนฟังก์ชั่นนี้
เจฟฟรีย์อีแวนส์

ภาษาการเขียนโปรแกรมคืออะไร?
Adam Matan

ขอบคุณ @JeffreyEvans ฉันจัดการเพื่อให้การทำงานนี้ คุณสามารถอธิบายพารามิเตอร์ได้หรือไม่? ฉันได้ดูกระดาษ jstatsoft ที่เชื่อมโยงแล้ว แต่มันก็ไม่สามารถยอมรับได้
geotheory

9

JTS ( http://tsusiatsoftware.net/jts/main.html ) ให้การใช้งาน Convex Hull มาร์ตินเดวี่ส์ยังกล่าวถึงการใช้อัลฟ่าอัลฟ่ารูปร่างในงานดังนั้นคุณอาจต้องการตรวจสอบพื้นที่เก็บข้อมูล SVN เพื่อดูว่ามันอยู่ในนั้นหรือไม่ถ้านั่นคือสิ่งที่คุณต้องการ


ยังไม่มีการใช้รูปร่างเว้า / อัลฟ่าเว้า ณ เดือนมิถุนายน 2012 เท่าที่ฉันสามารถบอกได้
blah238

ยังคงไม่มีอะไรในเดือนพฤษภาคม 2013
Crescent Fresh

JTS ยังมีชีวิตอยู่ไหม? รุ่นล่าสุดมาจากวันที่ 19 ธันวาคม 2549 vividsolutions.com/jts/JTSHome.htm
angelcervera

ลองลิงค์ในคำตอบ
เอียน Turton

ตอนนี้ JTS อยู่ใน Github และเป็นรุ่น 1.15: github.com/locationtech/jtsถึงแม้ว่าเท่าที่ฉันจะบอกได้
โคลินวูดเบอรี

9

พูดเกี่ยวกับ JTS คุณสามารถใช้ Geoscript เพื่อจัดการไลบรารี JTS http://geoscriptblog.blogspot.com/2010/06/unwrapped-jts-with-python.htmlสำหรับบทความเกี่ยวกับตัวเรือนูน การใช้งาน GeoScript นั้นมีอยู่ใน JavaScript, Python, Scala และ Groovy เว็บไซต์อย่างเป็นทางการ: http://geoscript.org


7

นี่คือโปรแกรมที่เขียนใน C ซึ่งคำนวณลำตัวนูนรูปร่างอัลฟ่า Delauney triangluations และปริมาตร Voronoi:

อัลกอริธึมฮัลล์นูนอีกอันที่ใช้CและJavaอยู่ที่นี่


7

หากต้องการเพิ่มคำตอบก่อนหน้าสำหรับโพสต์นี้อย่างน้อย QGIS 2.6 จะมีอัลกอริทึมตัวเรือเว้า

พารามิเตอร์
เลเยอร์จุดอินพุต [เวกเตอร์: จุด]
ใส่คำอธิบายพารามิเตอร์ที่นี่

Threshold (0-1 โดยที่ 1 เทียบเท่ากับ Convex Hull) [number]
ใส่คำอธิบายพารามิเตอร์ที่นี่
ค่าเริ่มต้น: 0.3

อนุญาตให้รู [บูลีน]
ใส่คำอธิบายพารามิเตอร์ที่นี่
ค่าเริ่มต้น: จริง

แยกเรขาคณิตหลายส่วนออกเป็นรูปเรขาคณิตส่วนเดียว [บูลีน]
ค่าเริ่มต้น: เท็จ

เอาท์พุทเว้าเรือ [เวกเตอร์]
ใส่คำอธิบายเอาท์พุทที่นี่

การ
ประมวลผลการใช้งานคอนโซลการทำงานร่วมกัน('qgis: concavehull', อินพุต, อัลฟ่า, รู, no_multigeometry, เอาต์พุต)

นอกจากนี้ Esri ยังมีเครื่องมือกำหนดขอบเขตเรขาคณิตขั้นต่ำ (การจัดการข้อมูล)

ซึ่งให้คุณเลือกรูปทรงเรขาคณิตซึ่งรวมถึงตัวเรือนูน

ป้อนคำอธิบายรูปภาพที่นี่



3

เพื่อช่วยในส่วน "คำจำกัดความที่เหมาะสม" ในคำถามของคุณ คุณอาจดูที่ https://en.wikipedia.org/wiki/Convex_hullและได้รับสิ่งที่อาจถือได้ว่าเป็นคำนิยามที่ "เหมาะสม" แต่พบว่ามันขาดไปดังนั้นคำจำกัดความที่มีประโยชน์คือ:

สำหรับทุกจุดภายในตัวเรือนูนเส้นตรงไปยังจุดใด ๆ ที่ไม่ได้อยู่ในตัวถังจะตัดกับตัวเรือเพียงครั้งเดียว

สิ่งนี้มีประโยชน์เพราะให้จุดที่คุณสามารถสร้างเส้นผ่านมันและทดสอบสำหรับเส้นที่สร้างขึ้นนั้นตัดส่วนของตัวเรือ

  • ไม่มีจุดตัดที่ไม่ได้อยู่ในลำเรือ
  • จุดตัดหนึ่งจุดอยู่บนตัวเรือ
  • จุดตัดสองจุดอยู่ภายในตัวถัง
  • เส้นตรงไม่สามารถตัดกันลำเรือนูนได้มากกว่าสองครั้ง

2
op กำลังถามเกี่ยวกับ hulls เว้าและไม่ hulls นูน
winwaed
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.