Định nghĩa, thuật toán và giải pháp thực tế cho thân lõm là gì? [đóng cửa]


116

Thân lồi

Một thân lồi có hình dạng được định nghĩa là:

Trong toán học, vỏ lồi hoặc đường bao lồi cho một tập hợp các điểm X trong không gian vectơ thực V là tập lồi tối thiểu chứa X ( Wikipedia )

Wikipedia hình dung nó độc đáo bằng cách sử dụng một sự tương tự dải cao su, và có một số thuật toán tốt để tính toán nó .

Thân lõm

Một thân tàu lõm được hiển thị bằng cách sử dụng đường màu đỏ trong hình ảnh bên dưới (đường màu xanh hiển thị thân tàu lồi). Theo trực giác, nó là một đa giác bao gồm tất cả các điểm, nhưng có diện tích (tối thiểu?) Ít hơn so với thân tàu lồi. Kết quả là, chiều dài ranh giới của đa giác dài hơn.

Một thân tàu lõm có thể là giải pháp cho một số vấn đề trong thế giới thực (ví dụ: tìm ranh giới hợp lý của một thành phố).

nhập mô tả hình ảnh ở đây

Tôi đã thất bại trong việc tìm ra một định nghĩa, thuật toán và giải pháp thực tế phù hợp cho khái niệm Hull lõm. Các Grass Wiki có một số giới thiệu và hình ảnh , và có một giải pháp thương mại trong concavehull.com .

Bất kỳ ý tưởng, thuật toán và liên kết?


Trong bối cảnh nào bạn muốn tạo ra hình dạng vỏ / hình lõm alpha? Trong PostGIS, ArcMap, bản đồ web, phần mềm của riêng bạn?
đánh dấu

Cả PostGIS và các tập lệnh Python của riêng tôi.
Adam Matan

Có phiên bản tương thích C ++ Linux để thực hiện thuật toán vỏ lõm không?
Sylv255

Nếu bạn có một câu hỏi mới, vui lòng hỏi nó bằng cách nhấp vào nút Đặt câu hỏi . Bao gồm một liên kết đến câu hỏi này nếu nó giúp cung cấp bối cảnh. - Từ đánh giá
Evil Genius

Thư viện thuật toán hình học tính toán (CGAL) là một thư viện C ++ với Alpha Shapes. Nó có bản tải xuống Linux và được cấp phép dưới dạng GPL / LGPL cho phiên bản> = 4.0.
klewis

Câu trả lời:


57

Như scw chỉ ra , bạn muốn thực hiện các hình dạng α .

Hình dạng Alpha có thể được coi là một khái quát của thân lồi. Chúng được mô tả lần đầu tiên vào năm 1981 tại:

Edelsbrunner, H.; Kirkpatrick, Đ.; Seidel, R.; , "Về hình dạng của một tập hợp các điểm trong mặt phẳng", Lý thuyết thông tin, Giao dịch của IEEE trên, tập 29, số 4, trang 551- 559, tháng 7 năm 1983

Các triển khai nguồn mở tồn tại cho các môi trường mà bạn quan tâm:

PostGIS

Nếu bạn đang sử dụng ngăn xếp PostGIS, tiện ích mở rộng Khoảng cách lái xe tùy chọn của pgRouting sẽ hiển thị triển khai hình dạng alpha. Tôi không chắc chắn nếu bạn có thể thay đổi tham số alpha, tuy nhiên.

Cách sử dụng là dưới đây:

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

Con trăn

Có thể có nhiều mô-đun python bạn có thể sử dụng. Tôi đã nghe những điều tốt về CGAL , một thư viện hình học tính toán C ++. Các trình bao bọc Python tồn tại cho các phần của CGAL, bao gồm hiển thị triển khai hình dạng alpha của CGAL cho Python .

Xin lưu ý rằng các phần của CGAL được cấp phép theo QPL, điều đó có nghĩa là nếu bạn phân phối chương trình của mình, được liên kết với CGAL, bạn có thể cần phải phát hành nó theo QPL. Bạn có thể giữ mã của mình độc quyền nếu bạn không phân phối lại mã chương trình hoặc mã nhị phân.


Tôi không thể biên dịch các hàm bao trăn của CGAL để biên dịch --- có vẻ như chúng không được hỗ trợ trong một thời gian và không còn hoạt động với phiên bản CGAL gần đây.
conradlee

2
@fmark: Liên kết thứ hai bạn đăng dường như đã chết.
radek

1
@fmark Các liên kết PostGIS dường như đã chết ..
radek


29

Đây dường như là một ứng dụng cụ thể của các hình dạng alpha , từ việc tôi đọc một dạng tổng quát hơn của vấn đề này. R có mô-đun alphahull , có tài liệu tuyệt vời về tính toán các hình dạng alpha . Cũng kiểm tra nền chi tiết này trên hình dạng alpha. Nếu bạn chỉ muốn tính toán các thân lồi / lõm, hãy kiểm tra lasransary , một phần của công cụ cuối cùng , nó có tỷ lệ tốt và có thể xử lý hàng triệu điểm đầu vào.

Cuối cùng, ứng dụng thú vị này về hình dạng alpha của Flickr đã thực hiện các vòng trước đây, cho thấy tiện ích của chúng để tổng hợp nội dung điểm do người dùng tạo:

vỏ alpha của texas từ flickr


1
OMG nguồn được viết bằng FORTRAN :-)
Adam Matan

Có gói clustr được viết bằng C ++ nếu phù hợp với bạn hơn; nhưng hãy cẩn thận với việc cấp phép trên CGAL: github.com/straup/Clustr
scw

2
Ví dụ thực tế tốt đẹp.
DavidF


19

Tôi đã tạo ra một công cụ hiệu quả cao, được gọi là [lasboundary] [1,2], tính toán vỏ tàu lõm cho LIDAR ở định dạng LAS / LAZ / SHP / ASCII và lưu trữ kết quả dưới dạng đa giác ranh giới vector ở định dạng ESRI Shapefile hoặc địa lý tệp KML được ước tính.

Dưới đây là một ví dụ chạy:

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

Một số hình ảnh kết quả là ở đây .



10

Đây là một hàm R thực hiện mô hình Alpha Hull. Đầu ra là một đối tượng đa giác sp. Xin vui lòng xem ví dụ trong tiêu đề. Nó đòi hỏi các gói sp, alphahull và maptools.

** Cập nhật (01-15-2018) Đã có nhiều thay đổi đối với các đối tượng kết quả được tạo bởi gói alphahull. Như vậy, tôi cần phải viết lại chức năng. Tôi đã thêm một hàm lồi vào gói spatialEco. Tuy nhiên, do hạn chế cấp phép trong gói alphahull, chức năng này chỉ khả dụng trong phiên bản phát triển trên GitHub. Phiên bản phát triển có thể được cài đặt bằng cách sử dụng:

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

Dưới đây là một ví dụ về việc sử dụng các chức năng

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

Chuyển đổi SpatialLinesDataFrame kết quả thành SpatialPolygonsDataFrame

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

Kiểm tra nhiều giá trị 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))      
   }

nhiều tham số alpha khác nhau


+1 Bạn có thể giải thích điều này khác với gói hình dạng alpha không?
whuber

3
Đầu ra của đối tượng alphahull được lưu trữ dưới dạng ma trận và phải được ép buộc vào một đối tượng sp có thể sử dụng. Tôi sẽ coi đây là một chức năng "người trợ giúp" để tạo ra một đa giác có thể được xuất sang định dạng GIS. Hàm này sử dụng gói alphahull để tạo đối tượng ma trận thân tàu, tạo đối tượng sp và sau đó khám phá khe đa giác để nó là đối tượng khung dữ liệu đa giác một phần. Không có gì hiển thị trong gói trợ giúp nhưng có thể có sự ép buộc bản địa mới được thực hiện đối với một đối tượng lớp sp mà tôi không biết. Nếu đây là trường hợp xin vui lòng cho tôi biết để tôi có thể ngừng hoạt động chức năng này.
Jeffrey Evans

Ngôn ngữ lập trình là gì?
Adam Matan

Cảm ơn @JeffreyEvans tôi đã quản lý để làm việc này. Bạn có thể giải thích các thông số? Tôi đã xem qua bài báo jstatsoft được liên kết, nhưng nó không thể xuyên thủng.
địa lý

9

JTS ( http://tsusiatsoftware.net/jts/main.html ) cung cấp triển khai Convex Hull. Martin Davies cũng đề cập đến việc có một thuật toán Alpha Shape trong các tác phẩm để bạn có thể muốn kiểm tra kho SVN để xem nó có ở trong đó không nếu đó là những gì bạn muốn.


Vẫn không có triển khai hình dạng vỏ / alpha lõm vào tháng 6 năm 2012 như tôi có thể nói.
blah238

Vẫn không có gì trong tháng 5 năm 2013.
Lưỡi liềm tươi

JTS còn sống không? Phiên bản cuối cùng là từ ngày 19 tháng 12 năm 2006. vividsolutions.com/jts/JTSHome.htmlm
angelcervera

thử liên kết trong câu trả lời
Ian Turton

JTS hiện đã có trên Github và là phiên bản tiếp cận 1.15: github.com/locationtech/jts Mặc dù theo như tôi có thể nói, dường như vẫn chưa có triển khai Alpha Shapes.
Colin Woodbury


7

Đây là một chương trình được viết bằng C, tính toán vỏ lồi, hình dạng alpha, tam giác Delauney và khối lượng Voronoi:

Một thuật toán vỏ lồi khác với các triển khai CJava có ở đây:


7

Để thêm vào các câu trả lời trước cho bài đăng này, ít nhất là trong QGIS 2.6 có thuật toán thân tàu lõm

Tham số
Lớp điểm đầu vào [vector: point]
đặt mô tả tham số ở đây

Ngưỡng (0-1, trong đó 1 tương đương với Convex Hull) [số]
đặt mô tả tham số ở đây
Mặc định: 0,3

Cho phép lỗ [boolean]
đặt mô tả tham số ở đây
Mặc định: True

Tách hình học nhiều phần thành hình học đơn [boolean]
Mặc định: Sai

Đầu ra Vỏ lõm [vector]
đặt mô tả đầu ra ở đây

Việc sử dụng bảng điều khiển đang
xử lý. Bộ điều khiển ('qgis: concavehull', đầu vào, alpha, lỗ, no_multigeometry, đầu ra)

Ngoài ra, Esri có một công cụ Hình học giới hạn tối thiểu (Quản lý dữ liệu)

Cho phép bạn chọn loại hình học, bao gồm thân lồi

nhập mô tả hình ảnh ở đây



3

Để giúp với phần "định nghĩa đúng" trong câu hỏi của bạn; bạn có thể đã xem https://en.wikipedia.org/wiki/Convex_hull và nhận được định nghĩa "đúng", nhưng thấy nó thiếu, vì vậy có lẽ định nghĩa "hữu ích" hơn là:

Đối với mọi điểm bên trong thân tàu lồi, một đường thẳng đến bất kỳ điểm nào không nằm trong thân tàu sẽ chỉ giao nhau với thân tàu một lần.

Điều này rất hữu ích vì được cho một điểm bạn có thể xây dựng một đường xuyên qua nó và kiểm tra đường thẳng được xây dựng đó giao với các đoạn của thân tàu.

  • Không có giao điểm điểm không nằm trong thân tàu.
  • Một điểm giao nhau là trên thân tàu.
  • Hai điểm giao nhau nằm trong thân tàu
  • Một đường thẳng không thể cắt một thân lồi hơn hai lần

2
op đang hỏi về thân tàu lõm, và không phải thân tàu lồi
winwaed
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.