GIS 데이터를 지능적으로 저하 시키거나 부드럽게하는 방법 (일부 다각형 단순화)?
문제
나는 미국 카운티지도를 자세히 설명했다 호랑이 라인 데이터 세트. 데이터를 샘플, 매끄럽게 또는 저하시키면서 지리적 특징을 나타내는 지리적 특징을 나타 내기 위해 똑 바르고, 더 큰 상자, "시끄러운"모양이되도록하는 방법은 무엇입니까?
샘플링은 효율적으로 수행 할 수 있거나 병렬 데이터 세트를 생성하고 저장할 수있는 경우 렌더링 시간에 발생할 수 있습니다. 나는 사용 중입니다 Postgis, 및 라인은 생성 된 다중 폴리 라인입니다 shp2pgsql
- 그러나 당신이 삐걱 거리는 선을 취하고 인간 통역사와 거의 동일한 의미의 부드러운 라인으로 줄이는 솔루션은 매우 유용합니다.
해결책
포인트를 단순히 던지는 문제는 원래 다각형의 모양을 빠르게 왜곡 할 수 있다는 것입니다. 더 나은 접근법은 다른 방향에서 오는 것입니다. 다각형의 기본 근사치로 시작한 다음 복잡한 모양을 향해 위쪽으로 개선하십시오.
이 접근법의 훌륭한 예는 다음과 같습니다 Douglas-Puecker 알고리즘. 당신은 전체 다각형에서 그려진 두 개의 정점으로 시작합니다. 처음 두 정점 사이에 그려진 가장자리에서 가장 먼 곳을 선택하여 세 번째 정점을 추가하십시오. 원래 다각형과 충분히 닮은 것이있을 때까지 포인트를 계속 추가하십시오.
다른 팁
Douglas-Peucker는 확실히 올바른 접근법입니다. PostGIS 및 QGIS에서 IT 구현에 액세스 할 수있는 간단한 방법이 있습니다. 목표는 다음과 같은 것으로 시작하는 것입니다.
그리고 다음과 같은 것으로 끝납니다.
Postgis에서 Douglas-Peucker는 AS로 구현됩니다 simplify
, 구문은 상세합니다 여기 bostongis.org에서,, 일부 변형은 다음과 같습니다.
SELECT transform(simplify(transform(the_geom, 2249), 500),4326) from the_geo_table
이것은 전체 국가 데이터 세트에서도 매우 잘 작동했으며, 기본 데이터가 잘못 되었기 때문에 몇 가지 오류가 발생했습니다. 또한 QGIS에서 메뉴 항목이 있음이 밝혀졌습니다. Tools > Geometry Tools > Simplify Geometries
형상의 단순화 된 모양 파일을 내보내고 현재 프로젝트에 레이어로 추가합니다.
이것은 매우 근본적인 도구 세트이며 너무 낮은 A 레벨에서 질문을했지만 기본 수학을 배우는 것이 좋았지 만 그에 대한 좋은 설명이 있습니다. 여기 : http://www.mappinghacks.com/code/polylinereduction/, 너무 필요하지 않은 샘플 코드와 함께!
qgis 대신 gog2ogr을 사용하는 것이 좋습니다. 다각형을 삭제하지 않습니다!
ogr2ogr output.shp input.shp -simplify 0.0001
간단한 반복 스무딩 알고리즘은 다음과 같습니다.
중간 지점에 교차점이없고 두 외부 지점 사이의 직접 경로의 작은 임계 값 각도 내에있는 경우 모든 경로의 세 가지 순차적 지점에 대해 제거하십시오.
만족할 때까지 반복하십시오.
Visvalingam의 알고리즘을 시도 할 수도 있습니다. 다음은 해당 알고리즘에 대한 훌륭한 설명입니다.
당신은 또한 사용할 수 있습니다 simplify.js 조합을 사용합니다 Douglas-Peucker 및 방사형 거리 알고리즘. 많은 포트에 대한 링크가 있습니다. Github 프로젝트
@unmounted의 답변이 정확하지만 제안을 한 번 더 추가하고 싶습니다.
postgis에서 st_simplify 대신 항상 함수 st_simplifypreservetopology를 사용하십시오. 둘 다 동일한 기본 알고리즘 (Douglas-Peucker)을 사용하지만 전자는 단순화를 피하여 유효하지 않은 형상을 초래할 수 있습니다. 예를 들어, st_simplify는 자체가 교차하는 기하학을 초래할 수 있습니다.