포인트 대신 선분을 기준으로 보로 노이 다이어그램을 만드는 방법을 찾고 있습니다. 아래 예제를 참조하십시오 ( 이 프리젠 테이션 에서 가져옴 ).
이상적으로는 파이썬으로 스크립트를 작성할 수 있지만 ArcGIS 또는 이와 유사한 것을 사용하는 솔루션도 허용됩니다.
내가 지금까지 찾은 유일한 라이브러리는 openvoronoi 입니다. 다른 사람이 있습니까?
답변
우리 (대학교 팀)는 ArcGIS 10.0 addin과 ArcObjects를 사용하여이를 구현했습니다. 응용 프로그램은 완전 무료입니다. 이 구현에서는 입력 포인트, 선 또는 다각형으로 사용되는 래스터 방법을 사용하여 일반 또는 다중 가중 Voronoi 다이어그램 (또는 위의 조합)을 만듭니다. 즉, 각 유형의 모양 중 하나를 사용하여 세 가지 특징적인 클래스). 여전히 개발 중이지만 특히 라인 만 수행하려는 경우 상당히 안정적이어야합니다. 추가 기능을 사용하려면 Spatial Analyst 라이센스가 필요합니다. 코드 자체는 오픈 소스이므로 원하는대로 자유롭게 사용하십시오.
https://github.com/UNTGeography/VoronoiDiagramsGIS
@radouxju의 답변에 설명 된 “유클리드 할당”과 비슷한 방법을 사용하고 결과 래스터에서 벡터 다각형을 만들기 위해 흐름 방향 / 베이 신 래스터를 사용합니다.
답변
Voronoï는 처음에 포인트를 위해 설계되었습니다. 다음은 귀하의 문제에 대해 상상할 수있는 두 가지 방법입니다 (ArcGIS 도구 인용).
1)
a) 선을 따라 점을 만듭니다 (예 : 선을 정점 화 한 후 정점을 특징으로합니다)
b) Thiessen 다각형 생성
c) Thiessen 다각형이 교차하는 선을 기준으로 해산
2)
a) 공간 분석가와 함께 라인에 대한 유클리드 할당 계산
b) 각 구역을 다각형으로 변환
답변
일부 고객에게는 두 명의 동료가 있는데이를 수행하는 2 개의 지오 프로세싱 도구를 만드는 중입니다. 지오 프로세싱 도구는 공개적으로 사용할 수 없지만, 사용한 Python 및 C #은 다음과 같습니다.
- C # API : https://github.com/fabanc/SharpBoostVoronoi
- 파이썬 API : https://github.com/Voxel8/pyvoronoi
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 만 행 이상의 자세한 도로 네트워크는 메모리 한계에 도달하기에 충분해야합니다)
답변
ET Geowizards (Arc 용 플러그인)에는 폴리 라인을 허용하는 도구가 있습니다 (아래 스크린 샷 참조). 불행히도 도구를 실행하려면 라이센스 제품이 필요하지만 그 방법을 사용해야한다고 생각합니다.
답변
또한 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라고합니다.