선분으로부터 보로 노이 다이어그램 만들기


14

포인트 대신 선분을 기준으로 보로 노이 다이어그램을 만드는 방법을 찾고 있습니다. 아래 예제를 참조하십시오 ( 이 프리젠 테이션 에서 가져옴 ).

이상적으로는 파이썬으로 스크립트를 작성할 수 있지만 ArcGIS 또는 이와 유사한 것을 사용하는 솔루션도 허용됩니다.

선분의 보로 노이 다이어그램

내가 지금까지 찾은 유일한 라이브러리는 openvoronoi 입니다. 다른 사람이 있습니까?


1
이것은 아마도 도움이 될 것입니다 gis.stackexchange.com/questions/53414/...
댄 C

감사. 왜 그 질문이 검색에 나타나지 않았는지 모르겠습니다.
Snorfalorpagus

답변:


5

우리 (대학교 팀)는 ArcGIS 10.0 addin과 ArcObjects를 사용하여이를 구현했습니다. 응용 프로그램은 완전 무료입니다. 이 구현에서는 입력 포인트, 선 또는 다각형으로 사용되는 래스터 방법을 사용하여 일반 또는 다중 가중 Voronoi 다이어그램 (또는 위의 조합)을 만듭니다. 즉, 각 유형의 모양 중 하나를 사용하여 세 가지 특징적인 클래스). 여전히 개발 중이지만 특히 라인 만 수행하려는 경우 상당히 안정적이어야합니다. 추가 기능을 사용하려면 Spatial Analyst 라이센스가 필요합니다. 코드 자체는 오픈 소스이므로 원하는대로 자유롭게 사용하십시오.

https://github.com/UNTGeography/VoronoiDiagramsGIS

@radouxju의 답변에 설명 된 "유클리드 할당"과 비슷한 방법을 사용하고 결과 래스터에서 벡터 다각형을 만들기 위해 흐름 방향 / 베이 신 래스터를 사용합니다.


관심있는 사람들을위한 중요한 부분 : github.com/UNTGeography/VoronoiDiagramsGIS/blob/master/…
Sancarn

3

Voronoï는 처음에 포인트를 위해 설계되었습니다. 다음은 귀하의 문제에 대해 상상할 수있는 두 가지 방법입니다 (ArcGIS 도구 인용).

1)

a) 선을 따라 점을 만듭니다 (예 : 선을 정점 화 한 후 정점을 특징으로합니다)

b) Thiessen 다각형 생성

c) Thiessen 다각형이 교차하는 선을 기준으로 해산

2)

a) 공간 분석가와 함께 라인에 대한 유클리드 할당 계산

b) 각 구역을 다각형으로 변환


3

일부 고객에게는 두 명의 동료가 있는데이를 수행하는 2 개의 지오 프로세싱 도구를 만드는 중입니다. 지오 프로세싱 도구는 공개적으로 사용할 수 없지만, 사용한 Python 및 C #은 다음과 같습니다.

C #과 파이썬 래퍼는 실제로 C ++ Boost Voronoi API를 사용합니다. http://www.boost.org/doc/libs/1_54_0/libs/polygon/doc/voronoi_main.htm

API는 많은 메모리를 소비합니다. 64 비트, ArcGIS Pro 또는 QGIS에 지오 프로세싱을 사용하는 경우에는 문제가되지 않습니다. ArcGIS Desktop에 32 비트이므로 제한 사항입니다. (4 만 행 이상의 자세한 도로 네트워크는 메모리 한계에 도달하기에 충분해야합니다)


1
: 나는 실제로는 ArcMap과는 ArcGIS 프로 pyvoronoi 라이브러리에 의존위한 지오 프로세싱 도구를 만들었습니다 github.com/fabanc/Boost-Voronoi-For-ArcGIS
파비앙 Ancelin

2

ET Geowizards (Arc 용 플러그인)에는 폴리 라인을 허용하는 도구가 있습니다 (아래 스크린 샷 참조). 불행히도 도구를 실행하려면 라이센스 제품이 필요하지만 그 방법을 사용해야한다고 생각합니다.

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


0

또한 PostgreSQL / PostGIS를 사용하여 작업을 해결하는 방법이 하나 더 있습니다.

줄이 짧고 단순하면 스크립트를 실행하십시오.

WITH
tbla AS (SELECT (ST_Dump(geom)).geom geom FROM <line_name_table>),
tblb AS (SELECT (ST_DumpPoints(geom)).geom geom FROM tbla
        UNION
        SELECT ST_Centroid(geom) geom FROM tbla),
tblc AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tblb)
SELECT ST_Union(a.geom) geom FROM tblc a JOIN tbla b ON ST_Intersects(a.geom, b.geom) GROUP BY b.geom;

결과를보십시오.

줄이 길면 스크립트를 실행하십시오.

WITH
tbla AS (SELECT (ST_Dump(geom)).geom geom FROM <line_name_table>),
tblb AS (WITH btbl AS (SELECT (ST_Dump(geom)).geom geom FROM tbla),
intervals AS (SELECT generate_series (0, 9) as steps)
SELECT steps AS stp, ST_LineInterpolatePoint(geom, steps/(SELECT count(steps)::float-1 FROM intervals)) geom FROM btbl, intervals GROUP BY intervals.steps, geom),
tblc AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tblb)
SELECT ST_Union(a.geom) geom FROM tblc a JOIN tbla b ON ST_Intersects(a.geom, b.geom) GROUP BY b.geom;

결과를보십시오.

필요한 경우 선의 점 수를 압축하십시오. 제 예에서는 이것이 10 점입니다.

독창적 인 솔루션.

이 스크립트는 ST_VoronoiDiagramsFromLines라고합니다.


나는 이것을 아직 실행하지는 않았지만 기하학의 꼭지점을 사용하여 보 로니 다각형을 만든 다음 원래 기하학에 닿으면 합집합으로 병합합니다. 그 맞습니까? 그렇다면 원래 지오메트리에 많은 정점이 있고 긴 세그먼트가 없으면 괜찮은 근사치입니다.
Snorfalorpagus

테스트 대상 : PostgreSQL 11.1, PostGIS 2.5 USE_GEOS = 1 USE_PROJ = 1 USE_STATS = 1 ...
Cyril Mikhalchenko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.