오목 선체에 대한 정의, 알고리즘 및 실용적인 솔루션은 무엇입니까? [닫은]


116

볼록한 선체

모양의 볼록 껍질은 다음과 같이 정의됩니다.

수학에서 실제 벡터 공간 V의 점 X 세트에 대한 볼록 껍질 또는 볼록 엔벨로프는 X ( Wikipedia )를 포함하는 최소 볼록 세트입니다.

Wikipedia는 고무 밴드 유추를 사용하여 멋지게 시각화하고 그것을 계산하는 좋은 알고리즘이 있습니다 .

오목 선체

아래 선의 빨간색 선을 사용하여 오목 선체를 시각화합니다 (파란 선은 볼록 선체를 나타냅니다). 직관적으로, 그것은 모든 점들을 포함하지만 볼록 껍질과 비교하여 (최소?) 면적이 적은 다각형입니다. 결과적으로 다각형의 경계 길이가 더 깁니다.

오목 선체는 실제 문제에 대한 해결책 일 수 있습니다 (예 : 도시의 합리적인 경계를 찾는 것).

여기에 이미지 설명을 입력하십시오

Concave Hull 개념에 대한 적절한 정의, 알고리즘 및 실용적인 솔루션을 찾지 못했습니다. 잔디 위키는 약간의 설명과 이미지가 하고있는 상용 솔루션이 concavehull.com은 .

어떤 아이디어, 알고리즘 및 링크?


어떤 맥락에서 오목 선체 / 알파 모양을 생성하고 싶습니까? PostGIS에서 ArcMap, 웹 맵, 자신의 소프트웨어?
fmark

PostGIS와 내 자신의 파이썬 스크립트.
Adam Matan

오목 선체 알고리즘의 C ++ Linux 호환 버전 구현이 있습니까?
Sylv255

새로운 질문이 있으면 질문하기 버튼 을 클릭하여 질문하십시오 . 컨텍스트를 제공하는 데 도움이되는 경우이 질문에 대한 링크를 포함하십시오. - 리뷰에서
Evil Genius

CGAL (Computational Geometry Algorithms Library)은 알파 셰이프가있는 C ++ 라이브러리입니다. Linux 다운로드가 있으며 버전이 4.0 이상인 경우 GPL / LGPL로 라이센스가 부여됩니다.
klewis

답변:


57

으로 SCW는 지적 , 당신은의 구현하고자 α-모양 .

알파 모양은 볼록 껍질의 일반화로 간주 될 수 있습니다. 그것들은 1981 년에 처음으로 설명되었습니다 :

Edelsbrunner, H .; 커크 패트릭 D .; 시델, R .; , "평면의 점들의 형태에 관한 것", 정보 이론, IEEE Transactions on, vol.29, no.4, pp. 551-559, 1983 년 7 월

관심있는 환경을위한 오픈 소스 구현이 있습니다.

PostGIS

PostGIS 스택을 사용하는 경우 pgRouting 의 선택적 Driving Distance 확장 은 알파 셰이프 구현을 노출합니다. 그러나 알파 매개 변수를 변경할 수 있는지 확실하지 않습니다.

사용법은 다음과 같습니다.

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

파이썬

사용할 수있는 많은 파이썬 모듈이있을 수 있습니다. C ++ 계산 기하학 라이브러리 인 CGAL에 대해 좋은 소식을 들었습니다 . Python 래퍼는 CGAL의 알파 형태 구현Python에 노출시키는 것을 포함하여 CGAL의 일부에 대해 존재합니다 .

CGAL의 일부는 QPL에 따라 라이센스가 부여됩니다. 즉, CGAL에 링크 된 프로그램을 배포하는 경우 QPL에 따라 프로그램을 릴리스해야 할 수도 있습니다. 프로그램 코드 나 바이너리를 재배포하지 않으면 코드를 독점적으로 유지하는 것이 좋습니다.


CGAL의 파이썬 래퍼를 컴파일 할 수 없습니다 .- 한동안 지원되지 않았으며 더 이상 최신 버전의 CGAL에서 작동하지 않는 것 같습니다.
conradlee

2
@ fmark : 게시 한 두 번째 링크가 죽은 것 같습니다.
radek

1
@fmark PostGIS 링크가 죽은 것 같습니다.
radek


29

이것은 알파 셰이프 의 특정 응용 프로그램 인 것 같습니다 .이 글 에서이 문제의보다 일반적인 형태를 읽었습니다. R에는 alphahull 모듈 이 있으며, 이는 알파 모양 계산에 대한 훌륭한 문서가 있습니다. 또한 알파 모양에 대한 자세한 배경 을 확인하십시오 . 만, 볼록 / 오목 껍질을 계산 체크 아웃 할 경우 lasboundary 의 일부 lastools을 , 그것을 잘 확장 및 입력 포인트의 수백만을 처리 할 수 있습니다.

마지막으로, Flickr 의이 흥미로운 알파 셰이프 응용 프로그램은 얼마 전 라운드를 만들어 사용자가 생성 한 포인트 내용을 집계하는 유틸리티를 보여줍니다.

플리커에서 텍사스의 알파 선체


1
세상에 소스는 FORTRAN으로 작성되었습니다 :-)
Adam Matan

C ++로 작성된 clustr 패키지가 더 적합하다면; 하지만 CGAL에 라이센스와주의 : github.com/straup/Clustr이
SCW

2
좋은 실제 예입니다.
DavidF


19

LAS / LAZ / SHP / ASCII 형식으로 LIDAR의 오목 선체를 계산하고 결과를 ESRI Shapefile 형식 또는 지리적으로 벡터 경계 다각형으로 저장하는 [lasboundary] [1,2]라는 매우 효율적인 도구를 만들었습니다. 참조 된 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

다음은 Alpha Hull 모델을 구현하는 R 함수입니다. 출력은 sp 다각형 객체입니다. 헤더의 예를 참조하십시오. sp, alphahull 및 maptools 패키지가 필요합니다.

** 업데이트 (01-15-2018) alphahull 패키지에서 생성 된 결과 개체에 많은 변경 사항이 있습니다. 따라서 함수를 다시 작성해야했습니다. 공간 절약 패키지에 convexHull 함수를 추가했습니다. 그러나 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
alphahull 객체의 출력은 행렬로 저장되며 사용 가능한 sp 객체로 강제 변환되어야합니다. GIS 형식으로 내보낼 수있는 다각형을 만들기 위해 이것을 "도우미"함수라고 생각합니다. 이 함수는 alphahull 패키지를 사용하여 선체 매트릭스 객체를 만들고 sp 객체를 만든 다음 다각형 슬롯을 분해하여 단일 부분 다각형 데이터 프레임 객체입니다. 패키지 도움말에 아무것도 나타나지 않지만 내가 알지 못하는 sp 클래스 객체에 대해 새로 구현 된 기본 강제 변환이있을 수 있습니다. 이 경우이 기능을 해제 할 수 있도록 알려주십시오.
Jeffrey Evans

프로그래밍 언어는 무엇입니까?
Adam Matan

@JeffreyEvans 감사합니다.이 작업을 수행했습니다. 매개 변수를 설명해 주시겠습니까? 연결된 jstatsoft 용지를 살펴 보았지만 뚫을 수 없습니다.
지리학

9

JTS ( http://tsusiatsoftware.net/jts/main.html )는 Convex Hull 구현을 제공합니다. Martin Davies는 또한 작품에 Alpha Shape 알고리즘이 있다고 언급 했으므로 SVN 저장소가 아직 있는지 여부를 확인하고 싶을 수도 있습니다.


내가 알 수있는 한 2012 년 6 월 현재까지 오목 선체 / 알파 셰이프 구현은 아직 없습니다.
blah238

2013 년 5 월에는 여전히 아무것도 없습니다.
Crescent Fresh

JTS가 살아 있습니까? 마지막 버전 십이 (19)로부터 2006 년이다 vividsolutions.com/jts/JTSHome.htm
angelcervera

답변의 링크를 사용해보십시오
Ian Turton

JTS는 현재 Github에 있으며 접근 방식 버전 1.15입니다 : github.com/locationtech/jts 내가 알 수있는 한 여전히 Alpha Shapes 구현은없는 것 같습니다.
Colin Woodbury


7

C로 작성된 볼록 껍질, 알파 모양,들 로니 삼각 분할 및 보로 노이 볼륨을 계산하는 프로그램은 다음과 같습니다.

  • -켄 클락슨 (2002)

CJava 구현의 또 다른 볼록 껍질 알고리즘 은 다음과 같습니다.


7

이 게시물에 대한 이전 답변에 추가하기 위해 최소한 QGIS 2.6부터 오목 선체 알고리즘이 있습니다.

파라미터
입력 포인트 레이어 [벡터 : 포인트]
여기에 파라미터 설명을 입력하십시오

임계 값 (0-1, 여기서 1은 볼록 껍질과 동일) [숫자]
여기에 매개 변수 설명을 입력하십시오.
기본값 : 0.3

구멍 허용 [부울]
여기에 매개 변수 설명을 입력하십시오.
기본값 : True

멀티 파트 지오메트리를 단일 파트 지오메트리로 분할 [부울]
기본값 : False

출력 오목 선체 [벡터]
여기에 출력 설명을 입력하십시오

콘솔 사용
처리 .runalg ( 'qgis : concavehull', 입력, 알파, 구멍, no_multigeometry, 출력)

또한 Esri에는 최소 경계 지오메트리 (데이터 관리) 도구가 있습니다.

볼록 껍질을 포함한 지오메트리 유형을 선택할 수 있습니다.

여기에 이미지 설명을 입력하십시오



3

질문의 "적절한 정의"부분을 돕기 위해; 당신은 https://en.wikipedia.org/wiki/Convex_hull 을보고 "적절한"정의로 간주 될 수있는 것을 얻었지만 그것이 부족하다는 것을 알았으므로 아마도 "유용한"정의는 다음과 같습니다.

들어 모든 볼록 선체 내부 지점까지 직선 어느 하지 선체 내 포인트는 한 번만 선체를 교차합니다.

이것은 점이 주어지면 선을 통해 선을 구성하고 선체의 교차 선을 구성하는 선을 테스트 할 수 있기 때문에 유용합니다.

  • 점이 선체에 있지 않은 교차로는 없습니다.
  • 점이 선체에있는 하나의 교차점입니다.
  • 지점이 선체 내에있는 두 개의 교차점
  • 직선은 볼록 껍질과 두 번 이상 교차 할 수 없습니다

2
작전은 오목 선체에 대해 묻고 볼록 선체가 아니라
2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.