2026-10-04

공간 자기상관과 핫스팟 분석 | 가까운 것은 닮는다 | GeoAI 기초 18편

공간 자기상관과 핫스팟 분석 | 가까운 것은 닮는다 | GeoAI 기초 18편

🎬 1분 브리핑 영상

공간 자기상관과 핫스팟 분석은 사고나 재난이 특정 지역에 몰려 발생하는지, 그저 우연인지를 숫자로 구분하는 방법을 알려준다.

📌 3줄 요약

  • 토블러의 법칙, 가까운 곳은 멀리보다 서로 닮는다는 원리
  • Moran's I로 공간 패턴이 우연인지 군집인지 확인한다
  • Getis-Ord 핫스팟으로 사고·재난 집중 지역을 찾아낸다

어느 지역의 교통사고 지도를 펼쳐 놓고 보면, 사고가 유독 몰려 있는 구간이 눈에 띕니다. 이걸 보고 누군가는 "여기가 위험한 곳이네"라고 말하지만, 또 누군가는 "우연히 점이 몰려 보이는 것뿐"이라고 반박할 수 있습니다. 둘 다 그럴듯해 보이는 게 문제입니다. 사람 눈은 무작위로 흩어진 점에서도 괜히 패턴을 찾아내는 버릇이 있거든요. 이럴 때 필요한 게 공간 통계입니다. 어떤 지역이 진짜로 주변과 다르게 사고나 재난이 몰리는지, 아니면 그냥 점이 듬성듬성 찍히다 보니 그렇게 보이는 건지를 통계적으로 검증하는 도구가 바로 공간 자기상관과 핫스팟 분석입니다.

color-coded density map
자료사진 · 사진: lucasgeorgewendt / Pixabay

🗺️ 토블러의 제1법칙이 뭔가요?

지리학자 월도 토블러는 "모든 것은 다른 모든 것과 관련 있지만, 가까운 것이 먼 것보다 더 관련 있다"고 했습니다. 이걸 토블러의 제1법칙이라고 부릅니다. 쉽게 말하면 옆집과 우리 집은 날씨도 비슷하고 집값도 비슷할 가능성이 높지만, 다른 나라에 있는 집과는 그렇지 않다는 뜻입니다. 이 법칙은 너무 당연해 보이지만, 공간 데이터를 다루는 모든 통계의 전제가 됩니다. 일반 통계는 데이터가 서로 독립적이라고 가정하는데, 공간 데이터는 이웃끼리 닮아 있어서 그 가정이 깨지기 때문입니다. 재난 데이터도 마찬가지입니다. 산사태가 난 지점 옆 사면은 지질이나 경사가 비슷해서 산사태 위험도 비슷하게 나타나는 경우가 많습니다. 이런 이웃 효과를 무시하고 지점 하나하나를 독립된 사건으로만 보면, 왜 피해가 특정 골짜기에 몰렸는지 설명하기 어려워집니다.

📊 Moran's I는 뭘 알려주나요?

Moran's I는 공간 자기상관을 숫자 하나로 요약한 지표입니다. 값은 보통 -1에서 1 사이로 나오는데, 1에 가까우면 비슷한 값끼리 뭉쳐 있다는 뜻이고(군집), -1에 가까우면 비슷한 값끼리 멀리 떨어져 체스판처럼 번갈아 나타난다는 뜻이고(분산), 0에 가까우면 무작위에 가깝다는 뜻입니다. 중요한 건 이 값 자체보다 "이 패턴이 우연히 나올 확률은 얼마나 되는가"를 같이 봐야 한다는 점입니다. 보통 p-value(우연히 이런 결과가 나올 확률)라는 수치를 같이 확인해서, 이 값이 충분히 작아야 "진짜 패턴이 있다"고 말할 수 있습니다. 예를 들어 홍수 피해 신고가 들어온 지역의 Moran's I를 구했는데 값이 높고 p-value도 작다면, 피해가 특정 저지대에 몰려 있다는 걸 통계적으로 뒷받침할 수 있습니다. 반대로 값이 낮으면 피해가 지역 전체에 고르게 흩어져 있다는 뜻이니, 배수 시설 같은 국지적 원인보다 전반적인 강우량을 먼저 의심해봐야 합니다.

🔥 핫스팟(Getis-Ord)은 뭐가 다른가요?

Moran's I가 "전체적으로 패턴이 있는가"를 하나의 숫자로 말해준다면, Getis-Ord Gi*(지스타)는 "그럼 구체적으로 어디가 뜨거운 곳(핫스팟)이고 어디가 차가운 곳(콜드스팟)인가"를 지점마다 짚어줍니다. 각 지점과 그 주변 이웃들의 값을 비교해서, 주변 전체보다 유의미하게 높은 값이 몰린 곳을 핫스팟으로, 유의미하게 낮은 값이 몰린 곳을 콜드스팟으로 표시합니다. 결과는 보통 신뢰도에 따라 90%, 95%, 99% 구간으로 나눠 지도에 색을 입혀 보여줍니다. 산불 발생 이력 데이터에 이 분석을 돌리면, 단순히 점이 많은 곳이 아니라 통계적으로 유의미하게 발화가 집중된 구역을 짚어낼 수 있습니다. 이렇게 뽑힌 핫스팟은 예방 순찰 경로나 감시 카메라 배치 우선순위를 정하는 근거 자료로 쓰이곤 합니다.

🚗 사고 데이터에 어떻게 적용하나요?

교통사고나 응급 신고처럼 점 형태로 쌓인 데이터는 핫스팟 분석과 궁합이 좋습니다. 다만 주의할 점이 있는데, 점 데이터를 그대로 쓰기보다 격자(일정 크기의 네모 칸)나 행정구역 단위로 집계한 다음 분석하는 경우가 많습니다. 점 하나하나의 위치 오차나 우연한 쏠림을 줄이기 위해서입니다. 또 하나 중요한 건 이웃을 어떻게 정의하느냐에 따라 결과가 달라진다는 점입니다. 거리 기준으로 500미터 안을 이웃으로 볼지, 인접한 행정구역만 이웃으로 볼지에 따라 핫스팟의 모양과 범위가 바뀝니다. 그래서 이 기준값은 정답이 정해져 있다기보다 해봐야 아는 것에 가깝습니다. 여러 거리값으로 반복해서 돌려보고, 결과가 크게 흔들리지 않는 안정적인 구간을 찾는 과정이 필요합니다. 이런 식으로 찾아낸 사고 핫스팟은 교통안전시설 개선이나 대피소 접근로 점검 같은 실제 조치의 우선순위를 정하는 데 쓰입니다.

⚠️ 핫스팟 분석, 이것만은 주의하세요

핫스팟 분석은 "어디가 위험한가"를 보여주지, "왜 위험한가"는 말해주지 않습니다. 원인 분석은 별개의 작업입니다. 또 데이터가 적은 지역은 우연히 몇 건만 몰려도 핫스팟처럼 보일 수 있어서, 표본 수가 충분한지 꼭 확인해야 합니다. 행정구역 경계를 바꾸면 결과도 달라지는 현상(가변 공간단위 문제라고 부릅니다)도 알아두면 좋습니다. 분석 단위를 읍면동으로 하느냐 1km 격자로 하느냐에 따라 핫스팟 모양이 달라질 수 있다는 뜻입니다. 재난 대응 현장에서는 이 분석 결과를 유일한 근거로 쓰기보다, 현장 조사나 다른 통계와 함께 교차 확인하는 보조 도구로 쓰는 게 안전합니다.

🖥️ 화면에서 따라하기

따라하기 단계

  1. 데이터 준비
    사고·재난 지점의 위도경도가 담긴 표(csv)나 포인트 레이어를 준비한다
  2. QGIS 설치 확인
    QGIS 실행 후 플러그인 메뉴에서 공간 통계 관련 도구 설치 여부를 본다(버전마다 위치가 다를 수 있다)
  3. 레이어 불러오기
    레이어 > 레이어 추가 > 벡터 레이어에서 csv나 shp 파일을 불러온다
  4. 공간 가중치 설정
    처리 도구상자에서 '거리 기반 가중치' 혹은 '인접 기반 가중치' 도구를 검색해 실행한다
  5. Moran's I 실행
    처리 도구상자에서 'Moran's I' 또는 '공간 자기상관' 검색 후 대상 필드를 지정해 실행한다
  6. 결과 확인
    출력된 Moran's I 값과 p-value를 로그 패널에서 확인하고 지도에 색상으로 표시해본다

※ 프로그램 버전에 따라 메뉴 이름이 조금씩 다를 수 있습니다. 위 그림은 순서를 정리한 도식입니다.

✍️ 그대로 복사해 쓰는 프롬프트

공간 자기상관 분석 결과를 보고서 문장으로 풀어쓰기

역할은 공간통계를 쉽게 설명하는 GIS 분석가다
아래 분석 결과를 바탕으로 비전문가도 이해할 수 있는 2~3문단 요약을 작성해줘
분석 대상은 [분석 대상, 예: 2024년 교통사고 발생 지점]이고
Moran's I 값은 [수치], p-value는 [수치]이다
핫스팟으로 분류된 지역은 [지역명 목록]이다
통계 용어는 괄호 안에 쉬운 설명을 덧붙이고
확인되지 않은 원인은 추측하지 말고 "추가 조사가 필요하다"고만 표현해줘
결과는 보고서 서론에 들어갈 문단 형식으로 작성해줘

※ 대괄호 부분을 상황에 맞게 바꿔서 쓰세요. 받은 답은 그대로 쓰지 말고 사실 확인을 거치세요.

🧪 직접 해보기

  • QGIS나 공개 GIS 도구에서 자기 지역 사고 데이터를 불러와 지도에 점으로 찍어본다
  • 같은 데이터로 격자 크기를 다르게(500m, 1km) 해서 핫스팟 결과가 어떻게 달라지는지 비교해본다
  • 뉴스나 공공데이터포털에서 받은 재난 신고 통계로 Moran's I를 직접 계산해보고 p-value를 확인한다

❓ 자주 묻는 질문

Q. Moran's I 값이 높으면 무조건 위험 지역인가요?
A. 아닙니다. 값이 높다는 건 비슷한 값끼리 뭉쳐 있다는 뜻일 뿐이고, 그 값 자체가 낮은 수준에서 뭉쳐 있을 수도 있습니다. 반드시 원래 데이터의 크기와 함께 해석해야 합니다.

Q. 핫스팟 분석과 그냥 지도에 점 많은 곳 찾는 것의 차이는 뭔가요?
A. 점이 많아 보여도 전체 데이터 양이 많으면 우연히 그럴 수 있습니다. 핫스팟 분석은 주변과 비교해 통계적으로 유의미하게 쏠렸는지를 검증한다는 점이 다릅니다.

Q. 이 분석에 필요한 최소 데이터 양이 있나요?
A. 정해진 기준은 없지만 표본이 너무 적으면 결과가 불안정해집니다. 여러 기간이나 단위를 바꿔가며 결과가 일관되게 나오는지 직접 확인해보는 게 안전합니다.

가까운 곳은 서로 닮는다는 단순한 생각이 공간 통계의 출발점이 되고, 그 생각을 숫자로 검증하는 순간 지도 위의 느낌은 근거 있는 판단으로 바뀝니다. 다음 편에서는 이렇게 찾아낸 핫스팟을 시간 축까지 더해 "언제, 어디서" 위험이 반복되는지 살펴보는 시공간 분석을 다뤄보겠습니다.

GeoAI 기초 시리즈 18편 · 전체 43편


재난안전과 GeoAI 이야기를 더 보고 싶다면 아래 채널도 함께 보세요.

📌 바로가기

NaGeoAI 실제 QGIS 실습 7 | OpenSR 초해상도와 4배 출력 격자 검증

본 실습에서는 NaGeoAI의 OpenSR 초해상도 기능을 QGIS 데스크톱에서 실행하고, 생성된 GeoTIFF의 크기, 픽셀 간격, 좌표계 및 유효값을 검증하였다. 2026년 10월 4일 실제 실행 화면을 단계별로 제시한다. 픽셀 회귀는 학습된 Lightning 체크포인트가 준비되지 않아 후속 실습으로 남겨 두었다.

1. 실습 목적과 검증 범위

Sentinel-2 예제 영상에서 128×128 픽셀의 관심영역을 추출하여 RGB 및 근적외선(NIR) 4개 밴드를 처리한다. 입력 10 m 격자가 출력 2.5 m 격자로 변환되고 공간 범위가 유지되는지를 확인하는 것이 목적이다. 2.5 m 출력 간격은 관측 해상도나 위치 정확도가 2.5 m로 향상되었다는 의미가 아니다. 고해상도 참조 영상이 없으므로 복원 정확도, PSNR, SSIM 및 객체 판독 성능은 평가하지 않았다.

2. 플러그인 설치와 필수 환경 확인

  1. NaGeoAI-1.9.1.zip을 내려받는다. ZIP 파일은 압축을 풀지 않은 상태로 설치한다.
  2. QGIS의 플러그인 → 플러그인 관리 및 설치 → ZIP에서 설치에서 내려받은 파일을 선택하고 NaGeoAI를 활성화한다.
  3. NaGeoAI → 필수 환경·모델 설치에서 AI 환경, opensr-model 및 OpenSR 모델의 준비 상태를 확인한다. 누락된 항목만 설치·다운로드하고 이미 설치된 항목은 건너뛴다.
  4. 이번 실행은 QGIS 3.44.12에 이미 설치된 NaGeoAI 1.9.1을 사용하였다. 재설치를 수행하지 않았으므로 새 설치 화면으로 표시하지 않는다. 실제 과거 설치 과정은 실습 1: 설치부터 NAIP 변화탐지까지를 참고한다.

opensr-model 1.1.1과 opensr-ldsrs2_v1_0_0.ckpt의 존재를 확인하였다. 체크포인트는 1,130,715,795 바이트이며 SHA-256은 e2621e3912eb7c14867c3d20c9029607ba941be8e166dc09621860fcac27dc3a이다. 설치 검사값과 실제 파일 해시가 일치하였다. 모델 설정 파일은 실행 시 인터넷에서 읽으므로 모델이 설치되어 있어도 네트워크 연결이 필요하다.

3. 예제 파일 다운로드와 관심영역 준비

Sentinel-2 6밴드 예제 GeoTIFF 다운로드를 열어 파일을 저장한다. 출처는 Source Cooperative의 opengeos/geoai 예제 자료이다. 파일명은 2019년 3월 18일 Sentinel-2 L2A 자료를 나타낸다. 배포 파일 자체의 별도 버전은 확인되지 않았다. 원본 예제와 모델은 이 글의 GitHub 이미지 폴더에 재배포하지 않았다. Sentinel 자료의 기본 이용 정책은 Copernicus 이용 조건을 확인한다. 화면은 해당 예제로 직접 실행한 파생 결과이며 교재의 그림을 복제하지 않았다.

원본은 760×711 픽셀, 6밴드 UInt16, 파일에 기록된 CRS는 EPSG:32647, 픽셀 간격은 10 m이다. 밴드 순서는 B2, B3, B4, B8, B11, B12이다. 원본은 보존하고 GDAL의 아래 명령으로 열 오프셋 300, 행 오프셋 250부터 128×128 영역을 별도 추출하였다. 재표본화는 수행하지 않았다. 출력 파일이 이미 있으면 새 이름을 사용한다.

gdal_translate -srcwin 300 250 128 128 -co COMPRESS=LZW S2A-L2A-20190318-N0211-R061-6Bands-S2.tif s2_roi128_20261004.tif

4. 시작 프로젝트를 보존하고 입력 레이어 확인

QGIS에서 QGIS_Play.qgz를 연 다음, 분석 레이어를 추가하기 전에 프로젝트 → 다른 이름으로 저장으로 QGIS_Play_NaGeoAI_20261004_superresolution.qgz 복사본을 만든다. 이번 실행은 QGIS GUI의 Python 콘솔에서 QgsProject.read, setFileName, write를 호출하여 원본 열기와 복사본 저장을 수행하고 저장 성공과 현재 파일명을 확인하였다. 원본의 SHA-256은 작업 전후 동일하였다.

레이어 → 레이어 추가 → 래스터 레이어 추가로 관심영역 파일을 불러온다. 이번 실행에서는 QGIS 콘솔의 iface.addRasterLayer로 동일한 레이어를 추가하였다. 프로젝트 표시 CRS를 입력 CRS에 맞춘 것은 복사본에만 적용하였다. 첫 화면의 기본 RGB 표시가 파일의 밴드 1·2·3을 사용하더라도 모델 입력은 다음 단계에서 반드시 3·2·1·4로 지정한다. 화면 색상만으로 입력·출력의 성능을 비교하지 않는다.

초해상도 단계 1: 프로젝트 복사본, 입력 관심영역 및 설정값
그림 1. 실제 QGIS 프로젝트 복사본, 입력 레이어와 NaGeoAI 설정 화면. 콘솔에서 입력 유효성, EPSG:32647, 128×128 크기와 10 m 간격을 확인하였다. 클릭하면 원본 크기로 볼 수 있다.

5. NaGeoAI 초해상도 입력값 지정과 실행

  1. NaGeoAI 도구 모음의 추가 분석을 열고 기능 목록에서 초해상도를 선택한다.
  2. 입력 래스터는 s2_roi128_20261004.tif로 지정한다.
  3. R,G,B,NIR 밴드는 3,2,1,4, 샘플링 단계는 50으로 입력한다.
  4. 출력은 기존 파일과 겹치지 않는 s2_sr4x_20261004.tif로 지정하고 공간 결과를 지도에 추가를 체크한다.
  5. 실행을 누른 후 시작 로그와 완료 로그를 확인한다. 기본 처리 배율은 4배이며 불확실성 지도를 별도로 계산하지 않았다.
초해상도 단계 2: 밴드 3,2,1,4와 50단계 실행 시작 로그
그림 2. 실행 직후 실제 화면. ‘초해상도 시작...’ 메시지와 입력·출력 경로, 밴드 번호, 샘플링 단계를 확인한다.
초해상도 단계 3: 실제 출력 레이어와 완료 로그
그림 3. 실제 출력 레이어가 추가된 화면과 ‘Super-resolution complete’ 메시지. 개인 모델 캐시 경로가 표시되지 않도록 로그 표시 영역을 축소하고 마지막 부분으로 스크롤하였다. 로그 내용이나 결과는 변경하지 않았다.

6. 출력 격자와 데이터 검증

항목입력 관심영역OpenSR 출력
크기128×128512×512
밴드6개 중 3,2,1,4 사용RGB+NIR 4개
자료형UInt16Float32
기록된 CRSEPSG:32647EPSG:32647
픽셀 간격10×10 m2.5×2.5 m
범위left 904340, bottom 1809370, right 905620, top 1810650 — 동일

QGIS에서 출력 레이어 isValid=True, 폭·높이 512×512, 밴드 수 4, 픽셀 간격 2.5 m 및 입력과의 범위 일치를 확인하였다. 추가로 Rasterio에서 전 밴드를 읽어 1,048,576개 값이 모두 유한함을 확인하였다. 전체 값의 범위는 약 0.0838000~0.3320000이었다. 이 수치 검사는 파일 읽기와 수치 유효성 검사이며 방사 정확도 검증이 아니다.

초해상도 단계 4: QGIS 콘솔의 512×512, 2.5m 및 범위 일치 검증
그림 4. 실제 QGIS에서 출력 레이어 격자를 조회한 화면. OUTPUT의 크기·밴드·CRS·간격과 SAME EXTENT: True를 확인한다.

7. 주의사항과 한계

저장 과정에서 ‘BLOCKXSIZE can only be used with TILED=YES’ 경고가 발생하였다. 따라서 경고가 전혀 없는 실행으로 표현하지 않는다. 이후 완료 로그, 출력 생성, QGIS 로딩 및 Rasterio 전 밴드 읽기가 확인되었다. 이번 결과의 파일·격자 검증은 통과하였으나 저장 프로파일의 타일·블록 옵션은 별도 개선이 필요하다.

원본 예제의 기록 CRS는 UTM zone 47N이지만 GDAL이 산출한 경도는 약 102.8°E로 해당 UTM 구역의 일반 적용 범위를 벗어난다. 원자료의 위치·CRS 메타데이터 정합성을 별도로 확인해야 한다. 이번 실습은 메타데이터를 임의로 재지정하지 않고 동일 격자에서 처리했으며, 절대 위치 정확도나 다른 지도와의 정합을 검증한 것으로 해석하면 안 된다.

확산 모델은 추정 결과를 생성한다. 선명하게 보이는 무늬가 실제 관측된 세부 구조라는 보장은 없다. 참고 고해상도 영상 없이 시설물 경계, 재난 피해 면적 또는 측량 성과로 직접 활용하지 않는다. 입력과 출력의 색상 표시 방식 및 스케일이 다르므로 화면 색상 변화만으로 품질을 판단하지 않는다.

8. 프로젝트 저장과 정상 종료

입력·결과·검증 화면 확보 후 실습용 복사본을 다시 저장하였다. 저장 파일은 8,248 바이트이며 최종 갱신 시각은 2026년 10월 4일 오전 5시 13분이었다. 이어 QGIS의 정상 종료 명령을 실행하고 실습 창이 닫힌 것을 확인하였다. 원본 QGIS_Play.qgz는 덮어쓰지 않았다.

모델 구현과 사용 조건은 ESAOpenSR 공식 저장소를 참고한다. 이번 글의 그림 1~4는 실제 QGIS 캡처이며 공개 GitHub 커밋에 고정된 주소를 사용한다. 생성 이미지나 로컬 경로를 그림 대신 넣지 않았다.

2026-10-03

AI로 재난 훈련 시나리오 만들기 | 생성형 AI 사용법 6

AI로 재난 훈련 시나리오 만들기 | 생성형 AI 사용법 6

AI로 재난 훈련 시나리오 만들기는 초안 작성 시간을 줄여주지만, 지역 정보와 실제 매뉴얼을 넣고 전문가가 검토해야 실전에서 쓸 수 있습니다.

📌 3줄 요약

  • AI로 재난 훈련 시나리오 초안을 빠르게 만드는 절차를 소개
  • 지역 특성과 실제 매뉴얼을 넣어야 쓸모 있는 시나리오가 됨
  • 인명·법령·절차는 반드시 전문가가 검토해야 함

안전한국훈련이나 자체 비상대응훈련을 맡은 담당자라면 매년 비슷한 고민을 합니다. 작년과 다른 상황을 만들어야 하는데, 처음부터 시나리오를 짜려면 반나절이 훌쩍 지나갑니다. 상황 부여 문구, 시간대별 진행표, 참가자별 체크리스트까지 손으로 채우다 보면 정작 중요한 지역 특성 반영이나 매뉴얼 대조는 뒷전이 되기 쉽습니다.

이번 글에서는 생성형 AI로 재난 대응 훈련 시나리오와 체크리스트 초안을 만드는 절차를 다룹니다. 다만 AI가 만든 글은 어디까지나 뼈대일 뿐, 그 지역의 실제 상황과 법정 매뉴얼을 입혀야 비로소 쓸 수 있는 문서가 됩니다. 어디서부터 어디까지 AI에 맡기고, 어디서부터는 사람이 반드시 봐야 하는지 짚어보겠습니다.

disaster drill simulation screen
자료사진 · 사진: blickpixel / Pixabay

📝 AI한테 시나리오를 맡기면 뭐부터 달라지나요?

시나리오 작성에서 가장 시간이 걸리는 부분은 뼈대 잡기입니다. 발생 시각, 초기 신고, 상황 전파, 대응 조치, 복구까지 흐름을 순서대로 늘어놓는 작업인데, AI는 이 흐름을 몇 초 만에 뽑아줍니다. 예를 들어 집중호우로 인한 하천 범람 상황이라면 기상특보 발령부터 주민 대피 권고, 응급 복구반 출동까지 표 형태로 정리해줍니다.

문제는 이 뼈대가 일반론이라는 점입니다. AI는 특정 지역의 하천 폭이나 대피소 위치, 실제 통신망 상태를 모릅니다. 그래서 초안은 말 그대로 틀일 뿐이고, 여기에 우리 동네 정보를 채워 넣는 작업이 뒤따라야 합니다. 안전한국훈련 실무 3편에서 다룬 상황 부여·진행표 작성과 이어지는 단계로 보면 됩니다.

🗺️ 지역 특성을 안 넣으면 왜 훈련이 헛돌까요?

똑같은 홍수 시나리오라도 상류에 저수지가 있는 지역과 바닷가 저지대는 대응 방식이 완전히 다릅니다. 저수지가 있으면 방류 통보와 하류 주민 대피가 핵심이고, 저지대라면 만조 시간과 배수펌프장 가동 여부가 관건입니다. AI는 이런 지역 조건을 알려주지 않으면 알아서 채워주지 않습니다.

그래서 프롬프트에 하천명, 과거 침수 이력, 대피소 수용 인원, 취약계층 분포 같은 정보를 직접 넣어줘야 합니다. 산사태 위험지도(GeoAI 기초 13편)나 침수 이력 같은 공간 데이터를 참고해서 숫자와 지명을 구체적으로 넣을수록 시나리오가 현실감을 갖습니다. 지역 정보 없이 만든 시나리오로 훈련하면 참가자들이 몰입하지 못하고, 정작 필요한 절차를 놓치는 경우가 많습니다.

📋 실제 매뉴얼이랑 안 맞으면 무슨 문제가 생기나요?

AI는 일반적인 재난 대응 절차는 알지만, 특정 기관의 위기관리 매뉴얼이나 실무 매뉴얼의 정확한 조항·보고 체계·용어까지는 알지 못합니다. 기관마다 보고 라인이 다르고, 같은 '대피 권고'라도 발령 권한자가 다를 수 있습니다. AI가 만든 초안을 그대로 쓰면 실제 매뉴얼과 어긋난 절차가 섞여 들어가기 쉽습니다.

가장 확실한 방법은 해당 기관의 매뉴얼 원문(또는 공개된 요약본)을 함께 입력해 "이 매뉴얼의 보고 체계와 용어를 그대로 써서 시나리오를 수정해줘"라고 요청하는 것입니다. 이렇게 하면 AI가 지어낸 절차가 아니라 실제 쓰는 절차에 맞춰 문장을 고쳐줍니다. 매뉴얼과 다른 용어 하나가 훈련 중 혼선을 부를 수 있다는 점에서, 이 작업은 건너뛰면 안 되는 단계입니다.

✅ 체크리스트는 AI한테 맡겨도 괜찮을까요?

체크리스트는 빠뜨리기 쉬운 항목을 모아놓는 역할을 합니다. 참가자별 역할, 장비 점검, 통신 수단 이중화, 취약계층 확인 같은 항목을 AI에 요청하면 꽤 촘촘하게 뽑아줍니다. 특히 "해봐야 아는 것"이 많은 영역이라, AI가 뽑은 체크리스트를 실제 훈련장이나 사무실에서 하나씩 짚어보며 빠진 항목이 없는지 확인하는 절차가 꼭 필요합니다.

예를 들어 AI가 "비상연락망 최신화 여부 확인"이라는 항목을 줬다면, 실제로 연락망 문서를 열어 최근 인사이동이 반영됐는지 직접 확인해야 합니다. 말로만 체크하면 의미가 없고, 직접 전화를 걸어보거나 문서를 대조하는 과정에서 진짜 허점이 드러납니다. 이런 현장 확인 단계가 빠지면 체크리스트는 그냥 보기 좋은 목록으로만 남습니다.

👀 전문가 검토는 어디까지 필요한가요?

AI가 만든 시나리오와 체크리스트에서 가장 위험한 부분은 그럴듯하게 틀린 내용입니다. 법령 인용, 보고 체계, 책임 소재, 수치 같은 항목은 틀려도 문장이 자연스러워서 알아채기 어렵습니다. 생성형 AI 사용법 3편에서 다룬 환각 문제가 여기서도 그대로 나타납니다.

그래서 시나리오 초안이 나오면 재난 대응 실무를 아는 사람, 그리고 가능하면 관할 기관 담당자가 함께 보는 검토 단계를 반드시 거쳐야 합니다. 특히 대피 기준 시각, 발령 권한자, 취약시설 명단처럼 사람의 안전과 직결되는 항목은 AI 문장을 그대로 믿지 말고 원본 자료와 한 줄씩 대조해야 합니다. 초안은 AI가 빠르게 만들어주지만, 최종 책임은 언제나 검토한 사람에게 있다는 점을 잊지 않는 것이 중요합니다.

🖥️ 화면에서 따라하기

따라하기 단계

  1. 대화 시작
    AI 도구에서 새 대화를 열고 재난 유형과 지역명, 훈련 목적을 먼저 설명한다
  2. 자료 첨부
    매뉴얼 파일이나 침수 이력 자료를 업로드 버튼으로 올리거나 본문에 붙여 넣는다
  3. 초안 요청
    "시간대별 진행표와 상황 부여 문구를 표로 만들어줘"처럼 형식을 지정해 요청한다
  4. 지역화 수정
    "하천명, 대피소명, 과거 침수 사례를 반영해서 다시 써줘"라고 구체적으로 고쳐 달라고 한다
  5. 문서 변환
    "한글(hwpx) 문서로 정리해줘"처럼 요청하면 바로 내려받을 수 있는 도구도 있다
  6. 전문가 전달
    완성된 초안을 담당 부서나 전문가에게 보내 매뉴얼 대조 검토를 요청한다
  7. ※ 메뉴 이름과 업로드
    ※ 메뉴 이름과 업로드 방식은 AI 도구마다 다를 수 있으니, 화면 하단이나 설정 메뉴에서 파일 첨부 아이콘을 찾아보세요.

※ 프로그램 버전에 따라 메뉴 이름이 조금씩 다를 수 있습니다. 위 그림은 순서를 정리한 도식입니다.

✍️ 그대로 복사해 쓰는 프롬프트

막연한 요청으로 일반적인 시나리오 뼈대만 받기

[재난 유형]을 주제로 한 재난대응 훈련 시나리오를 만들어줘. 시간대별 진행표 형태로 정리해줘.

지역 정보와 매뉴얼을 반영한 구체적인 시나리오 받기

너는 [기관명]의 안전관리 담당자를 돕는 보조자야. [지역명]에서 [재난 유형]이 발생했다고 가정하고, 아래 조건을 반영해서 시간대별 상황 부여와 진행표를 표로 작성해줘. 조건: 하천명 [하천명], 과거 피해 이력 [침수/산사태 이력 요약], 대피소 [대피소명과 수용 인원], 보고 체계는 첨부한 매뉴얼의 용어와 순서를 그대로 따를 것. 법령이나 수치는 확실하지 않으면 추정하지 말고 "확인 필요"라고 표시해줘.
확인할 점: 보고 체계와 발령 권한자가 실제 매뉴얼과 일치하는지, 대피소 수용 인원과 지명이 최신 자료와 맞는지 사람이 직접 대조해야 합니다.

※ 대괄호 부분을 상황에 맞게 바꿔서 쓰세요. 받은 답은 그대로 쓰지 말고 사실 확인을 거치세요.

🧪 직접 해보기

  • AI에 막연한 요청과 지역 정보를 넣은 요청 두 가지로 시나리오를 받아 내용 차이를 비교해보기
  • 받은 체크리스트 항목 중 하나를 골라 실제 연락망이나 장비 목록과 직접 대조해보기
  • 공개된 재난안전 포털에서 우리 지역 침수·산사태 이력을 찾아 프롬프트에 넣어보기

❓ 자주 묻는 질문

Q. AI가 만든 시나리오를 그대로 훈련에 써도 되나요?
A. 초안으로만 쓰고 그대로 쓰면 안 됩니다. 지역 정보와 실제 매뉴얼을 반영하고 전문가 검토를 거친 뒤에 사용해야 합니다.

Q. 매뉴얼을 통째로 AI에 올려도 괜찮나요?
A. 기관 내부 문서나 민감 정보가 포함된 매뉴얼은 보안 정책을 먼저 확인해야 합니다. 공개된 요약본이나 승인된 범위 내에서만 활용하는 것이 안전합니다.

Q. 체크리스트에 뭘 더 넣어야 할지 모르겠는데 AI가 다 알려주나요?
A. AI는 일반적인 항목을 폭넓게 제안해주지만 우리 조직만의 특수 상황은 모릅니다. 과거 훈련에서 나온 문제점을 함께 입력해 보완하는 것이 좋습니다.

AI는 재난 훈련 시나리오의 뼈대를 빠르게 만들어주지만, 그 뼈대에 지역의 진짜 이야기와 매뉴얼을 입히고 전문가가 검토하는 과정까지 거쳐야 비로소 쓸 수 있는 문서가 됩니다. 다음 편에서는 이렇게 만든 훈련 결과를 AI로 분석해 개선점을 찾는 방법을 다뤄보겠습니다.

생성형AI 사용법 시리즈 6편 · 전체 15편


재난안전과 GeoAI 이야기를 더 보고 싶다면 아래 채널도 함께 보세요.

📌 바로가기

NaGeoAI 실제 QGIS 실습 6 | 영상분류 실행과 JSON 숫자 배열 검증

본 실습에서는 NaGeoAI의 영상분류 기능을 QGIS 데스크톱에서 실행하고, 생성된 JSON 파일의 구조와 확률값을 검증하였다. 주차장 예제 영상 한 장을 입력으로 사용하였으며, 실행 완료와 분류 의미의 타당성을 구분하여 설명한다. 모든 그림은 2026년 10월 3일 해당 PC에서 실제 수행한 화면이다.

1. 실습 목적과 적용 범위

영상분류(image classification)는 입력 영상 전체에 하나의 범주를 부여하는 작업이다. 앞선 객체탐지 실습처럼 차량별 경계상자를 생성하지 않으며, 토지피복 픽셀 분류도 수행하지 않는다. 이번 실습의 목적은 입력 영상 확인 → 모델 추론 → JSON 저장 → 수치 검증의 절차를 재현하는 데 있다.

2. 프로그램 설치와 환경 확인

실행 환경은 Windows, QGIS 3.44.12, NaGeoAI 1.9.1에 JSON 직렬화 수정을 적용한 로컬 설치본이다. 모델은 google/vit-base-patch16-224이며, 실제 로그에서 CUDA 사용을 확인하였다.

  1. NaGeoAI-1.9.1.zip 다운로드를 클릭하여 ZIP을 내려받는다. 압축을 풀지 않는다.
  2. QGIS의 플러그인 → 플러그인 관리 및 설치 → ZIP에서 설치에서 ZIP을 선택하고 설치한다. 기존 설치가 있으면 버전과 활성화 상태를 먼저 확인한다.
  3. QGIS를 다시 열고 NaGeoAI 최초 실행 환경 설정에서 필요한 AI 환경의 설치 상태를 확인한다. 누락된 항목만 설치·다운로드하며, 이미 설치된 항목은 건너뛴다. 이번 영상분류에는 OpenSR 모델을 사용하지 않는다.
  4. 인터넷에 연결된 상태에서 영상분류 모델을 처음 실행하면 모델 파일을 받는다. 이후에도 모델 설정 확인을 위한 네트워크 요청이 발생할 수 있으므로, 캐시가 있다고 해서 모든 요청이 생략되는 것은 아니다.

이번에는 플러그인을 재설치하지 않았다. 따라서 새 설치 화면을 촬영한 것으로 표시하지 않고 설치 절차를 글로 안내한다. 아래의 5개 그림은 입력·설정·실행·검증 화면이다.

JSON 저장 수정 사항

공개 v1.9.1 ZIP에는 이번 로컬 직렬화 수정이 아직 반영되지 않았다. 기존 default=str 방식은 NumPy 확률 배열을 문자열로 저장할 수 있다. 이번 검증본은 workers/geoai_task_worker.py의 image_classification 결과 저장 부분을 다음과 같이 수정하고 QGIS를 다시 시작하였다. 같은 숫자 배열 결과를 재현하려면 해당 수정이 필요하다. 수정 전 파일은 별도로 백업한다.

json.dump(result, report, ensure_ascii=False, indent=2,
          default=lambda value: value.tolist() if hasattr(value, "tolist") else str(value),
          allow_nan=False)

3. 예제 파일 다운로드와 입력 확인

사용 자료는 Source Cooperative의 OpenGeos GeoAI 예제 parking-lot.tif이다. 원본 예제 파일 다운로드를 눌러 저장한다. 이 PC에서는 D:\QGIS_Plugin\SampleData\NaGeoAI 폴더에 보관하였다. 실습 화면의 공개 사용은 사용자의 승인을 받았으며, 이를 원본 영상의 일반적인 자유 재배포 허가로 확대하여 해석하지 않는다. 원본 영상과 모델 파일은 이번 GitHub 업로드에 포함하지 않았다. 촬영일과 개별 원본 라이선스는 확인되지 않았으므로 별도의 현장·시기 분석 근거로 사용하지 않는다.

원본 QGIS_Play.qgz는 덮어쓰지 않고 QGIS_Play_NaGeoAI_20261003_classification_check.qgz 복사본을 열었다. 예제 영상은 별도 파일로 추가해야 한다. 일반적인 입력 방법은 레이어 → 레이어 추가 → 래스터 레이어 추가이다. 이번 실제 실행에서는 QGIS의 Python 콘솔에서 다음 명령으로 영상을 추가하였다. 분류 처리는 콘솔이 아니라 NaGeoAI 패널의 실행 버튼으로 수행하였다.

sample = iface.addRasterLayer('D:/QGIS_Plugin/SampleData/NaGeoAI/parking-lot.tif', 'parking-lot')
QgsProject.instance().setCrs(sample.crs())
iface.mapCanvas().setExtent(sample.extent())
iface.mapCanvas().refresh()

유효한 입력 레이어, EPSG:3857, 1,659×938 픽셀, RGB 3밴드, uint8 자료형을 확인하였다. X·Y 픽셀 간격은 각각 0.1492789632, 0.1493203625 투영좌표 단위이다. EPSG:3857의 간격을 현장 지상거리 정확도로 직접 해석하지 않는다. 미국 예제 영상의 표시를 위해 실습 복사본의 프로젝트 CRS만 EPSG:3857로 변경하였고 원본 EPSG:5187 프로젝트는 보존하였다.

QGIS 주차장 입력 영상과 CRS 크기 밴드 픽셀 간격 검증
그림 1. QGIS에서 주차장 영상이 표시되고 콘솔에서 입력 메타데이터를 확인한 화면. 배경지도는 분석 입력으로 사용하지 않았다. (클릭하면 원본 크기로 확인할 수 있다.)

4. NaGeoAI 영상분류 입력값 설정

  1. NaGeoAI 도구 모음의 추가 분석을 열고 기능 목록에서 영상분류를 선택한다.
  2. 입력 영상에 D:/QGIS_Plugin/SampleData/NaGeoAI/parking-lot.tif를 지정한다. 지도에 보이는 레이어와 이 파일이 같은 자료인지 확인한다.
  3. Hugging Face 모델에 google/vit-base-patch16-224를 입력한다.
  4. 출력 경로를 D:/QGIS_Plugin/SampleData/NaGeoAI/verification/classification_gui_20261003_approved.json으로 지정한다. 기존 결과를 보존하기 위해 새로운 파일명을 사용하였다.
  5. 이 기능의 출력은 비공간 JSON이므로 공간 결과를 지도에 추가는 해제하였다.
NaGeoAI 영상분류 입력 파일 모델 결과 JSON 설정
그림 2. 실제 영상분류 설정. 입력 파일, 모델 식별자, 새 JSON 출력 경로를 확인한다. (클릭하면 원본 크기로 확인할 수 있다.)

5. 실행과 완료 로그 확인

실행 버튼을 누르면 패널에 영상분류 시작 메시지가 표시되고, 실행 중 버튼이 비활성화된다. 로그의 네트워크 응답 한 줄만으로 성공을 판단하지 않는다. 처리가 끝난 뒤 CUDA 모델 적재 메시지, 결과 요약, 출력 파일 경로를 확인하고 실제 파일 존재 여부를 검사한다.

NaGeoAI 실행 직후 영상분류 시작 메시지
그림 3. 실행 버튼을 누른 직후의 실제 화면. 영상분류 시작 메시지와 비활성화된 실행 버튼이 보인다. (클릭하면 원본 크기로 확인할 수 있다.)
CUDA 영상분류 완료 로그와 JSON 파일 경로
그림 4. 실제 처리 완료 로그. Model loaded on cuda, 클래스 요약 및 결과 JSON 경로를 확인하였다. 지도에 보이는 영상은 입력 영상이며 분류 결과 지도가 아니다. (클릭하면 원본 크기로 확인할 수 있다.)

6. 출력 파일 구조와 수치 검증

완료 후 QGIS Python 콘솔에서 생성된 파일을 다시 읽어 probabilities의 자료형, 개수, 합계, 최상위 클래스 점수 및 유한값 여부를 검사하였다. 파일 검사는 외부 Python 환경에서도 동일하게 수행하였으나, 그림 5는 실제 QGIS 콘솔 화면이다.

import json, math
result = json.load(open('D:/QGIS_Plugin/SampleData/NaGeoAI/verification/classification_gui_20261003_approved.json', encoding='utf-8'))
probs = result['probabilities']
print(type(probs).__name__, len(probs), sum(probs))
print(result['class'], probs[result['class']])
print(all(math.isfinite(p) for p in probs))
검사항목실제 확인값
probabilities 자료형list — JSON 숫자 배열
확률값 개수1,000
확률값 합계1.000000021433607
모든 값의 유한성True
최상위 클래스782 — screen, CRT screen
최상위 점수0.20161251723766327
QGIS 콘솔의 JSON 숫자 배열 1000개와 확률 합계 검증
그림 5. 실제 결과 JSON을 다시 읽어 검사한 화면. 클래스 782, list 1,000개, 합계 및 유한성 True를 확인한다. (클릭하면 원본 크기로 확인할 수 있다.)

7. 결과의 해석과 한계

확률값 합계의 1과의 차이는 약 2.14×10−8로, 이 검사는 저장된 숫자 배열의 수치적 일관성을 확인하는 절차이다. 지표의 합계가 1에 가깝다는 사실은 분류의 의미적 정확성을 입증하지 않는다.

실제 입력에는 주차장·차량·건물이 보이지만 최상위 출력은 screen, CRT screen이었다. 점수 약 0.2016은 모델의 해당 범주 점수이지, 주차장 분류 정확도 20.16%라는 뜻이 아니다. 기본 모델은 일반 ImageNet 범주를 대상으로 하므로 이 출력으로 주차장, 차량 수, 토지피복 또는 재난 피해를 판단해서는 안 된다. 항공영상에 맞춘 모델과 독립적인 정답자료를 확보하여 비교·검증할 필요가 있다. 토지피복 지도가 목적이라면 의미론적 분할 등 픽셀 단위 작업과 구분해야 한다.

8. 저장과 종료

실습 복사본을 QGIS에서 저장한 뒤 실습에 사용한 QGIS 창을 정상 종료하였다. 저장 후 복사본의 갱신 시각과 크기 변화를 확인하고, 원본 QGIS_Play.qgz의 SHA-256이 실행 전 값과 동일함을 확인하였다. 결과 JSON은 별도 파일로 보관하였다. 프로젝트 파일만 복사하면 입력 래스터가 자동으로 포함되는 것은 아니므로 재실행 시 데이터 경로도 함께 확인한다.

참고 자료

작성·검증일: 2026년 10월 3일. 그림은 공개 GitHub 저장소의 커밋 SHA에 고정된 주소로 연결하였다. 이번 글은 실행·저장 검증을 기록한 실습이며, 항공영상 분류 성능 평가 보고서가 아니다.

훈련 평가보고서, 생성형 AI로 정리하는 법 | 안전한국훈련 실무 4편

훈련 평가보고서, 생성형 AI로 정리하는 법 | 안전한국훈련 실무 4편

🎬 1분 브리핑 영상

📌 3줄 요약

  • 평가보고서는 개요·결과·미흡점·개선과제 네 요소가 핵심
  • 현장 자료만 쓰게 제한해야 AI가 사실을 지어내지 않음
  • 초안 작성 후 수치·기관명 검증, hwpx로 표까지 완성

훈련이 끝나면 늘 찾아오는 숙제가 있습니다. 바로 평가보고서 작성입니다. 현장에서 받아온 평가표와 사진, 메모는 수북이 쌓여 있는데 이걸 어떻게 문장으로 엮어야 할지 막막하신 분들 많으실 겁니다. 특히 '잘된 점'은 금방 쓰는데 '개선 과제'는 뭉뚱그려 "전반적으로 양호함"으로 끝내버리는 경우가 흔합니다. 생성형 AI는 이 작업의 속도를 크게 높여줄 수 있지만, 방법을 모르고 쓰면 현장에 없던 내용을 지어내거나 알맹이 없는 보고서를 만들어 버립니다. 오늘은 평가보고서를 AI로 정리하되, 사실관계는 지키고 개선 과제는 제대로 뽑아내는 순서를 짚어보겠습니다.

disaster drill evaluation report
자료사진 · 사진: Curioso_Photography / Pixabay

📋 평가보고서에는 뭐가 꼭 들어가야 하나요?

평가보고서의 뼈대는 크게 네 가지입니다. 훈련 개요(언제, 어디서, 누가, 어떤 시나리오로 했는지), 평가 항목별 결과(지휘보고, 대피, 구조, 상황전파 등 항목별로 어떻게 수행됐는지), 미흡 사항(계획대로 안 된 부분), 개선 과제(다음 훈련에서 고칠 구체적인 방법)입니다. 이 네 가지가 순서대로 들어가야 읽는 사람이 "뭘 했고, 뭐가 문제였고, 어떻게 고칠지"를 한눈에 파악합니다. AI에게 초안을 맡길 때도 이 틀을 먼저 던져주고 그 안을 채우게 하는 게 핵심입니다. 재난안전 분야에서는 이 보고서가 다음 해 훈련 계획이나 매뉴얼 개정의 근거 자료로 쓰이기 때문에, 틀이 흐트러지면 후속 작업 전체가 흔들립니다.

🔒 현장 자료만 쓰게 어떻게 제한하나요?

AI에게 "훈련 평가보고서 써줘"라고만 하면 그럴듯하지만 실제로 없었던 상황을 만들어낼 위험이 큽니다. 이를 막는 방법은 간단합니다. 현장 기록지, 평가표, 상황일지 같은 원본 자료를 먼저 통째로 붙여넣고 "이 자료에 있는 내용만 사용하고, 자료에 없는 내용은 추측하지 말고 [확인 필요]라고 표시해줘"라고 명시하는 것입니다. 이렇게 하면 AI가 빈칸을 그럴듯한 문장으로 메우는 대신 "확인 필요" 표시를 남겨, 사람이 나중에 원본과 대조하기 쉬워집니다. 특히 참여 인원 수나 소요 시간처럼 숫자가 들어가는 항목은 반드시 이 방식으로 출처를 묶어둬야 나중에 검증이 가능합니다.

🔍 잘된 점만 나열되는 걸 어떻게 막나요?

평가표를 그대로 넣고 요약해달라고 하면 "원활히 수행됨", "신속하게 대응함" 같은 칭찬 위주 문장만 나오기 쉽습니다. 이는 원본 평가표 자체가 체크리스트 형식이라 미흡점이 짧게만 적혀 있는 경우가 많기 때문입니다. 이럴 때는 프롬프트에 "평가표의 '미흡' 또는 '보완 필요' 표시가 된 항목을 모두 찾아 목록으로 뽑고, 각 항목마다 원인 추정과 다음 훈련 시 구체적 개선 방법을 제안해줘"라고 역할을 분리해서 지시해야 합니다. 잘된 점과 미흡점을 같은 비중으로 다루게 강제하는 것이 핵심입니다. 이렇게 뽑아낸 개선 과제는 다음 해 실시계획서의 보완 항목으로 바로 연결되어, 훈련의 질을 해마다 끌어올리는 실질적 근거가 됩니다.

✅ 수치와 기관명, AI 초안을 그대로 결재 올려도 되나요?

절대 안 됩니다. AI는 문장을 그럴듯하게 다듬는 데는 강하지만, 숫자나 고유명사를 정확히 기억하거나 검증하는 도구가 아�닙니다. 참여 인원, 소요 시간, 협조 기관명, 훈련 일자는 반드시 원본 기록(출석부, 공문, 계획서)과 한 글자씩 대조해야 합니다. 또한 훈련 근거가 되는 법령이나 지침은 연도마다 개정될 수 있으므로 소관 부처의 최신 공고와 지침을 직접 확인하는 절차가 꼭 필요합니다. 훈련 규모나 일정도 해마다 달라지기 때문에 작년 자료를 그대로 베끼면 안 됩니다. 해봐야 아는 것은, 초안에서 숫자가 하나라도 나오면 그 옆에 출처 페이지나 자료명을 메모해두고 결재 전 전수 확인하는 습관입니다. 이 확인 과정을 생략하면 보고서 한 곳의 오류가 전체 신뢰도를 떨어뜨립니다.

📄 완성된 초안, 어떻게 한글 문서로 마무리하나요?

내용이 정리되면 마지막은 보기 좋은 문서로 만드는 일입니다. 평가 항목별 결과는 표로 정리하는 게 읽기 훨씬 편하므로, AI에게 "평가 항목, 수행 결과, 미흡 사항, 개선 과제를 각각 열로 하는 표로 정리해줘"라고 요청해 표 형태 텍스트를 받습니다. 이후 hwpx(한글 문서의 최신 파일 형식) 문서로 옮길 때는 표를 복사해 한글 프로그램의 표 붙여넣기 기능을 쓰거나, 문서 변환 기능을 지원하는 AI 도구를 이용해 표 구조가 유지된 hwpx 파일로 바로 받는 방법도 있습니다. 어느 방법이든 표의 셀 정렬과 병합이 깨지지 않았는지 반드시 눈으로 한 번 확인해야 합니다.

🖥️ 화면에서 따라하기

따라하기 단계

  1. 자료 모으기
    현장 평가표, 상황일지, 사진 설명을 한 문서로 모아 텍스트로 정리
  2. AI에 자료 투입
    생성형 AI 대화창에 평가표 전문을 붙여넣고 네 항목 틀 전달
  3. 미흡점 추출
    "미흡/보완 필요 항목만 뽑아 원인과 개선안 제안해줘" 추가 질문
  4. 표로 재정리
    "항목·결과·미흡사항·개선과제 열로 표 만들어줘" 요청
  5. 원본 대조
    숫자·기관명·일자를 원본 기록과 한 줄씩 대조해 수정(메뉴명은 버전마다 다를 수 있어 '편집' 또는 '도구' 메뉴 주변을 확인)
  6. hwpx 변환
    표를 복사해 한글 프로그램에 붙여넣거나, 문서 변환 기능으로 hwpx 파일 받기

※ 프로그램 버전에 따라 메뉴 이름이 조금씩 다를 수 있습니다. 위 그림은 순서를 정리한 도식입니다.

✍️ 그대로 복사해 쓰는 프롬프트

현장 평가표를 바탕으로 사실 기반 초안과 개선 과제를 함께 뽑는 프롬프트

너는 재난안전 훈련 평가보고서를 작성하는 실무자를 돕는 보조 역할이다
아래에 붙여넣는 [현장 평가표 전문]에 있는 내용만 사용하고 그 외 내용은 절대 추측하지 말 것
자료에 없는 수치나 기관명이 필요하면 빈칸 대신 [확인 필요]라고 표시할 것
보고서는 다음 네 부분으로 구성한다: 1)훈련 개요 2)평가 항목별 결과(표 형식, 열은 항목/결과/미흡사항) 3)미흡 사항 종합 4)개선 과제
개선 과제는 평가표에서 '미흡' 또는 '보완'으로 표시된 항목을 모두 찾아 각각에 대해 원인 추정과 다음 훈련 시 구체적 실행 방안을 함께 제시할 것
잘된 점 위주로 치우치지 말고 미흡점과 개선과제의 분량을 결과 요약과 비슷하게 맞출 것
[현장 평가표 전문]을 아래에 붙여넣는다
[여기에 평가표 내용 붙여넣기]

※ 대괄호 부분을 상황에 맞게 바꿔서 쓰세요. 받은 답은 그대로 쓰지 말고 사실 확인을 거치세요.

🧪 직접 해보기

  • 지난 훈련 평가표를 꺼내 네 항목(개요·결과·미흡·개선) 틀에 맞춰 직접 분류해보기
  • 무료 생성형 AI에 평가표 일부만 넣고 "이 자료에만 근거해 요약해줘"라고 시켜 결과 비교
  • 초안에서 숫자가 나온 문장 3개를 골라 원본 기록과 대조해보기

❓ 자주 묻는 질문

Q. 평가표가 체크리스트뿐이고 서술이 별로 없는데 AI가 내용을 채울 수 있나요?
A. AI는 없는 내용을 지어내면 안 되므로 서술이 부족하면 "확인 필요"로 남겨야 합니다. 현장 사진이나 메모를 추가로 투입하면 빈 부분을 줄일 수 있습니다.

Q. 보고서에 들어갈 법령 근거는 어떻게 확인하나요?
A. AI가 제시하는 법령명이나 조항은 틀릴 수 있으므로 소관 부처의 공고와 최신 지침을 직접 찾아 대조해야 합니다. 연도별로 개정되는 경우가 많아 작년 자료를 그대로 쓰면 안 됩니다.

Q. hwpx로 변환할 때 표가 깨지면 어떻게 하나요?
A. 셀 병합이나 정렬이 틀어지는 경우가 흔하니 변환 후 표 전체를 눈으로 확인하고 필요한 셀만 수동으로 다시 정리하는 게 빠릅니다. 처음부터 열 개수를 단순하게 설계하면 깨질 확률이 줄어듭니다.

평가보고서는 훈련의 기억을 다음 해로 넘겨주는 다리 역할을 합니다. AI는 그 다리를 빨리 놓는 도구일 뿐, 다리가 제대로 이어졌는지 확인하는 몫은 여전히 사람에게 있습니다. 다음 편에서는 이렇게 쌓인 개선 과제를 실제 매뉴얼 개정에 반영하는 방법을 다뤄보겠습니다.

안전한국훈련 실무 시리즈 4편 · 전체 9편


재난안전과 GeoAI 이야기를 더 보고 싶다면 아래 채널도 함께 보세요.

📌 바로가기

2026-10-02

생성형 AI 사용법 5 | 코드를 모르는 사람의 데이터 처리

생성형 AI 사용법 5 | 코드를 모르는 사람의 데이터 처리

📌 3줄 요약

  • 코드 몰라도 생성형 AI로 엑셀·CSV 데이터 정리 가능
  • 받은 결과는 반드시 원본과 대조해 눈으로 검증해야 함
  • 공간데이터는 좌표계·단위 확인이 정확도를 좌우함

어느 재난안전 담당자가 대피소 명단 엑셀 파일 300줄을 받았습니다. 주소 칸에 공백이 뒤섞여 있고, 어떤 줄은 위도·경도가 쉼표로 묶여 한 칸에 들어가 있습니다. 예전 같으면 일일이 손으로 고치거나 코드를 배워야 했을 일이지만, 요즘은 생성형 AI에게 "이 파일 정리해줘"라고 요청하는 것만으로 상당 부분 해결됩니다. 다만 AI가 내놓은 결과를 그대로 믿고 쓰면 안 됩니다. 특히 좌표나 면적처럼 숫자가 중요한 공간데이터는 단위 하나만 틀려도 지도 위 위치가 완전히 엉뚱한 곳으로 튑니다. 이번 편에서는 코드를 몰라도 데이터를 정리하는 방법과, 결과를 눈으로 검증하는 절차를 다룹니다.

Hands holding financial papers for tax preparation and analysis.
자료사진 · 사진: RDNE Stock project / Pexels

📊 엑셀이나 CSV 파일, AI에게 어떻게 맡기나요?

파일을 그대로 채팅창에 올리고 "이 파일에서 주소 칸의 공백을 지우고, 빈 줄은 삭제해줘" 처럼 사람 말로 요청하면 됩니다. 생성형 AI는 업로드된 표를 읽어 구조를 파악하고, 필요한 처리를 설명하거나 직접 수정한 파일을 만들어 줍니다. 중요한 건 요청을 구체적으로 쪼개는 것입니다. "정리해줘" 보다 "A열의 전화번호에서 하이픈을 통일해줘" 처럼 칸 이름과 작업을 콕 집어 말하면 결과가 훨씬 안정적입니다. 재난안전 업무에서는 대피소 명단, 피해 신고 목록처럼 반복 입력되는 표가 많아 이런 정리 작업만 잘 맡겨도 시간이 크게 줄어듭니다.

🐍 코드를 몰라도 파이썬 코드를 요청할 수 있나요?

가능합니다. "파이썬으로 CSV 파일을 열어서 좌표 칸을 위도·경도로 나누는 코드 짜줘"라고 요청하면 AI가 짧은 코드를 만들어 줍니다. 코드를 몰라도 한 줄씩 어떤 뜻인지 설명해 달라고 하면 됩니다. 아래는 예시로 받을 법한 코드입니다.

import pandas as pd
df = pd.read_csv("shelter.csv")
df[["위도","경도"]] = df["좌표"].str.split(",", expand=True)
df.to_csv("shelter_clean.csv", index=False)

이 코드를 실행할 땐 무료로 쓸 수 있는 온라인 실행 환경(검색창에 "파이썬 온라인 실행기"로 찾을 수 있습니다)에 붙여 넣으면 설치 없이 바로 돌려볼 수 있습니다. 대피소나 침수 흔적 좌표 데이터를 이런 식으로 빠르게 정제해두면, 이후 지도 프로그램에 바로 얹어 분석할 수 있습니다.

👀 AI가 만든 결과, 뭘 보고 믿어야 하나요?

결과 파일을 받으면 가장 먼저 행 개수가 원본과 맞는지 확인합니다. 300줄을 넣었는데 280줄만 나왔다면 어딘가 묵인하고 지워진 겁니다. 다음으로 몇 개 줄을 무작위로 골라 원본과 나란히 띄워 눈으로 대조합니다. 이것이 바로 해봐야 아는 것입니다. AI의 설명만 읽고 넘어가지 말고, 반드시 원본 파일을 옆에 켜둔 채 일부 데이터를 손으로 짚어가며 비교해야 합니다. 특히 좌표나 피해 금액처럼 숫자가 들어간 칸은 전부 훑어볼 수 없더라도 최솟값과 최댓값이 상식적인 범위인지 확인하면 이상치를 빠르게 잡아낼 수 있습니다. 재난 통계처럼 한 번 틀리면 보고서 전체 신뢰도가 흔들리는 데이터일수록 이 검증 습관이 중요합니다.

🗺️ 좌표계와 단위, 왜 그렇게 중요한가요?

좌표계는 지구 위 위치를 숫자로 표현하는 약속입니다. 같은 지점이라도 좌표계가 다르면 완전히 다른 숫자로 적힙니다. 흔히 쓰는 위도·경도 체계와, 국내 행정업무에서 쓰는 평면 좌표 체계는 숫자 형태부터 다릅니다. 예를 들어 위도·경도는 소수점 숫자(37.56, 126.97)로 나타나지만 평면 좌표는 미터 단위의 큰 정수(예: 200000, 450000)로 나타납니다. AI에게 좌표 변환을 맡길 때는 "현재 어떤 좌표계인지", "어떤 좌표계로 바꿔야 하는지"를 반드시 말해줘야 합니다. 이 정보를 빼먹으면 AI는 추측으로 변환하고, 결과 지점이 바다 한가운데나 엉뚱한 나라로 찍히는 일이 생깁니다. 홍수 흔적조사나 산사태 위험지 좌표처럼 위치 정확도가 생명인 데이터는 좌표계를 확인하지 않으면 지도에 올렸을 때 전혀 다른 곳을 가리키게 되어 현장 대응이 엉뚱한 곳으로 나갈 수 있습니다.

🧮 단위를 착각하면 어떤 문제가 생기나요?

면적, 거리, 강수량 같은 값은 단위에 따라 숫자 크기가 크게 달라집니다. 침수 면적이 "3200"이라고만 적혀 있으면 제곱미터인지 헥타르인지 알 수 없고, 이걸 헷갈리면 실제보다 100배 큰 피해로 보고될 수도 있습니다. AI에게 데이터를 정리시킬 때도 "이 칸의 단위는 제곱미터입니다" 처럼 명시해야 계산이 꼬이지 않습니다. 결과를 받은 뒤에는 원본 보고서나 현장 조사서의 단위 표기를 다시 한번 대조하는 습관이 필요합니다. 산불 피해 면적, 강수량 집계처럼 숫자 하나로 대응 등급이 달라지는 자료일수록 단위 확인은 생략할 수 없는 절차입니다.

🖥️ 화면에서 따라하기

따라하기 단계

  1. 새 대화 시작
    AI 서비스 접속 후 새 채팅을 열고 "엑셀 정리 작업"이라고 주제를 먼저 알림
  2. 파일 업로드
    채팅창의 파일 첨부 버튼(클립 모양 아이콘)으로 엑셀·CSV 파일 올리기
  3. 작업 구체화
    "A열 공백 제거, B열 좌표를 위도·경도로 분리" 처럼 칸 이름과 작업 명시
  4. 결과 요청
    "수정된 파일을 CSV로 내려받게 해줘" 또는 "코드와 함께 설명해줘"라고 요청
  5. 눈으로 대조
    원본과 결과 파일을 나란히 열어 행 수와 샘플 몇 줄을 직접 비교
  6. 좌표계 재확인
    결과 파일을 지도 프로그램에 올리기 전 좌표계 설정값이 맞는지 확인
  7. (화면 구성은 쓰는 서
    (화면 구성은 쓰는 서비스나 버전에 따라 다를 수 있어 못 찾으면 설정이나 도움말 메뉴를 살펴보세요)

※ 프로그램 버전에 따라 메뉴 이름이 조금씩 다를 수 있습니다. 위 그림은 순서를 정리한 도식입니다.

✍️ 그대로 복사해 쓰는 프롬프트

막연한 요청으로 정리를 맡겼을 때 생기는 문제를 보여주는 예시

이 엑셀 파일 정리해줘

맥락과 형식을 구체적으로 준 정리 요청으로 안정적인 결과를 받는 예시

너는 공공데이터 정리를 돕는 보조자야
첨부한 CSV 파일은 [대피소 명단]이고 칸 구성은 [이름, 주소, 좌표, 수용인원]이야
좌표 칸은 "위도,경도" 형태로 한 칸에 섞여 있으니 위도와 경도를 각각 다른 칸으로 분리해줘
주소 칸의 앞뒤 공백은 제거하고, 수용인원이 비어 있는 행은 "미확인"으로 채워줘
작업 후 원본과 비교했을 때 행 개수가 같은지 알려주고, 수정한 내용을 표로 요약해줘
결과는 CSV 파일로 내려받을 수 있게 해줘

받은 결과에서 반드시 확인할 것: 원본과 결과의 행 개수 일치 여부, 좌표 분리가 정확한지 샘플 대조, 좌표계 표기 누락 여부

※ 대괄호 부분을 상황에 맞게 바꿔서 쓰세요. 받은 답은 그대로 쓰지 말고 사실 확인을 거치세요.

🧪 직접 해보기

  • 가지고 있는 엑셀 파일 일부를 AI에게 올려 공백 제거를 요청해보기
  • 결과 파일의 행 개수를 원본과 직접 세어 비교하기
  • 좌표 칸이 있다면 숫자 형태(소수점 vs 큰 정수)로 좌표계 추정해보기

❓ 자주 묻는 질문

Q. 코드를 전혀 몰라도 파이썬 코드를 실행할 수 있나요?
A. 온라인 실행 환경을 쓰면 설치 없이 코드를 붙여 넣고 실행 버튼만 눌러도 됩니다. 다만 코드가 무슨 일을 하는지 한 줄씩 설명을 요청해 이해하고 쓰는 것이 안전합니다.

Q. AI가 만든 결과 파일이 맞는지 어떻게 확실히 알 수 있나요?
A. 완벽히 보장하는 방법은 없고, 원본과 일부를 대조하는 수작업 검증이 필수입니다. 특히 행 개수, 숫자 범위, 좌표 형태 세 가지만 확인해도 큰 오류는 대부분 걸러집니다.

Q. 좌표계가 다른지 어떻게 알아보나요?
A. 좌표 숫자가 소수점이 있는 작은 값이면 위도·경도 계열, 소수점 없는 큰 정수면 평면 좌표 계열일 가능성이 큽니다. 확실하지 않으면 데이터를 준 기관이나 원본 문서의 메타데이터를 확인하는 것이 정확합니다.

코드를 몰라도 생성형 AI 덕분에 데이터 정리의 문턱은 많이 낮아졌지만, 결과를 검증하는 눈은 여전히 사람 몫입니다. 다음 편에서는 이렇게 정리한 데이터를 지도 위에 직접 올려 시각화하는 방법을 다뤄보겠습니다.

생성형AI 사용법 시리즈 5편 · 전체 15편


재난안전과 GeoAI 이야기를 더 보고 싶다면 아래 채널도 함께 보세요.

📌 바로가기

NaGeoAI 실제 QGIS 실습 5 | 객체탐지 좌표 오류 수정과 후보 2건 검증

1. 실습 목적과 확인 범위

본 실습에서는 NaGeoAI 1.9.1의 객체탐지 기능을 QGIS 3.44.12에서 실행하고, 탐지 상자의 좌표가 입력 영상과 일치하는지 확인하였다. 자료 확인 → 입력값 설정 → 객체탐지 → 지도 중첩 및 속성 검증의 순서로 진행하였다. 이번 결과는 모델이 반환한 후보를 검토하기 위한 자료이며, 개별 건물의 정확한 경계나 공식 측량 성과를 의미하지 않는다.

버전 안내: 이 글의 실행 환경은 좌표 변환을 수정한 NaGeoAI 1.9.1이다. 수정 버전의 설치 파일은 NaGeoAI-1.9.1.zip 다운로드에서 받을 수 있다. 1.9.1 릴리스 설명에서 변경 내용을 확인한다.

2. 플러그인 설치 방법

QGIS에서 플러그인 → 플러그인 관리 및 설치 → ZIP 파일에서 설치를 열고, NaGeoAI 배포 ZIP을 지정하여 설치한다. 설치 후 플러그인 목록에서 NaGeoAI의 활성화 여부와 버전을 확인한다. 이 절차는 독자를 위한 설치 안내이며, 이번 실습에서 ZIP 재설치 화면을 새로 촬영한 것은 아니다.

실제 과거 설치 과정과 화면은 실습 1편: 설치부터 NAIP 변화탐지 결과 확인까지를 참고한다. 공개 버전은 NaGeoAI GitHub 릴리스에서 확인한다. 1.9.0을 이번 수정 버전으로 간주하여서는 안 된다.

3. 예제 자료 다운로드 및 입력 확인

입력 자료는 Las Vegas 지역의 2019년 NAIP 예제 영상이다. Source Cooperative의 opengeos/geoai 자료 페이지에서 제공하는 las_vegas_naip_2019_a.tif를 다운로드한다. 원본 파일은 별도로 보존하고, QGIS의 래스터 레이어로 추가한다.

NAIP의 일반적인 자료 설명은 NAIP 공식 자료 목록을 참고한다. 예제 가공본의 재배포 조건은 별도로 확인할 필요가 있으므로, 본 글에서는 원본 TIFF를 다시 업로드하지 않고 제공처의 다운로드 주소를 안내한다.

항목확인값
입력 파일las_vegas_naip_2019_a.tif
입력 좌표계EPSG:26911
영상 크기2,721 × 1,420픽셀, 4개 밴드
픽셀 크기0.6m × 0.6m
출력 좌표계EPSG:4326

실습 시작 원본 QGIS_Play.qgz는 보존하였다. 이번 실행과 결과 저장에는 QGIS_Play_NaGeoAI_20261002_object_detection_fixed.qgz 복사본을 사용하였다. 배경지도만으로 분석하지 않고, 다운로드한 NAIP 래스터를 탐지 입력으로 지정하였다.

그림 1. QGIS 입력 영상과 실습 프로젝트 확인
그림 1. 처리 후 출력 레이어의 표시를 끈 상태에서 입력 영상과 프로젝트를 확인한 화면이다. 처리 전 화면으로 표시하지 않는다.

4. NaGeoAI 객체탐지 입력값 설정

NaGeoAI의 추가 분석 패널을 열고 기능을 객체탐지로 선택하였다. 입력 영상은 위의 TIFF이며, 탐지 대상에는 building. car., 신뢰도 임계값에는 0.3을 입력하였다. 출력 파일은 objects_gui_v191_blog_20261002.geojson으로 지정하고, 공간 결과를 지도에 추가하는 옵션을 켰다.

그림 2. NaGeoAI 객체탐지 기능 및 입력값 설정
그림 2. 새 실행 직전의 객체탐지 설정 화면이다. 지도에 표시된 파란 윤곽선은 앞서 좌표를 확인한 결과이며, 새 실행 결과와 구분한다.

5. 실행 로그와 출력 레이어 확인

실행 버튼을 눌러 처리를 완료하였다. 실제 QGIS 패널에서 후보 2건과 EPSG:26911 → EPSG:4326 변환 메시지를 확인하였으며, 새 GeoJSON 레이어가 지도에 추가되었다. 로그에는 영상 면적의 80% 이상을 차지하는 후보 1건과 영상 경계를 벗어난 상자의 절단 처리 1건에 대한 경고가 기록되었다.

그림 3. 객체탐지 실행 완료 로그와 출력 레이어
그림 3. 실행 직후의 로그 및 출력 레이어 화면이다. 큰 후보 상자는 자동으로 삭제하지 않았으며, 경고를 확인하고 검토 대상으로 남겼다.

출력 레이어의 심볼을 채움 없이 파란 윤곽선으로 설정하여 NAIP 영상과 중첩하였다. 이 중첩은 좌표 정합을 확인하기 위한 것이며, 건물 경계의 정확도를 입증하는 절차는 아니다.

그림 4. NAIP 영상과 탐지 후보 지도 중첩
그림 4. 새 GUI 실행 결과와 이전 좌표 검증 결과를 함께 표시한 중첩 화면이다. 최종 저장 프로젝트에서는 이전 검증 결과를 숨기고 새 실행 결과를 표시하였다.

6. 속성 검증과 해석상 주의사항

후보labelscore영상 대비 면적 비율
1building0.3452448250.997488046
2building0.3025969860.011897756

그림 5. 출력 후보 2건의 속성 테이블
그림 5. 실제 GUI 출력의 label, score, image_fraction 값을 확인한 화면이다.

두 후보의 label은 모두 building이며, car 후보는 반환되지 않았다. 첫 번째 상자는 영상 면적의 약 99.75%를 차지하여 단일 건물의 경계로 이용하기 어렵다. 두 번째 후보도 현장 자료 또는 정답 경계와 대조하지 않았으므로, 개별 건물이 정확하게 탐지되었다고 단정할 수 없다. score는 모델 출력값이며 정밀도나 전체 정확도와 동일하지 않다. 정답 자료를 이용한 정밀도·재현율·경계 정확도 평가는 수행하지 않았다.

7. 좌표 오류 수정 내용 및 저장

이전 객체탐지 출력에서는 픽셀 좌표에 래스터 지리참조 변환을 적용하지 않은 문제가 확인되었다. 1.9.1에서는 탐지 상자의 각 꼭짓점에 영상의 아핀 변환을 적용한 뒤 EPSG:4326으로 변환하도록 수정하였다. 영상 경계 밖의 후보는 경계 범위로 절단하고, 큰 면적의 후보는 경고로 알리도록 하였다. 좌표 변환 수정과 모델의 탐지 품질 개선은 서로 다른 문제이다.

입력 확인, 실행, 출력 속성 확인 및 실제 화면 캡처를 완료한 후 실습용 프로젝트 복사본을 저장하고 QGIS를 정상 종료하였다. 원본 QGIS_Play.qgz는 덮어쓰지 않았다. 과거 Python 종료 오류의 원인을 이번 결과만으로 단정하지 않으며, 이번 실행에서는 QGIS 창이 정상적으로 닫혔음을 확인하였다.

실제 화면 5장은 2026년 10월 2일 QGIS 데스크톱에서 캡처하였으며, GitHub에 보존한 이미지를 삽입하였다. 각 그림을 클릭하면 원본 크기로 확인할 수 있다.

관측점 사이는 어떻게 채우나 | 공간 보간과 크리깅 | GeoAI 기초 17편

관측점 사이는 어떻게 채우나 | 공간 보간과 크리깅 | GeoAI 기초 17편

🎬 1분 브리핑 영상

📌 3줄 요약

  • 관측소가 없는 곳의 값은 보간으로 추정해 채운다
  • IDW는 거리로, 크리깅은 통계적 상관구조로 채운다
  • 보간 지도는 추정치라 관측소 밀도에 따라 신뢰도가 다르다

비 오는 날 기상청 강우 지도를 보면 전국이 색깔로 빈틈없이 칠해져 있습니다. 그런데 실제로 비를 재는 관측소는 전국에 수백 개뿐이고, 그 사이 공간에는 아무 장비도 없습니다. 그렇다면 관측소가 없는 동네의 색깔은 어디서 온 걸까요. 답은 공간 보간입니다. 알고 있는 몇 개의 점으로 모르는 사이 공간의 값을 추정하는 방법인데, 이 원리를 모르고 지도를 보면 "저기는 비가 30mm 왔다"는 숫자를 관측값처럼 믿어버리기 쉽습니다. 오늘은 이 추정이 어떻게 이뤄지고 어디까지 믿어도 되는지 짚어보겠습니다.

Close-up view of a communication tower with antennas under a clear blue sky, showcasing modern technology.
자료사진 · 사진: Mark Stebnicki / Pexels

🌧️ 관측소가 없는 곳의 강우량은 어떻게 알아내나요

비가 온 양은 빗물을 모으는 우량계라는 장비로 잽니다. 그런데 우량계는 전국에 점처럼 띄엄띄엄 있을 뿐이고, 그 사이 공간에는 장비가 없습니다. 그래서 주변 관측소 값을 이용해 빈 공간의 값을 추정하는데, 이 과정을 공간 보간이라고 부릅니다. 쉽게 말하면 띄엄띄엄 찍힌 점들 사이를 자연스러운 색 그라데이션으로 메우는 작업입니다. 가장 단순한 방식은 가까운 관측소일수록 더 큰 영향을 준다고 보는 것인데, 이것이 바로 다음에 설명할 IDW입니다. 홍수 예보 시스템에서 유역 평균 강우량을 계산할 때도 결국 관측소 값을 보간해 면 단위 데이터로 바꾸는 과정이 먼저 들어갑니다.

📏 IDW는 어떤 원리로 값을 채우나요

IDW는 Inverse Distance Weighting의 줄임말로, 거리의 역수로 가중치를 준다는 뜻입니다. 쉽게 말해 "가까운 관측소 말은 많이 듣고, 먼 관측소 말은 조금만 듣는다"는 원칙입니다. 추정하려는 지점에서 가까운 관측소일수록 그 값이 많이 반영되고, 멀어질수록 영향력이 줄어듭니다. 계산 방식이 단순하고 직관적이어서 미세먼지 농도 지도나 간단한 강우 분포도를 빠르게 그릴 때 많이 쓰입니다. 다만 IDW는 거리만 보기 때문에, 지형이나 바람길처럼 실제 현상에 영향을 주는 다른 요인은 반영하지 못한다는 한계가 있습니다. 산간 지역처럼 거리는 가까워도 고도 차이로 강우 패턴이 크게 다른 곳에서는 IDW 결과가 실제와 어긋날 수 있어, 참고용으로만 보는 자세가 필요합니다.

📊 크리깅은 IDW와 뭐가 다른가요

크리깅은 거리뿐 아니라 "값들이 공간적으로 얼마나 비슷하게 변하는가"라는 통계적 패턴, 즉 공간 상관구조를 분석해 보간합니다. 가까운 지점끼리 값이 비슷한 정도를 베리오그램이라는 그래프로 파악한 다음, 그 패턴에 맞춰 가중치를 계산합니다. IDW보다 계산이 복잡하지만, 추정값이 얼마나 불확실한지도 함께 알려준다는 장점이 있습니다. 미세먼지 측정망처럼 관측소 간격이 일정하지 않은 데이터를 다룰 때, 크리깅은 관측소가 드문 지역의 추정 신뢰도가 낮다는 사실을 수치로 보여줍니다. 재난 상황에서는 이 불확실성 정보가 중요한데, 신뢰도가 낮은 지역에 대피 명령을 내릴 때는 추가 관측이나 현장 확인을 병행해야 한다는 판단 근거가 되기 때문입니다.

🚨 보간 지도를 그대로 믿으면 안 되는 이유는 뭔가요

보간은 어디까지나 수학적 추정이지 실제 관측이 아닙니다. 관측소가 촘촘한 도심에서는 보간 결과가 실제와 비슷하게 맞아떨어지지만, 관측소가 드문 산간이나 해안 지역은 추정 오차가 커질 수 있습니다. 특히 집중호우처럼 짧은 시간에 국지적으로 쏟아지는 비는 관측소 사이 공간에서 전혀 다른 값이 났을 가능성이 있는데, 보간은 이런 급격한 변화를 부드럽게 뭉개버리는 경향이 있습니다. 그래서 보간 지도의 색이 연하다고 안심하면 안 되고, 근처 관측소가 실제로 몇 개나 있는지, 그 지점과 얼마나 떨어져 있는지를 확인하는 습관이 필요합니다. 산사태나 급경사지 위험 판단처럼 사람의 안전과 직결되는 의사결정에서는 보간 지도 한 장만으로 결론 내리지 말고 현장 관측이나 레이더 자료로 교차 확인하는 절차가 꼭 필요합니다.

🔍 내가 사는 동네의 보간 신뢰도는 어떻게 확인하나요

보간 결과를 과신하지 않으려면 직접 확인해보는 절차가 가장 확실합니다. 먼저 관측소 위치를 지도에 띄워놓고 내가 궁금한 지점에서 가장 가까운 관측소까지의 거리를 재봅니다. 거리가 가까우면 신뢰도가 높다고 볼 수 있고, 수십 킬로미터 이상 떨어져 있다면 그 지점의 보간값은 참고 수준으로만 받아들이는 것이 안전합니다. 이것은 해봐야 아는 것인데, 지도만 봐서는 관측소 밀도가 잘 드러나지 않기 때문에 관측소 레이어를 따로 켜고 눈으로 거리를 비교해보는 과정이 꼭 필요합니다. 미세먼지 예보나 강우 특보를 확인할 때도 이 습관을 들이면, 지도 색깔 하나로 성급하게 판단하지 않는 눈을 기를 수 있습니다.

🖥️ 화면에서 따라하기

따라하기 단계

  1. 관측소 레이어 켜기
    QGIS에서 레이어 > 레이어 추가 > 벡터 레이어로 강우 관측소 지점 파일을 불러온다
  2. 보간 도구 열기
    상단 메뉴 처리(Processing) > 툴박스에서 검색창에 interpolation 입력
  3. IDW 실행하기
    IDW 보간 도구를 선택하고 입력 레이어와 보간할 속성 필드를 지정한다
  4. 결과 격자 확인
    출력된 래스터를 지도에 띄워 관측소 주변과 먼 지역의 색 변화를 비교한다
  5. 크리깅 비교해보기
    같은 데이터로 크리깅 도구를 실행해 IDW 결과와 차이를 눈으로 비교한다
  6. 거리 측정하기
    측정 도구로 관심 지점과 가장 가까운 관측소 사이 거리를 재본다
  7. 메뉴 이름은 프로그램
    메뉴 이름은 프로그램 버전에 따라 조금씩 다를 수 있으니, 보이지 않으면 처리 툴박스 검색창에 interpolation이나 kriging을 입력해 찾아보시기 바랍니다.

※ 프로그램 버전에 따라 메뉴 이름이 조금씩 다를 수 있습니다. 위 그림은 순서를 정리한 도식입니다.

✍️ 그대로 복사해 쓰는 프롬프트

보간 지도를 읽을 때 확인해야 할 체크리스트 만들기

역할은 공간정보 분석을 검토하는 선임 연구원입니다. [강우 또는 미세먼지] 보간 지도를 현업에서 검토할 때 확인해야 할 체크리스트를 만들어주세요. 관측소 밀도, 보간 방법의 한계, 극단값 처리, 현장 확인 필요 여부를 포함해 항목별로 한 줄씩 정리하고, 전문용어가 나오면 괄호로 쉬운 설명을 덧붙여 주세요. 확실하지 않은 수치나 기준은 만들어내지 말고 일반적인 주의사항 위주로 작성해 주세요.
확인할 점: 체크리스트에 등장하는 기준이나 수치가 실제 기관 지침과 맞는지, 지어낸 숫자는 없는지 직접 확인해야 합니다.

※ 대괄호 부분을 상황에 맞게 바꿔서 쓰세요. 받은 답은 그대로 쓰지 말고 사실 확인을 거치세요.

🧪 직접 해보기

  • 공개 기상 지도에서 관측소 위치 레이어를 켜고 우리 동네와의 거리를 확인해본다
  • 같은 지역을 IDW와 크리깅으로 각각 보간해보고 결과가 얼마나 다른지 비교해본다
  • 관측소에서 멀리 떨어진 지점의 보간값이 실제 체감과 맞는지 주변 사람에게 물어본다

❓ 자주 묻는 질문

Q. IDW랑 크리깅 중에 뭐가 더 정확한가요
A. 상황에 따라 다릅니다. 데이터 특성과 공간 패턴에 따라 결과가 달라지므로, 같은 데이터를 두 방법으로 모두 돌려보고 비교하는 것이 안전합니다.

Q. 보간 지도의 해상도는 왜 제각각인가요
A. 보간할 때 격자 간격을 분석자가 직접 설정하기 때문입니다. 격자를 촘촘하게 할수록 지도는 부드러워 보이지만, 실제 관측 밀도가 그만큼 촘촘한 것은 아니라는 점을 기억해야 합니다.

Q. 관측소가 하나도 없는 지역은 어떻게 하나요
A. 보간만으로는 한계가 있어 레이더 강우 추정치나 위성 자료 같은 다른 관측 수단을 함께 활용하는 경우가 많습니다.

공간 보간은 빈 곳을 마법처럼 채우는 기술이 아니라, 있는 데이터로 최선의 추정을 하는 통계적 방법일 뿐입니다. 다음 편에서는 이렇게 만들어진 여러 공간 데이터 층을 겹쳐서 위험도를 계산하는 공간 중첩 분석 이야기를 다뤄보겠습니다.

GeoAI 기초 시리즈 17편 · 전체 43편


재난안전과 GeoAI 이야기를 더 보고 싶다면 아래 채널도 함께 보세요.

📌 바로가기

2026-10-01

LiDAR와 DEM | 지형 데이터가 방재에 쓰이는 방식 | GeoAI 기초 16편

LiDAR와 DEM | 지형 데이터가 방재에 쓰이는 방식 | GeoAI 기초 16편

📌 3줄 요약

  • DSM은 건물·나무 윗면, DEM은 맨땅 높이를 담은 지형 데이터다
  • LiDAR 레이저는 나뭇잎 사이를 뚫고 땅바닥 반사를 잡아낸다
  • 지형 정확도가 낮으면 침수·산사태 예측 범위가 크게 틀어진다

산사태 위험지역을 그리는데, 위성사진에는 숲이 초록색으로 빽빽하게 덮여 있어서 그 아래 경사가 얼마나 가파른지 전혀 보이지 않는 상황을 상상해보세요. 나무 꼭대기 높이만 알아서는 실제로 물이 어디로 흐르고 흙이 어디로 무너질지 계산할 수 없습니다. 방재 분야에서 쓰는 지형 데이터는 단순한 배경 지도가 아니라, 침수 범위와 산사태 경로를 계산하는 '입력값' 그 자체입니다. 이번 편에서는 그 입력값을 만드는 핵심 기술인 라이다(LiDAR, 레이저로 거리를 재는 센서)와 DEM(수치표고모델, 땅의 높낮이를 숫자로 담은 데이터)의 관계를 짚어보겠습니다.

A Lufthansa Boeing 747 landing at an airport with Mount Fuji visible in the background on a clear day.
자료사진 · 사진: Guohua Song / Pexels

🏔️ DSM과 DEM, 뭐가 다른가요?

DSM(Digital Surface Model, 수치표면모델)은 드론이나 항공기에서 내려다본 '맨 위 표면'의 높이를 기록합니다. 건물 옥상, 나무 꼭대기, 전선까지 전부 포함됩니다. 반면 DEM(Digital Elevation Model, 수치표고모델)은 그런 구조물과 식생을 걷어내고 순수한 땅바닥 높이만 남긴 데이터입니다. 비유하자면 DSM은 이불을 덮은 채 찍은 사람의 윤곽이고, DEM은 이불을 걷어낸 몸의 실제 윤곽입니다. 물이 흐르는 경로나 경사면이 무너지는 방향을 계산하려면 이불(건물, 나무)이 아니라 몸(지형) 정보가 필요합니다. 그래서 침수 시뮬레이션이나 산사태 모델링에서는 거의 항상 DSM이 아니라 DEM을 기본 입력으로 씁니다.

🌲 LiDAR는 어떻게 나무 아래 땅을 보나요?

LiDAR는 센서에서 레이저 펄스를 초당 수십만 번 쏘고, 반사되어 돌아오는 시간을 측정해 거리를 계산하는 장비입니다. 울창한 숲 위로 비행하면 레이저 중 일부는 나뭇잎에 바로 반사되지만, 나뭇잎 사이 빈틈으로 통과한 레이저는 땅바닥까지 도달해 반사됩니다. 하나의 레이저 펄스에서 여러 번 반사가 돌아오는 경우 이를 '다중 반사(multiple returns)'라고 하는데, 가장 먼저 돌아온 반사는 나무 꼭대기, 가장 마지막에 돌아온 반사는 대체로 지면에 해당합니다. 이 마지막 반사점들만 모아서 보간하면 숲에 가려 위성사진이나 드론 사진으로는 볼 수 없는 지면 높이, 즉 DEM을 만들 수 있습니다. 산사태 취약성 분석에서 경사도와 사면 방향을 정확히 계산하려면 이렇게 식생을 걷어낸 지형이 꼭 필요합니다.

🌊 왜 지형이 조금만 틀려도 침수 범위가 달라지나요?

침수 모의는 물이 높은 곳에서 낮은 곳으로 흐른다는 단순한 원리를 바탕으로 하지만, 그 계산은 지형의 미세한 높이 차이에 민감합니다. 예를 들어 제방이나 작은 둔덕이 DEM에서 몇십 센티미터만 낮게 표현돼도, 모델은 그 지점으로 물이 넘친다고 잘못 판단할 수 있습니다. 반대로 실제로는 낮은 배수로인데 데이터 해상도가 거칠어 뭉개져 버리면, 물이 빠질 길이 없는 것처럼 계산되기도 합니다. 그래서 침수 해석에는 격자 간격(해상도)이 촘촘하고 수직 오차가 작은 DEM이 요구되며, 도심처럼 배수 구조가 복잡한 곳일수록 이 민감도가 커집니다. 실무에서는 같은 강우 조건이라도 쓰는 DEM의 해상도와 정확도에 따라 침수 예상도의 모양이 눈에 띄게 달라질 수 있다는 점을 염두에 두어야 합니다.

⛰️ 산사태 모의에서는 지형이 왜 더 까다로운가요?

산사태는 경사, 경사 방향, 사면의 굴곡(오목한지 볼록한지) 같은 지형 변수들을 조합해 위험도를 계산합니다. 이 변수들은 DEM을 한 번 미분하거나 이웃 셀과 비교해서 뽑아내는데, 원본 DEM에 작은 노이즈나 계단 현상이 있으면 경사도 계산 결과가 실제보다 들쭉날쭉하게 나올 수 있습니다. 특히 식생이 우거진 산지는 LiDAR 없이는 지면을 거의 볼 수 없기 때문에, 과거에는 등고선 지도를 디지털화한 거친 DEM을 쓰다가 LiDAR 기반 고해상도 DEM으로 바뀌면서 위험지역 경계가 다시 그려진 사례도 있습니다. 어떤 DEM을 썼는지에 따라 같은 마을이라도 산사태 위험등급이 달라질 수 있으므로, 결과 지도를 받았을 때는 바탕이 된 지형자료의 출처와 제작 연도를 확인하는 습관이 필요합니다.

🔍 내가 쓰는 지형 데이터, 믿을 만한지 어떻게 확인하나요?

지형 데이터를 그대로 받아쓰기 전에 몇 가지는 직접 확인해봐야 합니다. 먼저 해당 DEM이 LiDAR 기반인지, 위성 입체영상 기반인지, 등고선에서 변환한 것인지 메타데이터(데이터에 대한 설명 정보)를 살펴봐야 합니다. 같은 지역을 서로 다른 해상도의 DEM 두 개로 비교해 경사도 지도를 각각 만들어보면, 해상도 차이가 결과에 얼마나 영향을 주는지 눈으로 확인할 수 있습니다. 또한 실제 현장에서 눈에 띄는 배수로나 제방이 DEM 상에서도 제대로 표현되는지 위성지도나 현장 사진과 대조해보는 것도 좋은 점검 방법입니다. 이런 확인 없이 지형 데이터를 그대로 재난 대응 계획에 쓰면, 실제 위험 지점을 놓치거나 반대로 안전한 곳을 위험지역으로 잘못 분류할 수 있습니다.

🖥️ 화면에서 따라하기

따라하기 단계

  1. 지형 데이터 확인
    국가공간정보포털이나 공개 지도 서비스에서 해당 지역 DEM·DSM 제공 여부를 검색한다
  2. QGIS 설치 확인
    QGIS를 실행하고 상단 메뉴에서 래스터 항목이 보이는지 확인한다(버전별로 위치가 다를 수 있음)
  3. DEM 불러오기
    레이어 > 레이어 추가 > 래스터 레이어에서 내려받은 DEM 파일(.tif)을 연다
  4. 음영기복도 만들기
    래스터 > 지형해석 > 음영기복(Hillshade)을 눌러 지형 굴곡을 시각적으로 확인한다
  5. 경사도 계산하기
    래스터 > 지형해석 > 경사(Slope)를 눌러 경사도 레이어를 생성하고 색상을 확인한다
  6. 해상도 비교
    같은 지역의 다른 해상도 DEM이 있다면 둘을 나란히 띄워 경사도 차이를 눈으로 비교한다

※ 프로그램 버전에 따라 메뉴 이름이 조금씩 다를 수 있습니다. 위 그림은 순서를 정리한 도식입니다.

✍️ 그대로 복사해 쓰는 프롬프트

DEM과 DSM 차이를 보고서나 교육자료용으로 쉽게 풀어 설명하는 초안 만들기

역할은 GIS 데이터를 처음 접하는 공무원 대상 교육 자료를 만드는 보조 작성자입니다
[대상 지역]의 침수 또는 산사태 분석 보고서에 들어갈 설명 문단을 작성해주세요
DSM과 DEM의 차이를 건물·식생 유무 중심으로 쉬운 비유를 들어 설명하고
LiDAR가 식생 아래 지형을 얻는 원리를 3문장 이내로 요약하고
왜 이 분석에는 DEM을 썼는지 한 문단으로 정리해주세요
전문용어가 나오면 괄호로 짧은 설명을 덧붙이고 추측성 수치는 넣지 마세요

※ 대괄호 부분을 상황에 맞게 바꿔서 쓰세요. 받은 답은 그대로 쓰지 말고 사실 확인을 거치세요.

🧪 직접 해보기

  • 공개 지도 서비스에서 같은 지점의 위성사진과 지형 음영도를 번갈아 보며 건물·나무가 사라지는지 확인한다
  • QGIS에서 DEM 하나를 불러와 Hillshade와 Slope 도구로 지형 기복과 경사도를 눈으로 비교한다
  • 거주 지역이나 관심 지역의 DEM 제작 연도와 출처(LiDAR인지 등고선 변환인지)를 메타데이터에서 찾아본다

❓ 자주 묻는 질문

Q. DSM과 DEM 중 어느 것이 더 정확한 데이터인가요?
A. 둘 다 정확도의 개념이 다릅니다. DSM은 표면 전체를 얼마나 세밀하게 담았는지가 중요하고, DEM은 지면 높이를 얼마나 왜곡 없이 뽑아냈는지가 중요합니다. 용도에 맞는 데이터를 고르는 것이 핵심입니다.

Q. LiDAR 없이도 산사태 위험지도를 만들 수 있나요?
A. 만들 수는 있지만 식생이 우거진 지역에서는 지형 표현이 거칠어질 수 있습니다. 등고선 기반 DEM이나 위성 입체영상 DEM도 쓰이지만, 산지의 세밀한 경사 변화를 볼 때는 LiDAR 기반 DEM이 더 유리한 경우가 많습니다.

Q. 일반인이 LiDAR DEM 데이터를 구할 수 있나요?
A. 지역과 기관에 따라 공개 여부와 해상도가 다릅니다. 국가 공간정보 포털이나 지방자치단체가 운영하는 공개 데이터 플랫폼에서 제공하는지 직접 검색해 확인하는 것이 가장 정확합니다.

결국 침수지도든 산사태 위험지도든, 그 바탕에는 반드시 지형 데이터가 깔려 있고 그 데이터가 얼마나 땅의 진짜 모습을 담고 있느냐가 결과의 신뢰도를 좌우합니다. 다음 편에서는 이렇게 만든 지형 데이터를 실제로 어떤 방식으로 재난 시뮬레이션 모델에 넣어 계산하는지 살펴보겠습니다.

GeoAI 기초 시리즈 16편 · 전체 43편


재난안전과 GeoAI 이야기를 더 보고 싶다면 아래 채널도 함께 보세요.

📌 바로가기

NaGeoAI 실제 QGIS 실습 4 | Sentinel-2 구름 마스크 실행과 전 픽셀 맑음 결과 검증

실습 목적과 검증 범위

본 실습에서는 QGIS 3.44.12와 NaGeoAI 1.9.0의 추가 분석 → 구름 마스크 기능을 이용하여 Sentinel-2 예제 영상을 처리하였다. 입력 밴드 지정, 모델 실행, 출력 레이어 확인 및 격자 검증을 목적으로 한다. 이번 결과는 540,360픽셀 모두 ‘맑음(0)’으로 분류되었다. 이는 모델 출력에 대한 관찰이며, 실제 구름이 전혀 없거나 정확도가 100%라는 의미는 아니다.

아래 그림은 2026년 10월 1일 QGIS 데스크톱에서 직접 캡처한 화면이다. 입력·설정·완료 로그·속성은 발행 전 재실행 과정에서 확보하였으며, 그림 4는 같은 날 오전 최초 실행 결과를 다시 연 화면이다. 화면을 생성하거나 처리 결과를 꾸미지 않았다.

1. 플러그인 설치와 실행 환경 준비

  1. NaGeoAI-1.9.0.zip 다운로드에서 배포본을 내려받는다. ZIP 파일 자체를 선택하므로 먼저 압축을 풀지 않는다.
  2. QGIS에서 플러그인 → 플러그인 관리 및 설치 → ZIP에서 설치를 연다. 내려받은 ZIP을 선택하여 설치하고 NaGeoAI를 활성화한다.
  3. 상단 NaGeoAI → 필수 프로그램·모델 설치에서 필요한 환경을 확인한다. 이미 설치된 항목은 중복 설치하지 않는다. 이번 실습은 설치된 플러그인을 사용하였으며 재설치하지 않았다. 실제 과거 설치 화면은 실습 1: 설치부터 변화탐지까지를 참고한다.
  4. 구름 마스크에는 OmniCloudMask와 PyTorch 환경이 필요하다. 이번 실행 환경에서는 PyTorch 2.14.0+cu126 및 Rasterio 1.5.1을 확인하였다. 초해상도용 opensr-model을 사용하는 실습은 아니다. 최초 모델 다운로드에는 인터넷 연결이 필요하며, 설치 완료 표시만으로 분석 성공을 판단하지 말고 실제 실행 로그를 확인한다.

2. 예제 파일 다운로드와 자료 확인

GeoAI 공개 Sentinel-2 예제 TIFF 다운로드 링크를 열고 파일을 저장한다. 브라우저에서 파일 내용이 열리면 다운로드 또는 링크를 다른 이름으로 저장 기능을 사용한다. 이번 저장 위치는 D:\QGIS_Plugin\SampleData\NaGeoAI\S2A-L2A-20190318-N0211-R061-6Bands-S2.tif이다. 폴더 위치는 변경할 수 있으나 패널에 실제 파일 경로를 입력해야 한다.

이 자료는 GeoAI 예제에 사용되는 Sentinel-2 L2A 6밴드 TIFF이며, 파일명에 표시된 관측일은 2019년 3월 18일이다. 이번 실습에서 내려받은 파일은 760×711픽셀, UInt16 6밴드, EPSG:32647, 10×10m 격자이다. 로컬 예제 설명에 따른 밴드 순서는 B2·B3·B4·B8·B11·B12이다. TIFF 밴드 설명에는 파장명이 기록되어 있지 않으므로 다른 자료에도 같은 순서를 적용해서는 안 된다.

자료 출처는 opengeos의 GeoAI 예제 배포 경로이다. Sentinel 자료의 기본 이용 조건은 Copernicus Data Space 이용 조건과 Sentinel 자료 이용 고지를 확인하였다. Contains modified Copernicus Sentinel data (2019). 본 글은 분석 화면과 출처 링크를 제공하며, 예제 TIFF 원본을 별도로 재배포하지 않는다. 예제 배포본 자체의 추가 이용 조건은 내려받는 시점에 확인할 필요가 있다.

파일 확인용 SHA-256: 14b92a5523ae8d18b04d61d7a640a4bce26dbb6ce19eb33eac285c75748bffa3.

3. 시작 프로젝트와 입력 레이어 확인

프로젝트 → 열기에서 QGIS_Play.qgz를 연 후 다른 이름으로 저장하여 실습용 복사본을 만든다. 이번 원본 프로젝트는 EPSG:5187이며 원본을 덮어쓰지 않았다. 오전 실행 내용을 저장한 복사본 QGIS_Play_NaGeoAI_20261001_cloudmask.qgz를 발행 전에 다시 열어 확인하였다. 배경지도는 분석 입력으로 사용하지 않았다.

레이어 → 레이어 추가 → 래스터 레이어 추가에서 예제 TIFF를 불러온다. 입력 영상만 보려면 출력 마스크의 체크를 해제한다. 그림 1은 기존 결과를 잠시 숨기고 입력을 확인한 화면이다. 프로젝트의 즉시 재투영 때문에 영상 외곽이 회전되어 보이지만, 원본 래스터의 EPSG:32647과 10m 격자는 바뀌지 않는다. 화면의 기본 RGB 표시 밴드는 1·2·3이며 자연색 조합은 아니다. 자연색 확인이 필요하면 레이어 속성의 심볼에서 빨강 3·초록 2·파랑 1을 지정한다. 지도 표시용 밴드와 모델 입력 밴드를 구분해야 한다.

QGIS 실제 화면 1 입력 영상과 실습 프로젝트 확인

그림 1. 실습 복사본과 입력 영상 확인. 출력 레이어를 숨긴 상태이며, 오른쪽 아래 프로젝트 CRS와 래스터 자체 CRS를 혼동하지 않는다. 그림을 누르면 원본 크기로 확인할 수 있다.

4. 구름 마스크 기능과 입력값 설정

NaGeoAI → 추가 분석을 열고 기능 목록에서 구름 마스크를 선택한다. 입력 래스터에는 예제 TIFF 전체 경로를 넣는다. 빨강 밴드는 3, 초록 밴드는 2, 근적외선 밴드는 4로 입력하였다. 이는 예제 파일의 B4·B3·B8에 해당한다. 출력 파일은 원본과 다른 경로로 지정하고 ‘출력 결과를 지도에 추가’를 선택한다.

재실행 출력 경로: D:\QGIS_Plugin\SampleData\NaGeoAI\verification\cloud_mask_replay_20261001.tif. 기존 오전 출력은 cloud_mask_gui_20261001.tif이며 덮어쓰지 않았다. 이 패널에서 모델 버전을 별도로 지정하지 않았으므로, 다른 설치 시점의 모델까지 동일한 결과라고 보장할 수 없다.

QGIS 실제 화면 2 구름 마스크 입력값 빨강3 초록2 근적외선4

그림 2. 구름 마스크 기능, 입력 파일, 밴드 3·2·4 및 별도 출력 경로 설정.

5. 실행과 완료 로그 확인

실행을 누른다. 패널의 시작 메시지에 이어 Starting cloud_mask 및 Cloud mask complete를 확인하였다. 새 GeoTIFF가 레이어 목록에 자동 추가되었다. 이번 화면은 QGIS 데스크톱 패널에서 직접 실행한 결과이며, 별도 Python 점검을 GUI 실행으로 표시한 것이 아니다.

로그에는 입력 TIFF의 Photometric 색상 채널 수와 SamplesPerPixel이 일치하지 않아 비색상 채널을 ExtraSamples로 취급한다는 경고가 표시되었다. 출력 저장 시 BLOCKXSIZE가 TILED=YES에서만 사용된다는 경고도 나타났다. 완료 및 파일 읽기는 확인하였으나 경고를 무시해도 모든 분석에 적합하다는 의미는 아니다. 후속 실무 분석에는 밴드 구조와 TIFF 메타데이터를 별도로 점검할 필요가 있다.

QGIS 실제 화면 3 구름 마스크 완료 로그와 출력 레이어

그림 3. 재실행 직후 완료 로그와 자동 추가된 출력 레이어. 경고 메시지도 함께 기록한다.

6. 검은 출력 화면의 의미 확인

출력은 한 밴드의 분류값 래스터이다. GeoAI 구현의 클래스는 0=맑음, 1=두꺼운 구름, 2=얇은 구름, 3=구름 그림자이다. 이번 결과는 값 0만 존재하여 기본 단일밴드 회색조에서는 검게 보인다. 검은 화면만 보고 처리 실패 또는 구름 영역이라고 판단해서는 안 된다. 값의 의미와 실제 픽셀 분포를 확인해야 한다.

QGIS 실제 화면 4 오전 출력 마스크 다시 열기 값0의 검은 화면

그림 4. 같은 날 오전 최초 출력 마스크를 다시 연 화면. 검은 영역은 기본 렌더러에서 표현된 클래스 0이다. 재실행 결과도 같은 분류 분포를 보였다.

7. 속성·격자·픽셀 분포 검증

출력 레이어를 더블클릭하여 레이어 속성 → 정보를 연다. 그림 5에서 760×711픽셀, Byte 자료형, GeoTIFF 형식 및 최소·최대값 0을 확인하였다. QGIS 통계는 근사 통계로 표시되어 있으므로, 전체 픽셀의 고유값 집계는 별도의 Rasterio 읽기로 확인하였다.

QGIS 실제 화면 5 출력 속성 크기 자료형 최소최대0 검증

그림 5. 출력 GeoTIFF의 실제 QGIS 속성 화면. 너비·높이·자료형과 통계값을 확인한다.

점검 항목확인 결과
출력 크기·밴드760×711픽셀, 1밴드 UInt8
래스터 CRS·해상도EPSG:32647, 10×10m
입력과 출력 격자CRS, 크기, Affine 변환 모두 일치
래스터 범위좌하단 (901340, 1806040), 우상단 (908940, 1813150)
전체 픽셀 집계0: 540,360개 / 1·2·3: 각 0개
NoData출력 파일에 별도 NoData 값이 설정되어 있지 않음

따라서 이번 자료에서는 입력→모델 처리→출력 레이어 추가→파일 읽기와 격자 정합을 확인할 수 있었다. 그러나 정답 구름 마스크가 없어 분류 정확도, 구름 누락률 또는 구름 그림자 탐지 성능은 검증하지 않았다. 값 0을 NoData로 지정하면 맑음 클래스가 숨겨지므로 주의한다. 구름 제거 영상이나 시계열 합성영상까지 생성한 실습도 아니다.

8. 프로젝트 저장과 종료 시 주의사항

실습을 마치면 프로젝트 → 저장으로 실습용 복사본만 저장하고 QGIS를 정상 종료한다. 이번 오전 최초 실행과 발행 전 재실행 모두 복사본 저장 및 창의 정상 종료를 확인하였다. 재실행에서는 출력 속성 화면 확인 후 일시적인 응답 지연이 있었으나, 응답이 회복된 뒤 속성 창을 닫고 복사본을 저장하였다. 강제 종료는 사용하지 않았다. 최종 복사본은 QGIS_Play_NaGeoAI_20261001_cloudmask.qgz이며, 원본 QGIS_Play.qgz의 수정 시각과 파일 크기는 유지되었다.

결과와 적용 한계

본 실습에서는 NaGeoAI 구름 마스크의 입력 밴드를 지정하고 실제 QGIS 패널에서 처리를 수행한 결과, 동일 격자의 분류 래스터가 생성됨을 확인하였다. 전 픽셀이 맑음으로 분류된 사례를 통하여 지도 색상과 클래스 의미를 구분할 필요가 있음을 알 수 있었다. 실제 구름 탐지 성능을 평가하려면 구름과 그림자가 포함된 추가 장면, 검증 라벨 및 일관된 비교 기준을 확보해야 한다. 본 결과를 현장 판단의 확정 근거로 사용해서는 안 된다.

참고: GeoAI 원본 프로젝트, GeoAI 구름 마스크 구현과 클래스 정의, OpenGeoAI 교재, NaGeoAI 1.9.0 배포 페이지. 이 글의 화면은 실제 프로그램 캡처이며 원본·예제 자료와 분석 결과를 구분하여 기록하였다.

드론 사진측량 | 사진 몇 장이 지도가 되기까지 | GeoAI 기초 15편

드론 사진측량 | 사진 몇 장이 지도가 되기까지 | GeoAI 기초 15편

📌 3줄 요약

  • 사진 한 장은 그림일 뿐, 겹쳐 찍어야 입체 지도가 된다
  • GCP와 SfM으로 사진들을 정확한 좌표의 지형으로 바꾼다
  • 정사영상·DSM·점군은 재난 현장 판단의 기초 자료가 된다

큰비가 지나간 다음 날, 산사면 일부가 흘러내렸다는 신고가 들어옵니다. 사람이 걸어 들어가기 위험한 지역이라 드론을 띄워 사진 수백 장을 찍어 왔습니다. 그런데 이 사진들을 모니터에 하나씩 띄워 본다고 지도가 되는 건 아닙니다. 사진 더미가 좌표를 가진 정확한 지형 정보로 바뀌는 과정, 그 뒤에는 중복도·기준점·컴퓨터 비전이라는 세 가지 장치가 숨어 있습니다. 오늘은 드론 사진이 어떻게 '지도'가 되는지, 그리고 그 결과물이 재난 현장에서 실제로 어떻게 쓰이는지 짚어보겠습니다.

drone aerial mapping survey
자료사진 · 사진: Pexels / Pixabay

🛰️ 드론 사진 한 장으로는 왜 지도가 안 될까요?

지도는 위에서 내려다본 평면이 아니라 실제 좌표와 높이를 가진 자료입니다. 사진 한 장만으로는 이 지점이 정확히 어디인지, 얼마나 높은지 알 수 없습니다. 그래서 드론은 같은 지점을 여러 각도에서 여러 번 찍도록 비행 경로를 짜는데, 이때 옆 사진과 얼마나 겹치는지를 중복도(overlap)라고 부릅니다. 보통 앞뒤로 겹치는 정도(종중복)와 좌우로 겹치는 정도(횡중복)를 따로 설정하는데, 겹침이 부족하면 뒤에서 설명할 계산이 아예 실패하거나 지형이 울퉁불퉁하게 왜곡됩니다. 산사태 현장처럼 지형 기복이 심한 곳은 평지보다 중복도를 넉넉히 잡아야 그림자 지역이나 급경사면이 누락되지 않습니다.

📍 GCP는 왜 꼭 찍어야 하나요?

사진들을 이어 붙이면 지형 모양은 나오지만, 그 모양이 지구 어디에 있는지는 또 다른 문제입니다. 이를 위해 땅 위에 좌표를 정확히 아는 점, 즉 지상기준점(GCP, Ground Control Point)을 표식으로 놓고 GPS 측량기로 정밀 좌표를 기록합니다. 드론이 자체적으로 저장하는 위치 정보만으로도 대략적인 지도는 만들 수 있지만, 피해 면적을 산정하거나 실제 거리·경사를 계산해 보고서에 넣으려면 GCP로 보정한 결과가 필요합니다. 특히 복구 공사비를 산정하거나 법적 근거 자료로 쓸 때는 오차 범위를 명시해야 하는 경우가 많아, GCP 유무와 개수는 그 산출물의 신뢰도를 가르는 기준이 됩니다.

🧩 사진들이 어떻게 입체 지형이 되나요?

수백 장의 사진을 입체 지형으로 바꾸는 계산 방식을 SfM(Structure from Motion, 움직임으로부터 구조 복원)이라고 합니다. 원리는 사람 눈이 두 눈으로 거리를 가늠하는 것과 비슷한데, 서로 겹치는 사진들에서 같은 지점(특징점)을 찾아 이 점이 사진마다 조금씩 다른 위치에 찍힌 정도를 계산해 드론의 위치와 지형의 높낮이를 동시에 복원합니다. 이 과정은 특징점 추출, 사진 간 매칭, 카메라 위치 계산, 조밀한 점군 생성의 순서로 진행되며 대체로 전용 소프트웨어가 자동으로 처리합니다. 다만 안개가 끼거나 사진이 흔들리면 특징점 매칭이 실패해 구멍이 뚫린 지형이 나올 수 있어, 처리 결과는 반드시 눈으로 확인해야 합니다.

🗺️ 정사영상·DSM·점군은 재난 현장에서 어떻게 쓰이나요?

SfM 처리가 끝나면 세 가지 산출물이 나옵니다. 위에서 수직으로 내려다본 것처럼 왜곡을 바로잡은 사진인 정사영상, 지표면과 건물·나무까지 포함한 높이 정보인 DSM(수치표면모델), 그리고 각 지점을 점으로 표현한 3차원 점군입니다. 정사영상은 침수 범위나 산불 피해 구역의 경계를 육안으로 그리는 데 쓰이고, DSM은 토사 유출량이나 붕괴 전후 지형 변화를 계산하는 데 쓰입니다. 점군은 건물 균열이나 붕괴된 구조물의 형태를 세밀하게 살필 때 유용합니다. 이 세 자료를 겹쳐 보면 '어디가 얼마나 무너졌고 어디로 물이 흘렀는지'를 현장에 들어가지 않고도 가늠할 수 있어, 초동 대응 회의 자료로 자주 활용됩니다.

📋 비행 전에 확인해야 할 제도적 사항은 뭔가요?

드론 촬영은 장비만 있다고 바로 할 수 있는 게 아닙니다. 지역에 따라 비행 자체에 사전 승인이 필요할 수 있고, 특정 시설 인근은 촬영이 제한되거나 별도 허가를 받아야 할 수 있습니다. 재난 현장이라 해도 예외가 자동 적용되는 것은 아니므로, 관할 기관과 비행 구역의 규정은 촬영 계획 단계에서 반드시 확인해야 합니다. 이는 인터넷 검색만으로 판단하지 말고, 관할 항공 당국이나 지자체 담당 부서에 직접 문의해 그날그날의 규정을 확인하는 것이 안전합니다. 규정 확인을 건너뛰고 비행했다가는 촬영 결과가 아무리 좋아도 자료로 쓰지 못하는 상황이 생길 수 있습니다.

🖥️ 화면에서 따라하기

따라하기 단계

  1. 샘플 데이터 받기
    OpenDroneMap 공식 저장소 등 공개된 예제 사진 세트를 폴더째 다운로드
  2. 처리 프로그램 준비
    WebODM 설치 후 브라우저 접속, Dashboard에서 New Project 클릭
  3. 사진 업로드
    Select Images 버튼으로 사진 폴더 선택 후 Start Processing 클릭
  4. 출력 옵션 확인
    Processing Options에서 Orthophoto, DSM, Point Cloud 항목 체크
  5. 결과 확인
    처리 완료 후 좌측 탭에서 Orthophoto·DSM·Point Cloud 각각 미리보기
  6. QGIS로 불러오기
    레이어 > 레이어 추가 > 래스터 레이어에서 정사영상 파일 선택 후 확인(메뉴 이름은 버전에 따라 다를 수 있어 못 찾으면 레이어 패널 우클릭 메뉴를 살펴보세요)

※ 프로그램 버전에 따라 메뉴 이름이 조금씩 다를 수 있습니다. 위 그림은 순서를 정리한 도식입니다.

✍️ 그대로 복사해 쓰는 프롬프트

드론 재난 촬영 전 점검할 제도적·안전 체크리스트 초안 만들기

당신은 공공기관의 드론 촬영 담당자를 돕는 보조자입니다
[대상 재난]으로 인한 피해 현장을 [지역명]에서 드론으로 촬영하려 합니다
비행 승인 여부 확인, 촬영 제한 구역 여부 확인, 기상 조건 확인, GCP 설치 여부, 조종자 자격 확인 항목을 포함한 점검 체크리스트를 표 형식으로 작성해 주세요
각 항목에는 확인해야 할 담당 기관이나 확인 방법을 함께 적어 주세요
확실하지 않은 법령 조항이나 수치는 적지 말고 "관할 기관에 확인 필요"라고 표시해 주세요

※ 대괄호 부분을 상황에 맞게 바꿔서 쓰세요. 받은 답은 그대로 쓰지 말고 사실 확인을 거치세요.

🧪 직접 해보기

  • 공개 드론 예제 사진으로 WebODM에서 정사영상을 직접 만들어 본다
  • 국토정보플랫폼이나 지자체 공간정보 서비스에서 기존 드론 정사영상을 열어 해상도를 비교해 본다
  • 우리 지역 관할 항공 당국 홈페이지에서 드론 비행 승인 절차를 검색해 본다

❓ 자주 묻는 질문

Q. 드론 사진측량에 꼭 GCP가 필요한가요?
A. 대략적인 지도라면 드론 내장 GPS만으로도 가능하지만, 정확한 면적·거리 계산이나 법적 근거 자료로 쓸 때는 GCP로 보정한 결과가 신뢰도 면에서 유리합니다.

Q. 중복도는 얼마나 잡아야 하나요?
A. 지형 기복과 촬영 목적에 따라 달라지므로 일률적인 수치보다 장비·소프트웨어 매뉴얼의 권장값을 확인하고, 실제 처리 결과에서 지형이 끊기는 곳이 있는지 직접 확인하는 방식이 안전합니다.

Q. 재난 상황이면 비행 승인 없이 바로 날려도 되나요?
A. 재난 대응이라도 비행 구역과 절차는 관할 기관 규정을 따라야 하는 경우가 많아, 사전에 담당 부서와 승인 절차를 확인하는 것이 필요합니다.

드론 사진 한 장 한 장은 평범한 풍경 사진처럼 보이지만, 중복도와 GCP, SfM 계산을 거치면 재난 현장의 좌표와 높이를 담은 지도로 바뀝니다. 다음 편에서는 이렇게 만들어진 정사영상이나 점군 위에 AI를 올려 피해 구역을 자동으로 찾아내는 방법을 살펴보겠습니다.

GeoAI 기초 시리즈 15편 · 전체 43편


재난안전과 GeoAI 이야기를 더 보고 싶다면 아래 채널도 함께 보세요.

📌 바로가기

GeoAI 위성·드론 영상 분석, 재난대응 산업이 뜬다 | 재난안전과 GeoAI

GeoAI 위성·드론 영상 분석 기술이 재난대응 산업의 중심으로 떠오르고 있다. 누리호 5차 발사, 위성·드론 영상 분석 스타트업, ArcGIS 경사지 위험 분석 서비스까지 오늘의 관련 소식을 정리했다. 📌 3줄 요약 아크넥사는 위성·드론 영상을...