From 9827926a20741934fe846c0face6d8714958f8c7 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 1 Nov 2026 14:34:11 +0900 Subject: [PATCH] =?UTF-8?q?knowledge(=EC=9A=94=EA=B5=AC):=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=20553=20=EC=A1=B0=EC=82=AC=20=EB=91=98=20=E2=80=94=20?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=8B=A4=20=EC=A7=80=EA=B8=88=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=ED=92=88=EC=A7=88=20=C2=B7=20=EB=AC=B4=EB=A3=8C=20?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=8B=A4=20=EB=8F=84=EA=B5=AC=20=EB=B9=84?= =?UTF-8?q?=EA=B5=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../요구_1101/_분석_553-A_라이다_지금코드.md | 96 +++++++++++++++++++ .../요구_1101/_분석_553-B_무료라이다도구.md | 93 ++++++++++++++++++ 2 files changed, 189 insertions(+) create mode 100644 docs/raw/요구_1101/_분석_553-A_라이다_지금코드.md create mode 100644 docs/raw/요구_1101/_분석_553-B_무료라이다도구.md diff --git a/docs/raw/요구_1101/_분석_553-A_라이다_지금코드.md b/docs/raw/요구_1101/_분석_553-A_라이다_지금코드.md new file mode 100644 index 000000000..3d7e3cfe4 --- /dev/null +++ b/docs/raw/요구_1101/_분석_553-A_라이다_지금코드.md @@ -0,0 +1,96 @@ +# 553-A — 라이다 입력 지금 코드 · 품질 약점 + +읽기 · 실측만 · 코드 · storage 고침 없음. 실측 = `검증_sub5`(`dbf9f6d0…`) 용화.las(4,900만 점 · 업체 분류 1·2 만) · 그 프로젝트 산출(`structured.npz` · 마스크 · `dtm_*.npz`). + +## ① 결론 다섯 줄 + +1. 라이다 길은 거의 전부 **자체 코드**임. 바깥 라이브러리는 읽기(laspy) · 좌표 옮김(pyproj) · 보간(scipy) · 등고선(skimage) 정도. Whitebox 는 B05 뼈대 흐름누적 한 곳뿐이고, 지면점 · DEM 에 Whitebox 를 안 쓴 까닭은 어디에도 기록 없음. +2. **가장 큰 품질 흠은 지면 가르기가 아니라 격자(DEM) 짓기임.** 칸마다 최저점만 쓰고, 칸 자리를 칸 가운데가 아닌 왼아래 모서리로 적고, 빈칸은 가장 가까운 값으로 메움. 떼어 둔 업체 지면점으로 재면 지금 오차 RMS 0.76 m(DEM 이 0.6 m 낮음) · TIN 선형으로 지으면 0.11 m(약 7 배 나음). +3. 유효 칸의 **49 %(분류) · 59 %(CSF)는 지면점이 없는 칸이라 가까운 값으로 메운 칸**임. 그 칸은 계단 꼴이라 급경사 빨강 52.6 %(지면점 있는 칸은 22.7 %). 538 의 「라이다 잔요철」 상당 부분이 이 계단임. +4. 우리 CSF 는 이름만 CSF 이고, 실제로는 「1.5 m 칸 최저점 위 0.5 m」 판정과 거의 같음. 업체 지면점의 45 % 를 놓치는데 주로 급경사(놓친 자리 기울기 중앙 71 %)이고, 1 m 넘는 낮은 수목도 남김. 외곽은 「가장 큰 덩이만 남김」 때문에 업체 분류 기준 스캔 범위의 약 1/3 을 버림. +5. 바꿔 끼우기 가장 깨끗한 자리는 **`dtm_{필터}.npz` 파일 경계**임. 뒤 단계 전부가 이 파일만 읽음. 다음 자리는 지면 필터 등록표(`_FILTERS`)에 새 열쇠를 하나 더하는 것이고, 그러면 마스크 · 모델 · 화면 드롭다운이 그대로 따라옴. 그 밖 LAZ 를 풀 도구가 venv 에 없음(.laz 는 받기만 하고 못 읽을 것으로 추정). + +## ② 단계 지도 + +| 단계 | 자체/라이브러리 | 파일:줄 | 매개변수 · 하는 일 | +| --- | --- | --- | --- | +| 받기 · 이름 검사 | 자체 | `common_util/common_util_lidar_upload.py:42-50` · `:95-106` | .las · .laz · .prj 만 · 파일당 30 GB(B03 엔진) | +| 머리글 · 분류 통계(B03) | laspy | `B03_FileInput/B03_FileInput_Engine_Analyze.py:149-225` | 분류 칸 전체 훑어 개수 · 미리보기 점 5,000 | +| 좌표계 | pyproj · laspy | `lidar_upload.py:53-64`(.prj 먼저 · 없으면 LAS 머리) · `:67-92` `place_las` | 나중 올리기(D03 · B05)만 x · y 옮겨 적음 · z 그대로 · B03 본 길은 옮김 없음(지형 PRJ = 프로젝트 좌표계) | +| 여러 장 이음 | 자체 + laspy | `B04_PreProcess/B04_PreProcess_Engine_Structurize.py:283-338` · 틈 검사 `:58-86` | 합친 범위 한 벌 · 5 km 넘게 떨어진 파일은 막음(B03 길만 · `B03_FileInput_Router_Helpers.py:256-262`) | +| 솎기(씨닝) | 자체 | `Structurize.py:153-235` · `config/config_system_terrain.py:26-30` | 1억 점 넘을 때만 · 0.5 m 칸 최저점 하나 · 분류 2 는 다 남김 | +| 지면 필터 고르기 | 자체 | `B04_PreProcess_Engine_Ground.py:46-56` · `Filter_Classification.py:28` | 분류 2 가 0.2 % 이상(`config_system_terrain.py:63-65`)이면 분류 + CSF · 없으면 CSF 하나 · 첫째 = 기본 확정(`B03_FileInput_Service_WF1.py:175-181`) | +| 지면 — 업체 분류 | 자체(읽기만) | `Filter_Classification.py:18-25` | class == 2 | +| 지면 — CSF | 자체(NumPy) | `Filter_CSF.py:30-122` | 천 1.5 m · rigid 1 · 판정 0.5 m · 보조 1.8 m · 칸 최저점을 충돌 높이로(`:78-82`) | +| 지면 — grid_min_z · PMF · RANSAC | 자체(NumPy) · 고를 때만 | `Filter_Grid.py:11-50` · `Filter_PMF.py:33-91` · `Filter_RANSAC.py` | 2 m 칸 최저 위 1.5 m · PMF 는 위 2.5 m 까지 지면(`Filter_PMF.py:90`) · RANSAC 10 m 칸 평면 | +| 잡점 · 이상점 | **없음** | — | 통계 이상점 · 저잡음(class 7) 거름 없음 | +| 지면점 비율 경고 | 자체 | `B04_PreProcess_Engine.py:304-313` | 1 % 미만이면 로그 경고만 | +| 격자(DTM) | 자체(NumPy · scipy) | `B04_PreProcess_Engine_ModelContext.py:336-364` | 1 m · **칸 최저점**(`:351`) · 빈칸 = **가장 가까운 값**(`:352-359`) · 칸 자리 = `linspace(x_min, x_max)` = 칸 모서리(`:360-361`) · float32 | +| 외곽(유효 범위) | 자체(scipy.ndimage) | `ModelContext.py:265-317` | 1 m 칸 · 닫기 1 m · **가장 큰 덩이만** · 속 구멍 메움 · 안쪽 1 m 깎음 | +| 그 밖 표현 | 자체 + scipy | `B04_PreProcess_Engine_ModelBuild.py` | TIN 50 만 점(Delaunay) · NURBS · RBF · 서펠 — 자동은 DTM 하나 | +| 평활(설계 기본) | scipy | `B04_PreProcess_Engine_Smooth.py:54-104` | 가우스 σ 0.5 m + 쌍삼차 스플라인 · 0.5 m 요청이지만 꼭짓점 50 만 넘으면 칸을 넓힘(`ModelContext.py:366-375`) → 이 사업 1.078 m | +| 확정 기본값 | 자체 | `config_system_terrain.py:168-171` | 필터 = 엔진 첫째 · dtm · 평활 켬 · D03 라이다는 평활 안 한 DTM(`D03_PlanAnalysis_Lidar.py:57-80`) | +| 급경사 | 자체(NumPy) | `D03_PlanAnalysis_Layers.py:217-239` | 칸 = 좌표 간격(633) · 4096 px 넘으면 `[::stride]` 건너 표본 | +| 음영기복 | 자체(NumPy) | `B07_DesignDetail_Engine_Cad_Lidar.py:59-89` | 빈칸을 전체 평균으로 메운 뒤 기울기 | +| 0차곡 | 자체(NumPy · skimage) | `D03_PlanAnalysis_ZeroOrder.py:72-98` · `:540-543` | 1 m 를 `[::2]` 건너 2 m · 자체 D8 | +| 등고선 | skimage | `B04_PreProcess_Engine_Contour.py:20-64` | DTM 격자 marching squares · 1 m 간격 | +| 뼈대 흐름누적(B05) | **Whitebox** · 폴백 NumPy | `B05_Profile_Engine_Skeleton.py:95-150` | fill_depressions + d8 · 실행 파일은 첫 호출 때 인터넷에서 받음 · 이 랩탑 venv 엔 실행 파일 없음 | + +## ③ 품질 약점 + +| # | 약점 | 근거 | 심각도 | 바깥 도구가 풀 수 있나 | +| --- | --- | --- | --- | --- | +| 1 | **칸 짓기 = 칸 최저점 + 칸 자리 반 칸 어긋남** — DEM 이 0.6 m 낮고 남서로 약 0.5 m 밀림 | `ModelContext.py:351` · `:360-361` · 실측 A(⑤): RMS 0.764 → 자리만 고쳐도 0.497 → TIN 0.108 m | 높음 | 예 — TIN 격자(Whitebox LidarTINGridding · PDAL · GDAL). 자리 어긋남은 바깥 도구 없이 한 줄 꼴로도 고칠 수 있음 | +| 2 | **빈칸을 가까운 값으로 메움 → 계단** | `ModelContext.py:352-359` · 유효 칸 중 지면점 없는 칸 49.4 %(분류) · 59.0 %(CSF) · 가장 큰 빈칸 덩이 3.1 만 m² · 그 칸 빨강 52.6 % 대 22.7 % · 10 m 구멍 흉내 RMS 1.29 대 TIN 0.29 m | 높음 | 예 — TIN · IDW 격자 | +| 3 | **외곽이 스캔 범위를 버림** | `ModelContext.py:294-313` 가장 큰 덩이만 · 안쪽 1 m · 점 찍힌 칸 중 유효 65.2 %(분류) · 88.6 %(CSF) · 지면 덩이 17.3 % 버림 | 중~높음 | 일부 — TIN 최대 변 길이 · 알파 외곽(PDAL hexbin 등). 정책 문제(덩이 하나 · 닫기 1 m)가 먼저임 | +| 4 | **CSF 자체 구현이 원 CSF 와 다름** — 중력 0.32 m/회가 스프링을 이겨 천이 칸 최저점에 붙음 → 급경사 지면은 깎고 낮은 수목은 남김 | `Filter_CSF.py:78-108` · 업체 지면의 45 % 놓침(놓친 자리 기울기 중앙 71 % 대 60 %) · CSF 만 지면이라 한 13.9 만 점 중 1 m 넘는 것 10.1 % | 중 | 예 — CSF 원 라이브러리(경사 후처리) · PDAL csf/smrf · Whitebox LidarGroundPointFilter | +| 5 | **분류 있는 LAS 를 그대로 믿음** · 쓸 문턱 0.2 % · 공간 덮임 검사 없음 | `Filter_Classification.py:28-40` · `config_system_terrain.py:63-65` — 일부 구역만 분류돼 있어도 기본 필터가 되고, 나머지는 2 · 3 번으로 메움 | 중 | 아님(판정 규칙 문제). 바깥 도구로 다시 분류해 대조할 수는 있음 | +| 6 | **잡점 · 이상점 거름 없음** — 모든 길이 칸 최저점이라 아래 잡점 하나가 칸을 끌어내림 | 거름 코드 없음 · 이 자료는 업체가 정리해서 지면 아래 1 m 넘는 점 0.005 % · 미분류 원자료면 위험 | 중(이 자료는 낮음) | 예 — PDAL outlier/elm · Whitebox LidarRemoveOutliers | +| 7 | **설계 기본 평활본의 칸이 사업 넓이 따라 굵어짐** · 평활이 오차를 거의 못 줄임 | 미리보기 꼭짓점 50 만 상한(`ModelContext.py:366-375`)이 설계 격자까지 묶음 · 칸 ≈ √(넓이 / 50 만) m(이 사업 1.078 · 2 km² 면 2 m) · RMS 0.765 → 0.751 | 중 | 아님(우리 정책). 다만 1 · 2 번이 풀리면 평활할 까닭 자체가 줄어듦 | +| 8 | **LAZ 를 못 읽음(추정)** | `.laz` 받음(`lidar_upload.py:37`) · venv laspy LazBackend 0 개 · `requirements.txt` 에 lazrs · laszip 없음 · 실 LAZ 로는 확인 안 함 | 중 | 예 — `lazrs` 패키지 하나 · PDAL | +| 9 | **좌표계 · 높이 기준** — B03 본 길은 옮김 없이 5 km 틈 검사만 함. 나중 올리기 길은 틈 검사 없음. 타원체고 LAS 는 로그만 남김(약 25 m 어긋나도 못 막음). 경위도 LAS 를 옮기면 scale 을 그대로 둬서 넘칠 수 있음 | `B03_FileInput_Engine_Analyze.py:123-133` · `lidar_upload.py:79-82` · 이 자료 라이다 − 수치지형도 중앙 −2.29 m(타원체고 문제 아님 · 그중 약 0.6 m 는 1 번 몫) | 낮~중 | 일부 — PDAL reprojection(수직 기준은 지오이드 격자 필요) | +| 10 | **급경사 · 음영 · 0차곡이 평균 없이 건너 표본**(`[::step]`) — 계단 · 잡값이 그대로 남음 | `Layers.py:222-223` · `ZeroOrder.py:540-543` · 538 이 권한 2 m 평균은 사용자가 1 m 유지(요구 543) | 낮음 | 예 — Whitebox Slope · Hillshade · D8(자체 D8 · 기울기 대체) | +| 11 | 속도 · 메모리 | 4,900 만 점 WF1 239 s(구조화 79 · 지표면 52 · CSF 4.1 s · 486 기록) · 1 억 점부터 씨닝 · 조용한 흠 없음. TIN 을 scipy 로 하면 100 만 점에 약 5 분(이번 실측) | 낮음 | 예 — TIN 격자는 Whitebox · PDAL 이 빠름 | +| 12 | float32 좌표 | `ModelContext.py:348` · 이 좌표대 3 cm 이하 | 낮음 | — | + +그 밖 — 이 랩탑 venv 와 `requirements.txt` 판이 다름(laspy 2.4.1 대 2.7.0 · whitebox 2.3.0 대 2.3.6). + +## ④ 갈아 끼울 경계 + +| 경계 | 지켜야 할 꼴 | 바꿀 바깥 도구 | 따라오는 것 · 주의 | +| --- | --- | --- | --- | +| **D. DTM 파일**(가장 깨끗함) | `B04_PreProcess/models/dtm_{필터}.npz` = `x`(오름 · 칸 가운데) · `y`(오름) · `z`(ny × nx · 행 남→북) · `valid_mask` · `resolution` | Whitebox LidarTINGridding · PDAL writers.gdal · GDAL gdal_grid → GeoTIFF → npz 로 옮기는 작은 변환 하나 | 뒤 단계 전부(`DtmGridSampler` · 급경사 · 음영 · 0차곡 · 평활 · B05 · B07)가 이 파일만 읽음 · manifest 줄과 DB `surface_models` 행은 그대로 씀 | +| **B. 지면 필터** | `_FILTERS[열쇠](structured) → bool[N]`(`Ground.py:23-29`) · 점 차례를 그대로 지킨 마스크 | PDAL smrf/csf · CSF 원 라이브러리 · Whitebox LidarGroundPointFilter(LAS 로 냄 → 분류 칸 읽어 마스크) | `mask_{열쇠}.npy` · 모델 · 등고선 · 드롭다운이 따라옴 · 함께 고칠 곳 = `SURFACE_MODEL_SOURCE_FILTERS` · `SOURCE_FILTER_LABELS` · `resolve_auto_source_filters` | +| **C. 격자 함수** | `TerrainContext.grid(res) → (x, y, z)` · 빈칸 없음 · x · y 는 칸 가운데(`ModelContext.py:336-364`) | 안쪽만 TIN(scipy 는 이미 있으나 느림 · Whitebox · PDAL) | DTM · NURBS · 서펠 · 평활 · 미리보기가 한 번에 바뀜 | +| A. 읽기 · 이음 | `structurize_las(paths, dir) → structured.npz`(xyz f64 · classification · bounds 3×2 · rgb · intensity · return) | PDAL readers.las + merge · LAStools | 얻는 것 적음(LAZ 는 lazrs 하나로 풀림) | +| E. 좌표계 | `place_las(src, dst_dir, src_epsg, epsg) → Path` | PDAL reprojection | 수직 기준까지 하려면 지오이드 격자 필요 | + +- Whitebox 지면 · DEM 도구를 안 쓴 까닭 기록은 없음. 기록에 Whitebox 가 나오는 곳은 셋뿐임 — 의존성 판올림 때 실행 복구(`docs/raw/plans/2026-07-18_plan_dependency_upgrade.md:30-45`), B05 뼈대 D8, 0차곡을 Whitebox 흐름누적으로 바꾸자는 제안(`docs/raw/요구_1025/_분석_486_미리계산_지형분석.md:172` · 미실측). CSF · PMF · RANSAC 파일 머리에는 「Pure NumPy」라고만 적혀 있고 까닭은 없음. + +## ⑤ 실측(검증_sub5 · 용화.las · 읽기만) + +- LAS — 1.2 · 점 꼴 3 · 4,900.7 만 점 · EPSG 5176 · scale 0.1 mm · 분류 1 = 97.67 % · 2 = 2.33 % · 씨닝 안 함(1 억 미만) · 바운딩 상자 896 × 645 m. +- 지면점 — 분류 114.1 만 · CSF 76.8 만 · 겹침 62.9 만 · CSF 만 13.9 만(모두 업체 class 1) · 분류 만 51.2 만. +- 1 m 칸 — 점 찍힌 칸 61.6 % · 지면점 칸 24.6 % · 지면점 칸당 중앙 3 점 · 칸 평균 − 최저 중앙 0.17 m · p90 0.41 m. +- 외곽 · 구멍 + +| 필터 | 유효(상자 대비) | 점 찍힌 칸 중 유효 | 유효 안 빈칸(가까운 값) | 가장 큰 빈칸 덩이 | +| --- | --- | --- | --- | --- | +| classification | 40.2 % | 65.2 % | 49.4 % | 31,220 m² | +| csf | 55.6 % | 88.6 % | 59.0 % | 79,625 m² | + +- 떼어 둔 업체 지면점과 차(점 − DEM) + +| 시험 | 꼴 | 평균 | RMS | \|p95\| | +| --- | --- | --- | --- | --- | +| A 무작위 10 % 떼어 둠 | 지금 | +0.595 | 0.764 | 1.367 m | +| | 같은 격자 · 칸 자리만 가운데로 | +0.383 | 0.497 | 0.891 m | +| | TIN 선형(scipy) | −0.005 | 0.108 | 0.214 m | +| B 10 m 덩이 5 % 통째 떼어 둠 | 지금(가까운 값) | +0.355 | 1.293 | 2.641 m | +| | TIN 선형 | +0.021 | 0.293 | 0.624 m | + +- 저장된 모델과 업체 지면점 20 % 표본의 차(RMS) — dtm_classification 0.765 · 평활본 0.751 · dtm_csf 0.914 · csf 평활본 0.881 m(평균은 모두 +0.57~0.60). +- 급경사(dtm_classification · 칸 1 m) — 지면점 있는 칸 p50 61 % · p90 103 % · 빨강 22.7 % / 빈칸 p50 87 % · p90 168 % · 빨강 52.6 %. +- 라이다 − 수치지형도(라플라스) — 평균 −2.68 · 중앙 −2.29 · 표준편차 3.45 · \|p95\| 9.04 m(지면점 있는 칸 11.7 만). +- CSF 대 업체(업체 지면 격자 기준 높이) — CSF 만: 높이 중앙 +0.50 · 1 m 넘음 10.1 % · 자리 기울기 중앙 60 % / CSF 놓침: +0.47 · 5.7 % · 71 % / 둘 다: +0.29 · 0.8 % · 60 %. +- 지면 아래 잡점 — 전체 점 10 % 표본 중 업체 지면보다 1 m 넘게 아래 0.005 % · 3 m 넘게 0.0002 %. diff --git a/docs/raw/요구_1101/_분석_553-B_무료라이다도구.md b/docs/raw/요구_1101/_분석_553-B_무료라이다도구.md new file mode 100644 index 000000000..2eba0cff4 --- /dev/null +++ b/docs/raw/요구_1101/_분석_553-B_무료라이다도구.md @@ -0,0 +1,93 @@ +# 553-B 무료 라이다 도구 조사 (바깥 도구) + +조사일 2026-11-01 · 인터넷 공개 자료 · 설치 · 실행 시험 없음 · 지식DB(`resources/knowledge/`)에 라이다 지면 필터 자료 없음(라이선스 원칙만 있음 — 「상용 모듈엔 GPL 배제 · MIT/BSD/Apache 만」, `original/안정성평가/01_…라이센스.md`). + +## ① 결론 다섯 줄 + +1. **권함 — PDAL**(BSD · 상용 묶음 자유) — 지면 가르기(SMRF · CSF · PMF) + 잡점(낮은 잡점 · 외톨이 점) + TIN 격자(긴 삼각형 끊기)까지 한 엔진. QGIS 4 「지면점 분류」와 같은 엔진(SMRF)이라 사람이 QGIS 로 똑같이 재현 · 대조 가능. 파이썬 3.12 휠이 없어 **따로 실행 파일**(`pdal pipeline`)로 부름. +2. **버금 — Whitebox Workflows Next Gen**(MIT 또는 Apache-2.0 · pip 한 줄 · 20 MB) — 지금 쓰는 WhiteboxTools 의 후속. 옛 유료 「개선 지면 필터(ImprovedGroundPointFilter)」가 무료 쪽으로 옮겨짐. 다만 2026-06 첫선(soft launch) 단계 · 공개 성능 비교 없음 → 자체 시험 필수. +3. 산악 숲 지면 품질 1위권은 **PTD(점진 TIN)** 계열(LAStools `lasground_new` · lidR `ptd`)이나 상용에 묶을 수 있는 무료판이 없음(LAStools 유료 · lidR 은 GPL-3 + R) → **정답지 만드는 비교 기준으로만** 씀. +4. QGIS · CloudCompare · GRASS · SAGA 는 GPL 큰 프로그램 → 서버 · 설치본에 묶지 않음 · 사람이 결과를 눈으로 대조하는 검산 도구로만. +5. 다음 일 — 우리 산림 LAS 한두 장으로 「지금 코드 · PDAL SMRF · WbW 개선 필터 · CSF」를 같은 1 m DEM 으로 뽑아 PTD 기준과 수치 대조 → 흠이 **지면 가르기**인지 **잡점 · 격자 만들기**인지 먼저 가름(분류 칸이 이미 있는 LAS 면 지면 가르기는 건너뛰고 격자 · 잡점 쪽부터 의심). + +## ② 비교 표 + +| 도구 | 하는 일 | 산림 · 급경사 지면 품질 | 라이선스 | 상용 프로그램에 넣을 때 | Windows · 파이썬 3.12 부르는 길 | 크기 | 유지보수 | +|---|---|---|---|---|---|---|---| +| **PDAL** 2.10.2 (26-06) | 지면 SMRF · CSF · PMF · skewness · 낮은 잡점(`elm`) · 외톨이(`outlier`) · 격자(`writers.gdal` 최저 · 평균 · IDW) · TIN 격자(`delaunay`+`faceraster`, 긴 변 끊기) · 타일 나누기 | SMRF — 표준 시료 κ 85~90 % · 숲 항공 라이다 RMSE 0.13~0.19 m 무리 중 상위(원문 미열람) · 급경사에선 `slope` 값 조정 필요 | BSD | 묶음 · 수정 자유(고지문만) · 딸린 GEOS 는 LGPL(따로 DLL 이면 무방) | pip 휠 없음(3.3 이후 원본만 · 3.12 휠 없음) → conda-forge 로 만든 PDAL 폴더 또는 QGIS 에 딸린 `pdal.exe` · 파이썬은 subprocess 로 JSON 파이프라인 | 수백 MB(추정 · conda 환경) | 매우 활발(QGIS · 미 지질조사국 사용) | +| **WhiteboxTools Open Core** 2.4.0 (지금 스택) | 경사 기반 지면 필터 · TIN 격자 · IDW 격자 · DEM 위 물체 지우기(RemoveOffTerrainObjects) · 외톨이 지우기 | 경사 기반 필터 — 유럽 4곳 비교에서 꾸준히 상위권(Whitebox GAT 판) | MIT | 자유 | pip `whitebox`(실행 파일 내려받아 부름 · 지금 방식) | 수십 MB | 2.4.0 뒤 새 판 없음 → NG 로 옮겨 감 | +| **Whitebox Workflows NG** 2.0.6 (26-06) | 위 도구 전부 + 개선 지면 필터(블록 최저점 → TIN → 웅덩이 메움 → 물체 지우기 → 기준면 ±0.15 m 가름) 등 라이다 65종 | 개선 필터의 공개 비교 없음 → 자체 시험 필요 | MIT 또는 Apache-2.0(Pro 확장 따로 · 안 쓰면 무관) | 자유 | pip 휠 `win_amd64 abi3`(3.12 됨) · 파이썬에서 바로 | 휠 20 MB | 첫선 단계 · 활발 | +| **CSF** 파이썬 1.1.7 (25-08) | 천 덮기(Cloth Simulation) 지면 가르기만 | 표준 시료 평균 총오차 4.58 % · 급경사에서 천이 떠 오차 큼(경사 후처리 켬) · 국내 산사태지 드론 라이다 84.3 % · κ 0.71 · 체코 숲 비교 꼴찌(원문 미열람) | Apache-2.0 | 자유 | pip 휠 `cp312 win_amd64` · laspy 배열 그대로 | 0.13 MB | 보통(드문 판) | +| **QGIS** 4.x (4.0 = 26-03) | 「지면점 분류」= PDAL SMRF(`pdal_wrench`) · 잡점 · TIN 래스터 · 타일 · `qgis_process` 명령 줄 | PDAL SMRF 와 같음 | GPL-2+ (`pdal_wrench` GPL-3) | 따로 실행은 우리 코드 감염 없음 · 설치본에 묶으면 GPL 의무(원본 제공 · 고지) | `qgis_process.exe run pdal:classifyground …`(화면 없는 서버는 `QT_QPA_PLATFORM=offscreen`) | 설치 약 2.1 GB | 매우 활발 | +| **CloudCompare** 2.13 | CSF 플러그인 명령 줄(`-CSF`) · 잡점(SOR) | CSF 와 같음 | GPL-2(앱) · 핵심 라이브러리 LGPL | 따로 실행 가능 · 묶음 배포는 GPL · 딸린 Triangle 라이브러리 상용 배포 제한 | 실행 파일 · 출력 형식 지정 순서 까다로움 | 수백 MB(추정) | 활발 | +| **lidR** 4.3 (R) | PTD(26-01 추가 · 저자 권장) · CSF · PMF · MCC · DTM | 산 · 능선에서 PTD 가 CSF · PMF · MCC 보다 낫고 빠름 | GPL-3 | 묶으면 GPL · R 런타임 필요 | `Rscript` 따로 실행 | R 포함 수백 MB(추정) | 활발 | +| **LAStools** | `lasground_new`(PTD 계열) · `las2dem` · 타일 · 대용량 강함 | 산림 · 산악 비교에서 꾸준히 1위권 | 닫힌 소스(일부 LGPL) | lasground 상용 1,500 유로/좌석 · 전체 5,000 유로 · 무허가 판은 결과 훼손 · 묶음은 별도 계약 | 실행 파일 | 작음 | 활발 | +| **FUSION** 4.61 (미 산림청) | GroundFilter · GridSurfaceCreate · 산림 지표 | 연구용 · 비교 자료 적음 | 퍼블릭 도메인 | 자유 | Windows 실행 파일 · LAZ 는 LAStools DLL 필요 · 고유 `.dtm` 형식 | 작음 | 느림(판 드묾) | +| **GRASS GIS** 8.x | `r.in.pdal`(격자 모으기만) · `v.lidar.*`(도시 건물용) · `v.lidar.mcc` 애드온 | 숲 검증 적음 | GPL-2+ | 묶으면 GPL | OSGeo4W · grass 명령 | 큼 | 활발 | +| **SAGA** 9.x | DTM Filter(경사 기반 · 격자 위에서) | 점 분류가 아니라 격자 걸러내기 | GPL(도구) · LGPL(API) | 묶으면 GPL | `saga_cmd grid_filter 7` | 중간 | 활발 | +| **Open3D** | 일반 점구름(외톨이 · 평면 찾기) | 숲 지면 필터 없음 → 부적합 | MIT | 자유 | pip | 큼 | 활발 | +| **MCC-LIDAR** (미 산림청) | 곡률 기반 지면(MCC) | 지중해 숲 1위(83.3 % · κ 0.67) | 원판 불명 · R 포트 MIT | 불명 | GRASS · R 경유 | 작음 | 멈춤(2.1) | + +출처 +- PDAL 필터 목록 https://pdal.io/en/stable/stages/filters.html · SMRF 값 https://pdal.io/en/stable/stages/filters.smrf.html · 설치(Windows = conda-forge) https://pdal.io/en/stable/download.html · PyPI 파일 목록 https://pypi.org/simple/pdal/ +- pdal_wrench(GPL-3) https://github.com/PDAL/wrench +- QGIS 4.2 점구름 알고리즘 https://docs.qgis.org/4.2/en/docs/user_manual/processing_algs/qgis/pointclouddatamanagement.html · 변환 https://docs.qgis.org/4.2/en/docs/user_manual/processing_algs/qgis/pointcloudconversion.html · 명령 줄 https://docs.qgis.org/latest/en/docs/user_manual/processing/standalone.html · 설치 크기(4.0.1) https://wapt.tranquil.it/store/en/details/tis-qgis_4.0.1-23_x64_windows_6.2_PROD.wapt +- WhiteboxTools 판 https://github.com/jblindsay/whitebox-tools/releases/ · NG 발표 https://lists.osgeo.org/pipermail/discuss/2026-June/040372.html · https://www.geomorphometry.org/blog/ · NG 원본 https://github.com/jblindsay/whitebox_next_gen · 개선 필터 원본(무료 칸) https://github.com/jblindsay/whitebox_next_gen/tree/main/crates/wbtools_oss/src/tools/lidar_processing · PyPI https://pypi.org/pypi/whitebox-workflows/2.0.6/json +- CSF https://pypi.org/project/cloth-simulation-filter/ · https://cloudcompare.org/doc/wiki/index.php/CSF_(plugin) +- CloudCompare 라이선스 https://cloudcompare.org/doc/wiki/index.php/License · 명령 줄 https://www.cloudcompare.org/doc/wiki/index.php/CommandLine +- lidR https://r-lidar.github.io/lidRbook/gnd.html · https://github.com/r-lidar/lidR +- LAStools https://lastools.osgeo.org/download/LICENSE.txt · https://rapidlasso.de/pricing +- FUSION https://forsys.sefs.uw.edu/fusion/fusionlatest.html +- GRASS https://grass.osgeo.org/grass84/manuals/v.lidar.correction.html · SAGA https://saga-gis.sourceforge.io/saga_tool_doc/9.12.5/grid_filter_7.html · MCC https://www.sourceforge.net/p/mcclidar/wiki + +## ③ 산림 · 급경사 지면 필터 비교 근거 + +| 연구 | 자료 · 지형 | 수치 | 뜻 | +|---|---|---|---| +| Pingel 외 2013 (SMRF 원논문) | ISPRS 표준 15 시료 | κ 85.4 %(한 벌 값) · 90.02 %(최적) · 총오차 2.97 %(2차 출처) | 값 맞추면 크게 나아짐 | +| Zhang 외 2016 (CSF 원논문) | ISPRS 표준 | 평균 총오차 4.58 % · 급경사는 후처리 따로 둠 | 급경사가 약점임을 저자도 인정 | +| Montealegre 외 2015 | 스페인 지중해 숲 · 7 필터 | MCC 성공률 83.3 % · κ 0.67 1위 · LAStools 오차 균형 | 15° 넘는 경사 · 덤불 · 쓰러진 나무가 가장 어려움 | +| Cățeanu · Arcadie 2017 | 루마니아 산악 · 급경사 · 빽빽한 숲 · 9 필터 | `lasground_new` 0.34 m(1위) · 경사 기반(MLS) 0.56 m · SMRF 0.60 m · 경사 대 오차 R² 0.89 | 경사가 오차를 거의 결정 · 무료 둘은 비슷 | +| Štular · Lozić 2020 | 오스트리아 · 슬로베니아 · 스페인 4곳 · 9 필터 | PTD(`lasground_new`) · Global Mapper · Whitebox GAT 경사 필터 꾸준히 상위 · 뚜렷한 1위 없음 | 옛 알고리즘이 새것보다 나음 | +| Klápště 외 2020 | 체코 · 잎 있을 때 항공 라이다 · 6 필터 | 항공 라이다 RMSE 0.13~0.19 m · 경사 클수록 오차↑ · (검색 요약) SMRF 최저 · CSF 최하 | 「첫 최저점 고르는 값」이 가장 큰 영향 | +| Moudrý 외 2020 | 숲 · 초원 덮인 인공 지형 | 모두 쓸 만하나 경사 · 식생 늘수록 정확도↓ | 숲이 낮은 풀밭보다 쉬움 | +| lidR 책 2026 | 산 · 능선 두 장면 | PTD 가 능선 · 비탈 더 잘 가름 · 산 장면 PTD 20 s · CSF 156 s · PMF 1,800 s | PTD = 품질 · 속도 모두 앞섬 | +| OpenGF 2021 | 4개국 9 지형 47 km² | 정확도 PTD 94.82 % · CSF 93.07 % · PMF 90.63 % | 같은 순서 | +| 2025 형태학 필터 논문 | 항공 라이다 | 기본값 CSF · MCC · PMF 가 급경사에서 지면점 잃음 | 기본값 그대로 쓰지 말 것 | +| 황세란 · 이임평 2011 (국내) | 산림 항공 라이다 · 세 필터 | 결과 섞으면 지표 10 %↑ · DTM RMSE 약 17 cm | 여러 필터 합치기도 길 | +| 구슬 외 2023 (국내) | 예천 산사태지 드론 라이다 · CSF | 84.3 % · κ 0.71 · 낮은 식생 지면 오인 남음 | CSF 단독은 손질 필요 | + +정리 — 산림 · 급경사 순서 대략 **PTD ≥ SMRF ≈ 경사 기반(Whitebox) > CSF > PMF**. 필터 사이 차이보다 **값 맞추기(첫 최저점 · 경사 값)** 영향이 더 큼 → 어느 도구든 우리 자료로 값 시험 필요. + +출처 +- Pingel 2013 https://doi.org/10.1016/j.isprsjprs.2012.12.002 · Zhang 2016 https://www.mdpi.com/2072-4292/8/6/501 +- Montealegre 2015 https://zaguan.unizar.es/record/65619 +- Cățeanu 2017 https://eproceedings.uni-oldenburg.de/website/vol16_1/16_1_cateanu1.html +- Štular · Lozić 2020 https://www.mdpi.com/2072-4292/12/18/3025 +- Klápště 2020 https://doi.org/10.1080/17538947.2020.1791267 +- Moudrý 2020 https://www.researchgate.net/publication/335808328 +- lidR 책 https://r-lidar.github.io/lidRbook/gnd.html · OpenGF https://arxiv.org/abs/2101.09641 · https://github.com/Nathan-UW/OpenGF +- 2025 형태학 필터 https://www.sciencedirect.com/science/article/pii/S2667393225000213 +- 황세란 · 이임평 2011 https://koreascience.kr/article/JAKO201113036233372.page · 구슬 외 2023 https://koreascience.kr/article/JAKO202331439061064.page + +## ④ 우리에 넣는 길 후보 + +| 길 | 어떻게 | 좋은 점 | 걸리는 점 | +|---|---|---|---| +| **A. 단계 하나만 갈아 끼우기 — WbW NG** | 파이썬에서 바로 `improved_ground_point_filter`(또는 경사 기반) → `lidar_tin_gridding`(긴 변 끊기) → 결과 격자를 지금 다듬기 · 기울기 · 물길 · 음영으로 넘김 | pip 한 줄 · 지금 whitebox 와 같은 집안 · 서버 짐 20 MB | 첫선 단계 · 판 고정 필수 · 공개 비교 없음 | +| **B. 따로 실행 파일 — PDAL** | conda-forge 로 만든 PDAL 폴더를 서버에 두고 `pdal pipeline 설정.json` 을 subprocess 로 · 차례 = LAS 읽기 → (분류 칸 있으면 2번 그대로 · 없으면) 낮은 잡점 · 외톨이 → SMRF → 지면만 → TIN 격자(긴 변 끊기) 또는 IDW → GeoTIFF → rasterio 로 받아 다음 단계 | 근거 가장 많음 · CSF · PMF 도 같은 틀에서 바꿔 끼워 비교 · QGIS 4 로 사람이 재현 | conda 설치 · 우리 venv 와 따로 둬야 함 | +| **C. 라이브러리로 — CSF 파이썬** | laspy 로 읽은 점 배열을 그대로 넣어 지면 번호만 받음 | 가장 가벼움(0.13 MB) · Apache | 급경사 약점 → 단독보다 비교 후보 · 또는 SMRF 와 합치기 | +| (평가 전용) LAStools · lidR PTD | 무허가 평가 사용으로 「정답 지면」 만들어 A · B · C 를 수치 대조 | 산악 최고 품질 기준 | 제품엔 넣지 않음 | + +- 분류 칸 있는 LAS — 지면 가르기를 다시 하지 않고 지면(2) · 잡점(7 · 18) 빼기만 확인 · 흠은 격자(IDW 대 TIN · 빈 칸 메움)에서 찾음. +- 대용량 — 타일로 나눠 돌리고 가장자리 겹침 둠(PDAL 나누기 · WbW `lidar_tile`). + +## ⑤ 위험 + +- **라이선스** — GPL 프로그램(QGIS · CloudCompare · GRASS · SAGA · lidR · `pdal_wrench`)을 설치본에 묶으면 원본 제공 · 고지 의무 · 파이썬에서 직접 불러 묶으면(import · 링크) 우리 코드까지 공개 위험 → 묶지 않음. CloudCompare 의 Triangle 상용 제한. LAStools 는 상용이면 좌석마다 구매 · 무허가 판 결과 훼손. +- **설치** — PDAL 은 3.12 휠 없음 → conda 환경을 우리 venv 와 따로 · 같은 프로세스에 올리면 rasterio 의 GDAL 과 conda GDAL 판이 달라 DLL 충돌 위험 → 따로 실행으로 피함. WbW NG 는 Pro 기능을 실수로 쓰지 않게 무료 칸만. +- **서버 크기** — PDAL 수백 MB(추정) · QGIS 약 2.1 GB · WbW 20 MB · CSF 0.13 MB. +- **두 PC(데스크탑 · 랩탑)** — storage 는 시놀로지로 같아도 venv · conda 는 PC 마다 따로 깔림 → 판 번호를 requirements · 환경 파일에 고정 · 판이 다르면 같은 LAS 에서 DEM 이 달라짐 → 파생 저장본 입력 지문에 도구 판을 넣음. +- **결과 바뀜** — 도구를 바꾸면 기존 프로젝트 DEM · 노선 · 토량 수치가 바뀜 → 새 프로젝트부터 또는 고르는 칸으로(초기값 재계산 영향은 사용자 협의). +- **속도** — PMF 매우 느림(산 장면 1,800 s 예) · CSF 중간 · SMRF · PTD 빠름. +- **근거 한계** — 여러 수치가 검색 요약 · 초록 기준(Klápště · Moudrý 원문 미열람) · 연구마다 자료 · 값이 달라 순위는 대략 → 우리 자료 시험이 최종 판정.