레이블이 GIS 도구인 게시물을 표시합니다. 모든 게시물 표시
레이블이 GIS 도구인 게시물을 표시합니다. 모든 게시물 표시

2026-10-04

위성영상 변화탐지 | 같은 곳을 다른 시점으로 비교하기 | GeoAI 기초 19편

위성영상 변화탐지 | 같은 곳을 다른 시점으로 비교하기 | GeoAI 기초 19편

위성영상 변화탐지는 같은 장소를 다른 시점에 찍은 영상을 비교해 변화를 찾아내는 기술로, 전후 비교와 시계열 분해의 차이부터 가짜 변화를 가려내는 법까지 다룹니다.

📌 3줄 요약

  • 전후비교는 두 장, 시계열분해는 추세와 계절성을 가른다
  • 그림자·조수·계절차가 가짜 변화로 오인되기 쉽다
  • 개발·침수·붕괴 판독엔 서로 다른 변화탐지 전략이 필요하다

작년 이맘때 찍은 위성사진과 오늘 찍은 사진을 나란히 놓고 보면, 분명 뭔가 달라 보입니다. 숲이었던 자리가 갈색으로 변했거나, 강가의 경계선이 넓어졌거나. 그런데 이게 정말 산사태나 침수 때문일까요, 아니면 그냥 촬영한 날의 햇빛 각도나 계절이 달라서 그렇게 보이는 걸까요.

변화탐지는 말 그대로 두 시점 이상의 영상을 비교해서 달라진 부분을 찾는 작업입니다. 원리는 간단해 보이지만, 실제로는 진짜 변화와 가짜 변화를 가려내는 일이 훨씬 어렵습니다. 재난 현장에서 오탐 하나가 잘못된 대피 지시나 엉뚱한 구조 출동으로 이어질 수 있기 때문에, 이 개념을 정확히 이해하고 쓰는 게 중요합니다.

Satellite before-after comparison
자료사진 · 사진: mmisof / Pixabay

🛰️ 전후 비교와 시계열 분해, 뭐가 다른가요?

전후 비교는 재난 전 영상 한 장과 재난 후 영상 한 장, 딱 두 시점을 겹쳐서 달라진 픽셀을 찾는 방식입니다. 지진이나 산사태처럼 특정 사건 전후를 빠르게 봐야 할 때 유용합니다. 반면 시계열 분해는 수십, 수백 장의 영상을 길게 쌓아 놓고 추세(꾸준히 늘거나 주는 변화), 계절성(해마다 반복되는 패턴), 그리고 나머지 불규칙한 변화를 수학적으로 분리합니다. 농경지가 매년 반복하는 작황 변화인지, 아니면 올해만 유난히 이상한 건지 구분할 수 있는 거죠. 전후 비교는 빠르고 직관적이지만 우연히 그날 조건이 특이했을 경우를 걸러내기 어렵고, 시계열 분해는 데이터가 많이 필요한 대신 장기적인 토지 변화나 산불 위험지 확산처럼 패턴을 보는 데 강합니다. 재난 대응 속도가 중요한 홍수 초기 대응은 전후 비교, 산사태 위험지역 모니터링처럼 누적 추세를 봐야 하는 경우는 시계열 분해가 더 어울립니다.

🌤️ 계절과 촬영 조건이 왜 가짜 변화를 만드나요?

같은 장소라도 여름과 겨울에 찍으면 식생의 색과 밀도가 완전히 다릅니다. 겨울에는 낙엽이 져서 토양이 드러나니 마치 숲이 사라진 것처럼 보일 수 있고, 비가 온 뒤 토양 수분이 높으면 반사율이 낮아져 실제로는 아무 일 없었는데도 변화로 잡힙니다. 촬영 시각에 따른 태양 고도 차이도 그림자 길이를 바꿔서 건물이나 산지의 경계를 다르게 보이게 만듭니다. SAR(합성개구레이더, 전파를 쏴서 반사되는 신호로 영상을 만드는 방식) 영상이라면 촬영 각도나 궤도 방향이 달라졌을 때도 같은 지형이 다르게 찍힙니다. 이런 가짜 변화를 줄이려면 가능한 한 비슷한 계절, 비슷한 시간대, 비슷한 궤도 조건의 영상을 골라 비교하는 게 기본입니다. 그래서 변화탐지 결과를 볼 때는 항상 두 영상의 촬영 날짜와 조건을 먼저 확인하는 습관이 필요하고, 이는 산불 피해지 판독처럼 계절성 식생 변화가 큰 지역에서 오탐을 줄이는 핵심 절차입니다.

🏗️ 개발로 인한 변화는 어떻게 읽나요?

도시 개발로 인한 변화는 보통 명확한 기하학적 패턴을 띱니다. 논밭이나 산지였던 곳에 직선 도로와 사각형 건물 배치가 생기면 변화탐지 알고리즘이 반사율 차이뿐 아니라 형태의 규칙성까지 함께 잡아내는 경우가 많습니다. 다만 공사장은 단계별로 모습이 계속 바뀌기 때문에, 한 시점의 전후 비교만으로는 공사 중인지 이미 완료됐는지 헷갈릴 수 있습니다. 이럴 때는 여러 시점을 연속으로 쌓아서 변화의 진행 방향을 확인하는 게 안전합니다. 불법 산지 개발이나 무허가 성토 작업을 감시할 때도 같은 원리가 쓰입니다. 특정 지역에서 식생 지수가 갑자기 뚝 떨어지고 그 상태가 계속 유지된다면, 일시적인 벌목이 아니라 영구적인 개발일 가능성이 높다고 판단하는 식입니다. 이런 식으로 변화의 지속성을 확인하는 절차는 산지 훼손이나 불법 매립 같은 재난 전조를 조기에 포착하는 데 활용됩니다.

💧 침수와 붕괴는 변화탐지에서 어떻게 다르게 보이나요?

침수는 물이 차오르면서 지표면을 넓게 덮기 때문에, 광학 영상에서는 어둡고 매끈한 색으로, SAR 영상에서는 반사가 거의 없어 검게 나타나는 특징이 있습니다. 변화탐지에서는 평소 마른 땅이었던 구간이 갑자기 이런 특징을 보이면 침수로 판단합니다. 반면 건물 붕괴나 산사태는 국소적이고 불규칙한 패턴으로 나타납니다. 멀쩡하던 직선 형태의 건물 윤곽이 사라지거나, 산비탈의 식생 패턴이 흙과 돌이 드러난 불규칙한 무늬로 바뀌는 식입니다. 침수는 넓은 면적에 걸쳐 비교적 단순한 변화라서 자동 탐지가 수월한 편이지만, 붕괴는 그림자나 잔해 더미 때문에 오인식이 잦아서 사람이 직접 영상을 확대해 확인하는 과정이 꼭 필요합니다. 재난 상황실에서는 이 둘을 구분해서, 침수는 자동 알고리즘으로 넓은 범위를 빠르게 스캔하고, 붕괴 의심지역은 고해상도 영상으로 추가 확인하는 이원화된 절차를 쓰는 경우가 많습니다.

🔍 가짜 변화인지 진짜 변화인지는 어떻게 확인하나요?

알고리즘이 변화라고 표시한 모든 픽셀을 다 믿을 수는 없습니다. 해봐야 아는 것이 바로 이 부분인데, 의심되는 지역을 다른 출처의 영상이나 지상 사진, 뉴스 보도, 현장 신고와 교차 확인하는 절차가 반드시 필요합니다. 예를 들어 변화탐지 결과에서 특정 농지가 갑자기 어두워졌다면, 그게 침수인지 단순히 추수 후 땅을 갈아엎은 것인지는 같은 시기 다른 지역의 농경 패턴과 비교해봐야 구분됩니다. 또한 구름 그림자나 센서의 일시적 오류도 변화로 잘못 잡힐 수 있어서, 하루 전이나 다음 날 영상을 추가로 확인하는 습관이 오탐을 크게 줄여줍니다. 이런 교차검증 절차는 특히 대피 명령처럼 실제 행동으로 이어지는 판단 앞에서는 생략할 수 없는 단계이며, 자동 탐지 결과를 1차 스크리닝으로만 쓰고 최종 판단은 사람이 내리는 체계가 재난 현장에서 권장됩니다.

🖥️ 화면에서 따라하기

따라하기 단계

  1. 영상 두 장 준비
    공개 위성영상 사이트(예: Sentinel Hub, USGS EarthExplorer)에서 같은 지역 두 시점 영상 내려받기
  2. 레이어 불러오기
    GIS 프로그램에서 레이어 > 레이어 추가 > 래스터 레이어로 두 영상 등록하기
  3. 촬영조건 확인
    메타데이터 창에서 촬영 날짜·시간·궤도 방향 비교해 조건 차이 메모하기
  4. 밴드 연산 실행
    래스터 > 래스터 계산기 열어 (영상2 - 영상1) 식으로 차영상 만들기
  5. 결과 시각화
    생성된 차영상을 레이어 속성 > 심볼로지에서 색상 대비 강조해 변화 구간 확인하기
  6. 교차 검증
    변화로 표시된 구역을 고해상도 지도나 뉴스·현장 사진과 대조해 오탐 여부 점검하기

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

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

변화탐지 결과를 보고할 때 가짜 변화 가능성을 점검하는 체크리스트 받기

너는 위성영상 변화탐지 결과를 검수하는 GIS 분석 보조야. 내가 [분석 대상 지역]에서 [재난 유형, 예: 침수/산사태/산불]을 탐지한 결과를 보고서로 작성하려고 해. 두 영상의 촬영일은 [날짜1]과 [날짜2]이고 계절 차이는 [있음/없음]이야. 아래 형식으로 답해줘.
1) 이 조건에서 발생할 수 있는 가짜 변화 원인 3가지
2) 각 원인을 구분하기 위해 확인해야 할 영상 특징
3) 보고서에 반드시 명시해야 할 주의 문구 한 줄
확인하지 못한 사실은 추측해서 단정하지 말고 "현장 확인 필요"라고 표시해줘.

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

🧪 직접 해보기

  • 공개 위성영상 사이트에서 같은 지역의 여름과 겨울 영상을 받아 색 차이를 직접 비교해보기
  • 뉴스에 나온 재난 전후 비교 사진을 보고 그림자나 촬영각도 차이가 있는지 살펴보기
  • 무료 GIS 프로그램으로 두 영상의 차영상을 만들어 변화 구간이 실제 지형과 맞는지 확인해보기

❓ 자주 묻는 질문

Q. 변화탐지에 꼭 SAR 영상을 써야 하나요?
A. 아닙니다. 광학 영상도 널리 쓰이며, 구름이 많은 지역이나 야간 관측이 필요할 때 SAR이 유리할 뿐 상황에 따라 선택이 달라집니다.

Q. 전후 비교만으로 재난 피해를 확정해도 되나요?
A. 권장되지 않습니다. 가짜 변화 가능성이 있으므로 현장 확인이나 추가 영상 교차검증을 거친 뒤 최종 판단하는 것이 안전합니다.

Q. 시계열 분해에는 영상이 몇 장쯤 필요한가요?
A. 정해진 기준은 없고 분석 목적과 주기에 따라 다릅니다. 계절성을 분리하려면 최소 1년 이상의 주기를 포함하는 데이터가 일반적으로 권장됩니다.

위성영상 변화탐지는 두 장의 사진을 겹쳐보는 단순한 작업처럼 보이지만, 그 이면에는 계절과 촬영조건이 만드는 수많은 함정이 숨어 있습니다. 다음 편에서는 이렇게 탐지된 변화를 AI가 어떻게 자동으로 분류하고 라벨링하는지, 그 학습 과정의 원리를 살펴보겠습니다.

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


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

📌 바로가기

공간 자기상관과 핫스팟 분석 | 가까운 것은 닮는다 | 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 이야기를 더 보고 싶다면 아래 채널도 함께 보세요.

📌 바로가기

2026-10-02

관측점 사이는 어떻게 채우나 | 공간 보간과 크리깅 | 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-09-24

Google Earth Engine이란? 클라우드에서 위성영상 분석 | GeoAI 기초 8편

Google Earth Engine이란? 클라우드에서 위성영상 분석 | GeoAI 기초 8편

🎬 1분 브리핑 영상

📌 3줄 요약

  • Google Earth Engine은 위성영상을 클라우드에서 직접 분석하는 플랫폼이다.
  • 컬렉션·필터·리듀서 세 가지 사고 틀로 대부분의 분석을 설계할 수 있다.
  • 대규모 시계열 분석과 재난 현장의 신속한 변화 탐지에 특히 유리하다.

홍수가 발생했을 때 침수 범위를 확인하고 싶다고 해봅시다. 해당 지역의 위성영상을 구해서 내 컴퓨터에 내려받고, 소프트웨어를 열고, 처리를 기다리는 데만 수 시간이 걸릴 수 있습니다. 영상 한 장의 용량이 수십 기가바이트에 달하는 경우도 있으니까요.

Google Earth Engine(이하 GEE)은 이 흐름을 뒤집습니다. 영상을 내 컴퓨터로 가져오는 대신, 내가 분석 명령을 영상이 있는 서버로 보냅니다. 구글의 서버에는 수십 년치 위성영상이 이미 저장되어 있고, 분석은 그 자리에서 실행됩니다. 결과만 화면에 돌아오는 구조이기 때문에 로컬 저장 공간이나 처리 성능이 크게 중요하지 않습니다. 재난 상황처럼 시간이 촉박한 현장에서 이 구조가 어떤 의미인지, 차근차근 살펴보겠습니다.

🖥️ GEE는 일반 GIS 소프트웨어와 어떻게 다른가요?

QGIS나 ArcGIS 같은 도구는 데이터를 내 컴퓨터에 내려받아 처리하는 방식입니다. 반면 GEE는 브라우저에서 code.earthengine.google.com에 접속하면 편집기 화면이 바로 열리고, 코드를 실행하면 연산이 구글 서버에서 돌아갑니다. 즉, 수백 장의 Landsat 영상을 다루더라도 내 하드디스크는 거의 비어 있는 상태로 분석이 가능합니다. 한 가지 주의할 점은 인터페이스나 메뉴 이름이 업데이트에 따라 조금씩 바뀔 수 있으니, 공식 문서(developers.google.com/earth-engine)를 함께 참고하는 것이 좋습니다. 재난 대응 기관에서 현장 피해 면적을 빠르게 산출해야 할 때, 별도의 데이터 다운로드 단계 없이 분석을 시작할 수 있다는 점이 실무에서 큰 장점으로 꼽힙니다.

📦 컬렉션·필터·리듀서, 이 세 가지가 왜 중요한가요?

GEE를 처음 접하면 낯선 용어 세 개가 반복해서 등장합니다. 컬렉션(Collection)은 위성영상 여러 장의 묶음입니다. 예를 들어 Sentinel-2 영상 전체가 하나의 컬렉션입니다. 필터(Filter)는 그 묶음에서 필요한 것만 추려내는 체입니다. 특정 날짜 범위, 특정 지역, 구름 비율 이하 같은 조건을 걸 수 있습니다. 리듀서(Reducer)는 걸러진 영상들을 하나의 값이나 하나의 영상으로 요약하는 계산입니다. 여러 날짜의 영상을 중앙값으로 합치거나 최솟값·최댓값을 뽑아내는 작업이 여기에 해당합니다. 이 세 단계의 사고 틀을 익히면 "침수 전후 NDWI 변화를 한 달치 영상에서 뽑아보자"라는 요구를 코드로 옮기는 흐름이 자연스럽게 잡힙니다.

🔍 GEE 코드는 어떻게 생겼나요?

GEE는 JavaScript 기반 편집기와 Python API(geemap 라이브러리 등) 두 가지 방식으로 쓸 수 있습니다. 아래는 JavaScript 편집기에서 한국 지역의 Sentinel-2 영상을 불러와 구름이 적은 영상만 추려 중앙값 합성을 만드는 가장 기본적인 뼈대입니다.

var collection = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
  .filterDate('2024-07-01', '2024-07-31')
  .filterBounds(ee.Geometry.Point([127.5, 37.5]))
  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20));

var composite = collection.median();

Map.centerObject(composite, 9);
Map.addLayer(composite, {bands: ['B4', 'B3', 'B2'], min: 0, max: 3000}, '7월 중앙값');

코드 중 filterDate와 filterBounds가 필터, median()이 리듀서입니다. 편집기 상단의 Run 버튼을 누르면 오른쪽 지도 패널에 결과가 표시됩니다. 산불 피해 지역의 피해 전·후 영상을 이 구조로 비교하면 식생 손실 범위를 빠르게 시각화할 수 있습니다.

🌊 GEE가 특히 유리한 작업은 무엇인가요?

GEE가 빛을 발하는 분야는 시계열 분석과 대면적 처리입니다. 수십 년치 영상에서 연도별 NDVI 변화를 추적하거나, 나라 전체 면적의 토지피복 변화를 계산할 때 로컬 환경에서는 며칠이 걸릴 작업이 훨씬 짧은 시간 안에 끝납니다. 반면 아주 정밀한 지역 단위 분석, 또는 GEE가 제공하지 않는 독자적인 영상 데이터를 다뤄야 하는 경우에는 QGIS나 파이썬 환경이 더 적합할 수 있습니다. 직접 해봐야 아는 것이 있습니다. 자신이 다루려는 지역과 기간의 영상이 GEE 카탈로그에 포함되어 있는지 확인해야 합니다. 편집기에서 왼쪽 패널의 Search places and datasets 창에 데이터셋 이름을 입력하고, 결과 카드의 IMPORT 버튼을 누르면 해당 컬렉션의 시작 날짜와 공간 범위를 직접 확인할 수 있습니다. 홍수 피해 현황을 분석하려는 기관이라면 SAR 기반의 Sentinel-1 컬렉션이 카탈로그에 있는지, 원하는 날짜까지 포함되는지 이 방법으로 먼저 확인해야 합니다.

🚨 GEE를 쓸 때 놓치기 쉬운 주의점은 무엇인가요?

GEE는 연산을 즉시 실행하지 않고 명령을 쌓아두는 방식(지연 실행, Lazy Evaluation)으로 동작합니다. 코드를 작성하는 순간에는 실제 계산이 일어나지 않고, Map.addLayer나 Export 같은 출력 명령이 실행될 때 비로소 연산이 시작됩니다. 이 점을 모르면 중간 결과를 출력해 보려다 당황하는 경우가 생깁니다. 또한 분석 결과를 파일로 내려받으려면 편집기 상단 Tasks 탭에서 Export.image.toDrive 등의 명령을 확인하고 Run 버튼을 눌러야 내보내기가 시작됩니다. 용량이 크면 구글 드라이브로 분할 저장되기도 합니다. 재난 현장에서 침수 경계 폴리곤을 뽑아 GIS 파일로 공유해야 하는 상황이라면, Export 단계에 걸리는 시간까지 업무 흐름에 미리 포함시켜 두는 것이 좋습니다.

🖥️ 화면에서 따라하기

따라하기 단계

  1. GEE 접속
    브라우저에서 code.earthengine.google.com 에 접속, 구글 계정으로 로그인
  2. 데이터셋 확인
    왼쪽 패널 Search places and datasets 창에 'Sentinel-2' 입력 후 결과 카드 클릭, 공간·시간 범위 확인
  3. 컬렉션 불러오기
    데이터셋 카드의 IMPORT 버튼 클릭, 편집기 상단 Imports 영역에 변수명으로 추가됨
  4. 필터·리듀서 작성
    편집기에 filterDate·filterBounds·filter(구름 조건)·median() 코드 입력 후 Run 클릭
  5. 결과 확인
    오른쪽 지도 패널에서 Layers 토글로 레이어 켜고 끄며 영상 확인, 색상 범위는 레이어 이름 옆 톱니바퀴 아이콘으로 조정
  6. 결과 내보내기
    편집기 상단 Tasks 탭 클릭 후 Export 항목 옆 Run 버튼 눌러 구글 드라이브로 저장 시작

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

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

GEE 초보자가 특정 재난 유형에 맞는 분석 코드 뼈대를 빠르게 얻기 위한 프롬프트

당신은 Google Earth Engine JavaScript API에 능숙한 공간정보 분석 전문가입니다.
아래 조건에 맞는 GEE 코드 뼈대를 작성해 주세요.
재난 유형: [홍수 / 산불 / 산사태 중 하나]
분석 목적: 피해 전후 영상을 비교해 변화 면적을 추출한다
대상 지역: [위도, 경도 또는 지역명]
분석 기간: 피해 전 [날짜 범위], 피해 후 [날짜 범위]
사용할 위성 데이터: [Sentinel-1 SAR / Sentinel-2 광학 중 하나]
요구 형식: 컬렉션 선언 → 필터 → 리듀서 → 지도 출력 → Tasks 탭 Export 순서로 작성
각 줄에 한국어 주석으로 역할을 설명해 주세요.
확인이 필요한 항목을 코드 아래에 번호 목록으로 따로 적어 주세요.
존재하지 않는 밴드 이름이나 데이터셋 ID는 쓰지 마세요.

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

🧪 직접 해보기

  • code.earthengine.google.com 편집기에서 Search places and datasets에 'Sentinel-2'를 입력해 카탈로그에 포함된 기간과 지역을 직접 확인해 본다.
  • 위의 코드 예시를 편집기에 붙여 넣고 Run을 눌러, 지도 패널에 7월 한반도 중앙값 합성 영상이 표시되는지 확인해 본다.
  • filterDate의 날짜 범위를 산불이 발생한 시기 전후로 바꿔보고, median() 대신 min()으로 바꿨을 때 결과가 어떻게 달라지는지 비교해 본다.

❓ 자주 묻는 질문

Q. GEE를 쓰려면 코딩을 잘해야 하나요?
A. 기본적인 분석은 컬렉션·필터·리듀서 패턴을 이해하면 짧은 코드로 시작할 수 있습니다. JavaScript를 전혀 모르더라도 공식 튜토리얼과 예제 코드를 조금씩 수정하는 방식으로 입문할 수 있습니다. Python 환경이 더 익숙하다면 geemap 같은 라이브러리를 통해 Python 문법으로도 GEE를 사용할 수 있습니다.

Q. GEE에서 분석한 결과를 QGIS에서 열 수 있나요?
A. Tasks 탭에서 GeoTIFF 형식으로 내보내기를 실행하면 구글 드라이브에 파일이 저장되고, 그 파일을 QGIS에서 레이어 > 레이어 추가 > 래스터 레이어로 불러올 수 있습니다. 벡터 결과물은 Shapefile 또는 GeoJSON 형식으로 내보내는 것이 일반적입니다.

Q. GEE는 누구나 무료로 쓸 수 있나요?
A. 구글은 연구·교육·비영리 목적의 사용에 대해 별도의 프로그램을 운영하고 있으나, 구체적인 이용 조건과 정책은 공식 사이트에서 직접 확인해야 합니다. 상업적 사용이나 대규모 처리가 필요한 경우에는 별도의 요금제가 적용될 수 있습니다.

Google Earth Engine은 위성영상을 다루는 진입 장벽을 크게 낮춰 준 도구입니다. 영상을 내려받는 시간과 저장 공간 걱정 없이 컬렉션·필터·리듀서 세 가지 사고 틀만 익히면, 홍수 침수 범위 추적부터 산불 피해 면적 산출까지 재난 분석의 상당 부분을 브라우저 하나로 해결할 수 있습니다. 물론 GEE가 모든 상황에 최선인 것은 아닙니다. 도구에 따라 다른 장단점을 이해하고 적재적소에 쓰는 것이 실무 역량의 핵심입니다. 다음 편에서는 GEE에서 뽑아낸 영상을 인공지능 모델과 연결하는 방법, 즉 위성 데이터를 학습에 활용하는 첫 단계를 살펴볼 예정입니다. 과연 위성영상을 AI 모델에 입력하려면 어떤 전처리가 필요할까요?

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


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

📌 바로가기

2026-09-23

파이썬으로 공간분석 시작하기 | GeoPandas 기초 | GeoAI 기초 7편

파이썬으로 공간분석 시작하기 | GeoPandas 기초 | GeoAI 기초 7편

📌 3줄 요약

  • GeoDataFrame은 공간 위치 정보를 품은 표 구조로, 엑셀 시트에 지도를 붙인 형태다.
  • 파일 읽기·좌표 변환·공간조인까지 10줄 내외 코드로 처리할 수 있다.
  • 반복 분석이 필요한 재난 현장 데이터에서 코드 기반 접근이 특히 강력하다.

홍수 피해 현장에서 대피소 위치 파일과 침수 구역 파일을 받아 "어느 대피소가 침수 구역 안에 있는지" 확인해야 한다고 상상해 보세요. QGIS에서 두 레이어를 불러와 벡터 > 데이터 관리 도구 > 위치에 따라 레이어 결합 메뉴를 찾아 설정하고 저장하는 과정은 한 번이라면 괜찮습니다. 하지만 태풍 시즌 내내 매일 업데이트되는 침수 구역 파일을 같은 방식으로 반복한다면 어떨까요?

파이썬의 GeoPandas 라이브러리(공간 데이터를 다루기 위해 Pandas 표 구조에 도형 정보를 추가한 도구)는 이 흐름을 코드로 고정해 두고 파일만 바꿔 실행할 수 있게 해줍니다. 이번 글에서는 GeoDataFrame이 무엇인지, 파일을 읽고 좌표계를 바꾸고 두 레이어를 공간적으로 연결하는 흐름을 짧은 코드와 함께 살펴봅니다. 엑셀이나 QGIS로 하던 일을 코드로 옮기면 무엇이 달라지는지도 함께 짚어 드립니다.

🗂️ GeoDataFrame이 일반 표와 어떻게 다른가요?

Pandas의 DataFrame은 행과 열로 이루어진 표입니다. GeoDataFrame은 그 표에 geometry(도형) 열 하나를 추가한 구조입니다. 이 열에는 점, 선, 면 같은 공간 도형이 들어가고, 각 행은 하나의 공간 객체와 그에 딸린 속성 값들을 함께 가집니다. 엑셀 시트에 지도 핀 정보를 열 하나로 붙여 놓은 것과 비슷합니다.

중요한 차이는 CRS(좌표 참조 계, Coordinate Reference System) 정보를 GeoDataFrame이 스스로 기억한다는 점입니다. 6편에서 다룬 EPSG:4326(위경도)과 EPSG:5186(한국 미터 좌표)처럼 어떤 기준으로 위치를 표현하는지가 여기 저장됩니다. 좌표계가 다른 두 파일을 그냥 합치면 위치가 수백 킬로미터 벗어나는 오류가 생기는데, GeoPandas는 CRS를 명시적으로 다루도록 설계되어 이런 실수를 미리 잡아줍니다. 재난 대응 시 서로 다른 기관에서 받은 파일의 좌표계가 다른 경우는 생각보다 자주 있습니다.

📂 ShapeFile이나 GeoJSON은 어떻게 읽나요?

GeoPandas에서 파일을 읽는 기본 함수는 gpd.read_file()입니다. Shapefile(.shp), GeoJSON(.geojson), GeoPackage(.gpkg) 등 일반적인 공간 파일 형식을 별도 변환 없이 읽을 수 있습니다.

import geopandas as gpd

# 대피소 점 데이터 읽기
shelter = gpd.read_file("shelter.geojson")

# 침수 구역 폴리곤 읽기
flood = gpd.read_file("flood_zone.shp")

# 좌표계 확인
print(shelter.crs)   # 예: EPSG:4326
print(flood.crs)     # 예: EPSG:5186

파일을 읽은 뒤 가장 먼저 해야 할 일은 .crs 속성을 출력해 두 파일의 좌표계가 같은지 확인하는 것입니다. 이것이 '해봐야 아는 것'의 첫 번째 관문입니다. 출력 결과가 다르면 공간 연산 전에 반드시 통일해야 합니다. 실무에서는 국토교통부, 소방청, 기상청이 제공하는 공개 데이터의 좌표계가 각각 다른 경우가 있으므로, 데이터를 받으면 CRS를 먼저 확인하는 습관을 들이는 것이 좋습니다.

🌐 좌표계를 바꾸려면 어떤 함수를 쓰나요?

좌표 변환은 .to_crs() 메서드 하나로 처리합니다. 두 레이어를 같은 좌표계로 맞춰야 거리·면적 계산과 공간 조인이 정확하게 작동합니다.

# shelter를 flood의 좌표계에 맞춤
shelter_proj = shelter.to_crs(flood.crs)

# 또는 EPSG 코드로 직접 지정
shelter_proj = shelter.to_crs(epsg=5186)

주의할 점은 .to_crs()가 원본을 수정하지 않고 새 GeoDataFrame을 돌려준다는 것입니다. 원본 변수를 덮어쓰지 않으려면 새 변수에 받아야 합니다. 미터 단위 좌표계(예: EPSG:5186)로 변환해 두면 이후 거리나 면적을 계산할 때 단위가 미터로 나오기 때문에 결과 해석이 훨씬 직관적입니다. 예를 들어 산사태 위험 구역에서 500미터 이내에 있는 주거지를 추출할 때, 미터 단위 좌표계가 아니면 버퍼 반경 값을 위경도 차이로 계산해야 해서 실수가 생기기 쉽습니다.

🏘️ 공간 조인은 어떤 상황에 쓰나요?

공간 조인(Spatial Join)은 두 레이어를 위치 관계를 기준으로 합치는 연산입니다. "이 점이 저 면 안에 있는가"처럼 공간적 포함 관계로 속성을 연결할 때 씁니다. QGIS에서는 벡터 > 데이터 관리 도구 > 위치에 따라 속성 결합 메뉴가 같은 역할을 합니다.

# 침수 구역 안에 있는 대피소 찾기
joined = gpd.sjoin(shelter_proj, flood, how="inner", predicate="within")
print(joined[["name", "flood_level"]])

predicate 옵션에는 "within"(면 안에 포함), "intersects"(경계 포함 교차), "contains" 등을 상황에 따라 골라 씁니다. how="inner"는 조건을 만족하는 행만 남기고, "left"는 왼쪽 레이어의 모든 행을 유지하면서 매칭된 값만 붙입니다. 산불 대피 경로를 설계할 때 도로 선 데이터와 위험 구역 면 데이터를 intersects 조건으로 조인하면, 위험 구역을 통과하는 도로 구간을 자동으로 추려낼 수 있습니다.

💡 엑셀·QGIS로 하던 것을 굳이 코드로 옮겨야 하는 이유가 있나요?

QGIS 메뉴 클릭과 코드 실행은 결과가 같습니다. 차이는 반복성과 기록 가능성에 있습니다. 코드는 파일 이름만 바꾸면 어제와 똑같은 분석을 오늘 다시 실행할 수 있고, 어떤 좌표계로 변환했고 어떤 조건으로 조인했는지가 코드 자체에 남아 있어 동료에게 공유하거나 6개월 뒤에 검토하기가 쉽습니다. 엑셀 VLOOKUP으로 공간 조인을 흉내 낼 수 있지만, 위치 기반 관계는 엑셀이 기본으로 지원하지 않아 중간에 수작업이 들어갑니다.

실제로 해봐야 아는 것이 있습니다. 같은 분석을 QGIS 메뉴로 한 번, GeoPandas 코드로 한 번 각각 실행해 결과 레이어의 행 수와 속성 값이 일치하는지 비교해 보세요. 일치하면 코드가 옳게 작동한다는 확인이 되고, 차이가 생기면 predicate 옵션이나 좌표계 불일치를 의심해야 합니다. 이 검증 습관은 재난 대응 보고서에 들어가는 수치의 신뢰도를 높이는 데 직결됩니다. 버전에 따라 메뉴 이름이나 함수 인자 이름이 다를 수 있으므로, 공식 GeoPandas 문서(geopandas.org)의 API 레퍼런스를 함께 열어두는 것을 권장합니다.

🖥️ 화면에서 따라하기

따라하기 단계

  1. 환경 준비
    터미널에서 pip install geopandas 입력 후 설치 완료 메시지 확인
  2. 파일 읽기
    주피터 노트북 또는 VS Code에서 gpd.read_file("파일경로.shp") 실행
  3. CRS 확인
    shelter.crs, flood.crs 각각 출력해 두 값이 같은지 눈으로 비교
  4. 좌표 변환
    shelter_proj = shelter.to_crs(flood.crs) 입력 후 shelter_proj.crs 재확인
  5. 공간 조인
    gpd.sjoin(shelter_proj, flood, how="inner", predicate="within") 실행
  6. 결과 검토
    joined.shape로 행 수 확인, joined.explore() 로 지도 위 결과 시각화

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

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

GeoPandas 코드 오류 메시지를 붙여 넣고 원인과 수정 방법을 얻을 때 사용

나는 파이썬 GeoPandas를 공부하는 초보자입니다. 아래 오류 메시지와 코드를 보고 원인을 한국어로 설명해 주세요. 설명은 중학생도 이해할 수 있는 수준으로, 전문용어가 나오면 괄호 안에 짧은 풀이를 붙여 주세요. 수정된 코드도 함께 보여 주되, 각 줄에 주석으로 무엇을 하는지 적어 주세요. 지어낸 함수나 존재하지 않는 파라미터는 쓰지 마세요.
[오류 메시지를 여기에 붙여 넣기]
[문제가 생긴 코드를 여기에 붙여 넣기]
확인 항목: AI가 제안한 함수명과 파라미터가 실제 GeoPandas 공식 문서에 있는지 직접 확인하세요.

재난 대응 데이터 분석 시나리오를 코드 흐름으로 정리할 때 사용

나는 [대상 재난, 예: 홍수] 상황에서 [분석 목표, 예: 침수 구역 내 대피소 파악] 작업을 GeoPandas로 처리하려고 합니다. 사용할 파일은 [파일1 설명]과 [파일2 설명]입니다. 아래 순서로 답해 주세요. 1) 필요한 전처리 단계, 2) 좌표계 확인 및 변환 방법, 3) 공간 조인 코드 예시, 4) 결과를 검증하는 방법. 각 단계에 10줄 이하 코드를 포함하고, 가정한 사항은 명확히 표시해 주세요. 사실이 불확실한 내용은 '확인 필요'라고 표시해 주세요.
확인 항목: 제안된 EPSG 코드가 내 데이터에 실제로 맞는지, 파일 경로와 열 이름이 실제 데이터와 일치하는지 반드시 확인하세요.

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

🧪 직접 해보기

  • 공공데이터포털(data.go.kr)에서 "대피소" 또는 "민방위 대피시설" 검색 후 GeoJSON 또는 Shapefile 형식으로 내려받아 gpd.read_file()로 읽고 .crs를 출력해 보세요.
  • 읽은 GeoDataFrame에서 .explore() 메서드를 실행해 지도 위에 점이 올바른 위치에 찍히는지 눈으로 확인해 보세요. 화면에 점이 아예 안 보이거나 엉뚱한 곳에 찍히면 좌표계 문제를 의심하세요.
  • QGIS에서 같은 파일을 레이어 > 레이어 추가 > 벡터 레이어로 불러온 뒤 레이어 오른쪽 클릭 > 속성 > 소스 탭에서 표시되는 CRS와 .crs 출력 값이 일치하는지 비교해 보세요.

❓ 자주 묻는 질문

Q. GeoPandas를 설치했는데 import 오류가 납니다. 왜 그런가요?
A. GeoPandas는 GDAL, Fiona, Shapely 같은 C 기반 라이브러리에 의존하기 때문에 pip install만으로 환경에 따라 설치가 실패하는 경우가 있습니다. conda 환경을 사용하거나, conda-forge 채널에서 conda install -c conda-forge geopandas 로 설치하면 의존성 문제가 줄어드는 경우가 많습니다.

Q. .shp 파일을 읽으려면 .dbf, .prj 파일도 같은 폴더에 있어야 하나요?
A. 네, Shapefile은 하나의 파일이 아니라 .shp, .dbf, .prj, .shx 등 여러 파일이 모여 하나의 레이어를 이루는 형식입니다. 이 파일들이 같은 폴더에 함께 있어야 gpd.read_file()이 속성과 좌표계 정보를 모두 읽어올 수 있습니다.

Q. 공간 조인 결과 행 수가 원본보다 늘어났어요. 오류인가요?
A. 오류가 아닐 수 있습니다. 하나의 점이 여러 면 폴리곤과 겹치면 각 폴리곤마다 행이 하나씩 생겨 결과 행 수가 늘어납니다. 의도한 분석에서 중복이 문제라면 how="left"로 바꾸거나 .drop_duplicates()로 정리하면 됩니다. 먼저 joined.index_right.value_counts()로 어느 폴리곤에서 중복이 생겼는지 확인해 보세요.

GeoPandas의 읽기·좌표 변환·공간 조인 흐름을 익히면, 반복적으로 바뀌는 재난 데이터를 매번 수작업으로 처리하지 않아도 됩니다. 코드를 저장해 두면 내일 새로운 침수 구역 파일이 와도 경로만 바꿔 같은 분석을 바로 실행할 수 있습니다. 처음에는 열 이름 오타나 좌표계 불일치로 막히는 경우가 많지만, 그때마다 .columns와 .crs를 출력해 확인하는 습관이 가장 빠른 해결책입니다. 파일을 읽고 조인하는 것까지 익혔다면, 다음 단계는 그 결과를 버퍼링이나 면적 계산 같은 공간 연산으로 발전시키는 것입니다. 다음 편에서는 GeoDataFrame 위에서 거리와 면적을 계산하고, 위험 구역을 자동으로 추출하는 방법을 살펴볼 예정입니다.

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


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

📌 바로가기

좌표계(CRS)가 헷갈릴 때 | EPSG:4326과 5186 | GeoAI 기초 6편

좌표계(CRS)가 헷갈릴 때 | EPSG:4326과 5186 | GeoAI 기초 6편

🎬 1분 브리핑 영상

📌 3줄 요약

  • 지리좌표계는 경·위도, 투영좌표계는 미터 단위로 거리를 잰다.
  • 한국에서 EPSG:4326과 EPSG:5186은 목적에 따라 구분해 써야 한다.
  • 좌표계가 어긋나면 레이어가 엉뚱한 곳에 놓이고 면적 계산이 틀어진다.

QGIS에 홍수 침수 범위 레이어를 불러왔는데, 분명히 서울 데이터인데 지도 위에서 아프리카 근처에 점이 찍혀 있는 경험을 해보신 적 있으신가요? 혹은 두 레이어를 겹쳤더니 딱 맞아야 할 도로와 건물이 수십 미터씩 어긋나 있는 경우도 있습니다. 이런 증상의 가장 흔한 원인이 바로 좌표계, 즉 CRS(Coordinate Reference System, 지구 위 위치를 숫자로 나타내는 기준 체계)가 서로 다르거나 잘못 지정되어 있기 때문입니다.

GIS를 처음 배울 때 좌표계는 그냥 넘어가기 쉬운 개념이지만, 재난안전 업무처럼 공간 정확도가 생명과 직결되는 분야에서는 좌표계 오류 하나가 대피소 위치를 엉뚱한 행정구역에 배치하거나 침수 면적을 잘못 계산하는 결과로 이어질 수 있습니다. 이번 글에서는 지리좌표계와 투영좌표계의 차이, 한국에서 자주 쓰는 EPSG 코드, 그리고 좌표계가 어긋났을 때 어떤 순서로 해결하는지를 차근차근 짚어 보겠습니다.

🌐 지리좌표계와 투영좌표계는 어떻게 다른가요?

지리좌표계(Geographic CRS)는 경도와 위도처럼 각도 단위로 위치를 표현합니다. 지구를 둥근 타원체로 보고 "북쪽으로 몇 도, 동쪽으로 몇 도"라고 말하는 방식입니다. 대표적인 예가 WGS84인데, 이것을 EPSG 코드로 표현하면 EPSG:4326입니다. GPS 기기가 찍어주는 좌표, 스마트폰 지도 앱의 위치 공유, 국제 데이터 교환에 가장 흔히 쓰입니다.

투영좌표계(Projected CRS)는 둥근 지구를 평면 종이 위에 펼칠 때 쓰는 기준입니다. 종이에 펼치면서 어쩔 수 없이 면적이나 모양에 왜곡이 생기는데, 투영법의 종류에 따라 거리 왜곡을 줄이거나 면적 왜곡을 줄이는 방향을 선택합니다. 단위는 미터 또는 피트가 됩니다. 재난안전 업무에서 침수 면적이 몇 제곱킬로미터인지, 대피 경로가 몇 미터인지 계산하려면 반드시 투영좌표계 위에서 작업해야 합니다. 각도 단위인 경위도로는 거리와 면적을 직접 계산할 수 없기 때문입니다.

🗺️ 한국에서 EPSG:4326과 EPSG:5186은 각각 언제 쓰나요?

EPSG:4326은 앞서 말한 WGS84 지리좌표계입니다. 웹 지도, API, GPS 데이터, 국제 공유 데이터에서 자주 만납니다. 좌표값이 경도 126~130, 위도 34~38 범위에 있다면 이 체계일 가능성이 높습니다.

EPSG:5186은 국토지리정보원이 고시한 한국 중부원점 TM(Transverse Mercator, 횡단 메르카토르) 투영좌표계입니다. 국내 공간 분석에서 가장 흔히 권장되는 투영좌표계 중 하나로, 단위는 미터입니다. 국가공간정보포털이나 행정안전부 재난정보 레이어처럼 국내 공공 데이터에서 자주 볼 수 있습니다. 좌표값이 200,000~600,000 범위라면 투영좌표계를 의심해 볼 수 있습니다.

추가로 EPSG:5179(Korea 2000 / Unified CS)도 자주 등장합니다. 전국 단위 지도를 하나의 투영계로 커버하고 싶을 때 씁니다. EPSG:3857은 웹 메르카토르로, OpenStreetMap이나 카카오맵처럼 웹 타일 지도에 주로 쓰이지만 고위도로 갈수록 면적 왜곡이 크기 때문에 정확한 면적·거리 계산에는 적합하지 않습니다. 산불 피해 범위나 홍수 침수 구역의 면적을 공식 보고서에 올릴 때는 EPSG:5186 또는 EPSG:5179 위에서 계산하는 것이 안전합니다.

🔍 좌표계가 어긋났을 때 어떤 증상이 나타나나요?

가장 흔한 증상은 레이어가 엉뚱한 위치에 놓이는 것입니다. 대표적인 경우가 좌표값은 있는데 CRS 정보가 없거나 잘못 할당된 경우입니다. 예를 들어 실제로는 EPSG:5186 미터 좌표인 데이터를 QGIS가 EPSG:4326(경위도)으로 읽으면, 200,000을 경도 200도로 해석해서 지도 밖으로 날아가 버립니다.

두 번째 증상은 레이어는 비슷한 위치에 보이는데 수십 미터에서 수백 미터씩 어긋나는 경우입니다. 이때는 QGIS가 프로젝트 CRS에 맞춰 실시간으로 좌표를 변환하는 '온더플라이(On the Fly) 투영' 기능이 작동하고 있을 가능성이 큽니다. 두 레이어의 CRS가 다르면 겹쳐 보이더라도 실제 지오메트리 데이터는 서로 다른 기준점을 참조하므로 공간 연산(교차, 버퍼, 면적 계산 등) 결과가 틀어집니다. 산사태 위험 구역과 주민 거주지를 겹쳐 취약 인구를 추출하는 분석을 할 때 이 오류가 숨어 있으면 결과를 신뢰할 수 없습니다.

🛠️ 좌표계 오류는 어떤 순서로 해결하면 되나요?

해봐야 아는 것이기도 한데, 먼저 레이어의 현재 CRS 정보를 직접 눈으로 확인하는 것이 첫 번째 단계입니다. QGIS에서는 레이어 패널에서 해당 레이어를 오른쪽 클릭 > 속성(Properties) > 정보(Information) 탭을 열면 "CRS" 항목에 현재 지정된 좌표계 이름과 EPSG 코드가 표시됩니다. 여기서 'Unknown CRS' 또는 전혀 다른 EPSG 코드가 보이면 문제의 원인이 확인된 것입니다.

두 번째는 '정의 설정'과 '재투영'을 구분하는 일입니다. 데이터 파일에 CRS 정보 자체가 없을 때는 레이어 오른쪽 클릭 > 레이어 CRS 설정(Set Layer CRS)으로 올바른 CRS를 할당합니다. 반면 CRS는 이미 맞는데 다른 좌표계로 변환이 필요할 때는 벡터 데이터라면 벡터(Vector) > 데이터 관리 툴(Data Management Tools) > 레이어 재투영(Reproject Layer)을 사용합니다. 래스터라면 래스터(Raster) > 투영(Projections) > 워프(변환)(Warp (Reproject)) 메뉴를 이용합니다. 메뉴 이름은 QGIS 버전에 따라 조금씩 다를 수 있으므로, 못 찾을 때는 상단 처리(Processing) > 툴박스(Toolbox)를 열고 "reproject"로 검색하면 버전과 관계없이 찾을 수 있습니다.

세 번째는 재투영 후 결과를 반드시 확인하는 것입니다. 위성영상이나 행정경계 레이어와 겹쳐 놓고 경계선이 맞는지 눈으로 검토한 뒤, 면적 계산이 필요하다면 필드 계산기($area 함수)로 이상한 값이 나오지 않는지 체크합니다. 대피소 위치 데이터라면 한두 곳을 골라 실제 주소와 좌표를 대조해 보는 것이 가장 확실합니다.

📋 프로젝트를 시작할 때 CRS를 어떻게 통일하면 되나요?

여러 출처의 데이터를 함께 쓰는 프로젝트라면 시작 전에 기준 CRS를 하나로 정해 두는 것이 가장 효율적입니다. 국내 공간 분석을 목적으로 한다면 EPSG:5186이나 EPSG:5179 중 기관에서 자주 쓰는 쪽으로 맞추고, 모든 레이어를 해당 CRS로 재투영한 뒤 저장합니다. QGIS에서 프로젝트 CRS는 프로젝트(Project) > 속성(Properties) > CRS 탭에서 설정할 수 있습니다.

데이터를 받을 때마다 파일명 또는 메타데이터에 EPSG 코드를 기록해 두는 습관도 중요합니다. 특히 공공 포털에서 내려받은 shp 파일은 .prj 파일이 함께 있는지 확인하세요. .prj 파일이 없으면 QGIS가 CRS를 자동으로 인식하지 못해 Unknown CRS로 처리합니다. 홍수 대피 경로를 분석하거나 산불 피해 구역 면적을 산정하는 업무처럼 결과의 정확도가 중요한 경우, 데이터 수신 단계에서 CRS를 확인하는 절차를 작업 체크리스트에 포함시켜 두면 나중에 발생할 수 있는 오류를 미리 막을 수 있습니다.

🖥️ 화면에서 따라하기

따라하기 단계

  1. CRS 확인
    레이어 패널에서 레이어 오른쪽 클릭 > 속성(Properties) > 정보(Information) 탭 > CRS 항목 확인
  2. CRS 할당
    CRS가 Unknown일 때: 레이어 오른쪽 클릭 > 레이어 CRS 설정(Set Layer CRS) > EPSG 코드 입력 후 확인
  3. 벡터 재투영
    벡터(Vector) > 데이터 관리 툴 > 레이어 재투영(Reproject Layer) > 목표 CRS에 EPSG:5186 입력 후 실행
  4. 래스터 재투영
    래스터(Raster) > 투영(Projections) > 워프(Warp) > 목표 CRS에 EPSG:5186 입력 후 실행
  5. 결과 시각 검토
    재투영된 레이어를 기준 레이어(행정경계 등)와 겹쳐 경계 일치 여부 눈으로 확인
  6. 면적 계산 확인
    레이어 오른쪽 클릭 > 속성 테이블 열기 > 필드 계산기 > $area 입력해 이상값 여부 점검

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

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

좌표계 오류 원인과 해결 절차를 단계별로 정리해 달라고 요청할 때

너는 GIS 기술 지원 전문가야. 나는 공간정보를 처음 배우는 실무자야.
아래 상황을 읽고, 좌표계 오류의 원인과 해결 순서를 단계별로 설명해 줘.

상황: [데이터 출처(예: 국가공간정보포털 shp 파일)], [사용 도구(예: QGIS 최신 버전)],
[증상(예: 레이어가 지도 밖에 표시됨 / 두 레이어가 수백 미터 어긋남)]

답변 형식:
1. 추정 원인 (2줄 이내)
2. 확인 절차 (번호 목록, 각 줄 1단계)
3. 해결 방법 (재투영 vs CRS 할당 중 무엇인지 구분해서)
4. 재발 방지를 위한 체크리스트 (3항목 이내)

추측이 필요한 경우 "추정:"이라고 표시하고, 확실하지 않은 수치나 메뉴 이름은 단정하지 마.
결과물을 사람이 반드시 검토해야 하는 항목을 마지막에 별도로 적어 줘.

팀원에게 CRS 통일 기준을 안내하는 내부 가이드 초안을 만들 때

너는 공공기관 GIS 업무 담당자를 돕는 기술 문서 작성 보조자야.
아래 조건에 맞는 내부 가이드 초안을 작성해 줘.

기관: [기관명]
주요 업무: [재난안전 공간분석 / 도시계획 등]
사용 도구: [QGIS / ArcGIS Pro 등]
기준 CRS: [EPSG:5186 또는 EPSG:5179]

포함할 내용:
- 데이터 수신 시 CRS 확인 방법 (1~2줄)
- 재투영이 필요한 경우와 아닌 경우 구분
- 파일 저장 시 명명 규칙 예시 (CRS 코드 포함)
- 담당자가 반드시 육안으로 검토해야 하는 항목

전문용어는 처음 나올 때 괄호로 풀어 써. 위협적이거나 단정적인 표현은 쓰지 마.

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

🧪 직접 해보기

  • QGIS에 가지고 있는 shp 파일을 불러온 뒤 레이어 오른쪽 클릭 > 속성 > 정보 탭에서 CRS 항목을 직접 읽어보고, EPSG 코드가 무엇인지 확인해 본다.
  • epsg.io 사이트에서 5186, 4326, 5179, 3857을 각각 검색해 지도 미리보기와 단위(degree/metre)가 어떻게 다른지 비교해 본다.
  • QGIS에서 같은 지역의 shp 파일을 EPSG:4326과 EPSG:5186으로 각각 저장한 뒤 필드 계산기에서 $area 값을 비교해, 경위도 좌표 위에서 계산한 면적이 얼마나 틀리는지 직접 확인해 본다.

❓ 자주 묻는 질문

Q. QGIS에서 레이어를 불러왔는데 지도 위에 아무것도 안 보여요. 좌표계 문제인가요?
A. 가능성이 높습니다. 레이어 패널에서 해당 레이어 오른쪽 클릭 > 레이어로 확대(Zoom to Layer)를 눌러서 레이어가 실제로 어디에 놓여 있는지 먼저 확인하세요. 지도 범위 밖 엉뚱한 곳에 있다면 CRS가 잘못 지정되었거나 할당되지 않은 경우입니다.

Q. CRS를 바꾸면 원본 데이터가 손상되나요?
A. 레이어 CRS 설정(Set Layer CRS)은 파일 자체의 좌표값을 바꾸지 않고 해석 기준만 바꿉니다. 반면 재투영(Reproject Layer)은 좌표값 자체를 새 CRS 기준으로 변환해서 새 파일로 저장합니다. 원본을 보존하려면 재투영 전에 원본 파일을 별도로 백업해 두는 것이 안전합니다.

Q. 웹 지도(카카오맵, 네이버 지도)에서 좌표를 복사했는데 QGIS에 붙이면 왜 안 맞나요?
A. 웹 지도에서 제공하는 좌표는 대부분 EPSG:4326(경위도) 기준입니다. QGIS 프로젝트가 EPSG:5186 같은 투영좌표계로 설정되어 있다면, 좌표 입력 시 반드시 해당 좌표가 EPSG:4326임을 명시하거나, 프로젝트 CRS를 일시적으로 4326으로 바꿔서 입력한 뒤 다시 변환해야 합니다.

좌표계는 GIS 작업의 가장 기초적인 설정이지만, 익숙해지기까지 의외로 많은 시행착오를 겪는 부분이기도 합니다. 핵심만 정리하면, 데이터를 받는 순간 CRS를 확인하고, 분석 전에 모든 레이어를 하나의 투영좌표계로 통일하고, 결과를 눈과 수치 두 가지로 검토하는 세 가지 습관이면 대부분의 오류를 예방할 수 있습니다. 재난안전 분야에서는 이 단순한 확인 절차 하나가 대피소 배치 오류나 침수 면적 오산을 막는 안전망이 됩니다. 좌표계를 제대로 맞췄다면 이제 그 위에서 공간 분석을 수행할 차례인데, 다음 편에서는 벡터 데이터의 버퍼(buffer)와 교차(intersect) 분석이 재난안전 업무에서 어떻게 쓰이는지를 살펴보겠습니다.

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


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

📌 바로가기

2026-09-21

QGIS 입문 | 처음 열고 무엇부터 해보면 되나 | GeoAI 기초 5편

QGIS 입문 | 처음 열고 무엇부터 해보면 되나 | GeoAI 기초 5편

📌 3줄 요약

  • QGIS는 설치만 하면 바로 쓸 수 있는 무료 오픈소스 GIS 소프트웨어다.
  • 좌표계·레이어·속성테이블, 이 세 개념을 이해하면 기초가 잡힌다.
  • 오픈 데이터로 첫 실습을 마치면 재난안전 데이터도 다룰 수 있다.

GIS를 배워보고 싶은데 어디서 시작해야 할지 막막한 분들이 많습니다. 비싼 소프트웨어를 사야 하나, 코딩을 먼저 익혀야 하나 고민하다가 결국 시작도 못하는 경우도 흔합니다. 그런데 실은 설치 파일 하나를 내려받아 실행하는 것만으로도 시작할 수 있습니다. 그 도구가 QGIS입니다.

QGIS는 개인도 기관도 별도 비용 없이 쓸 수 있는 오픈소스 GIS 소프트웨어입니다. 전 세계 공공기관, 연구소, 재난관리 현장에서 실제로 활용되고 있고, 한국어 인터페이스도 지원합니다. 이번 글에서는 처음 QGIS를 열었을 때 무엇을 보게 되는지, 반드시 알아야 할 세 가지 개념은 무엇인지, 그리고 첫 실습으로 무엇을 해보면 좋은지를 차근차근 안내합니다.

🖥️ QGIS는 어떻게 설치하고, 처음 화면에서 뭘 봐야 하나요?

QGIS 공식 사이트(qgis.org)에서 운영체제에 맞는 설치 파일을 내려받을 수 있습니다. 버전은 크게 장기 지원 버전과 최신 버전 두 종류가 제공되는데, 안정성을 우선한다면 장기 지원 버전을 선택하는 것이 일반적입니다. 설치 후 처음 실행하면 가운데 지도 캔버스, 왼쪽 레이어 패널, 위쪽 메뉴 바와 툴바가 보입니다. 지도 캔버스는 말 그대로 지도가 그려지는 도화지입니다. 레이어 패널은 현재 불러온 데이터 목록을 보여주는 곳으로, 여기 아무것도 없으면 지도에도 아무것도 안 보입니다. 메뉴 버전에 따라 위치나 이름이 조금씩 다를 수 있으니, 찾기 어려울 때는 상단 메뉴 보기 > 패널에서 원하는 패널을 켜거나 끌 수 있습니다. 재난안전 업무에서는 대피소·침수구역·산사태 위험지역 같은 레이어를 이 캔버스 위에 겹쳐 놓고 상황을 한눈에 파악합니다.

🌐 좌표계가 뭔가요? 왜 신경 써야 하나요?

좌표계(Coordinate Reference System, CRS)는 지구 위의 위치를 숫자로 표현하는 약속 체계입니다. 지구는 둥글고 지도는 평면이기 때문에, 어떤 방식으로 둥근 면을 펼치느냐에 따라 같은 위치의 좌표값이 달라집니다. 예를 들어 위도·경도로 나타내는 WGS84와, 한국에서 주로 쓰는 미터 단위 평면 좌표계인 EPSG:5186은 같은 지점이라도 숫자 자체가 완전히 다릅니다. QGIS에서 레이어를 불러오면 오른쪽 아래 상태 표시줄에 현재 좌표계가 표시됩니다. 레이어마다 좌표계가 다르면 지도 위에서 서로 어긋나 보이는 문제가 생깁니다. 이 상태를 '좌표계 불일치'라고 부르며, 이것을 처음에 잡아 두지 않으면 홍수 범람 구역과 도로 레이어가 수백 미터씩 어긋나는 황당한 결과가 나옵니다. 레이어 오른쪽 클릭 > 레이어 속성 > 소스 탭에서 해당 레이어의 좌표계를 확인하고, 필요하면 레이어 > 저장 > 다른 이름으로 저장에서 좌표계를 바꿔 내보낼 수 있습니다.

📂 레이어란 무엇이고, 어떤 종류가 있나요?

레이어는 GIS에서 데이터를 담는 단위입니다. 투명한 필름지 여러 장을 겹치는 것과 비슷합니다. 한 장에는 도로, 한 장에는 하천, 한 장에는 건물 정보가 들어 있고, 이것을 순서대로 쌓으면 완성된 지도가 됩니다. QGIS에서 다루는 레이어는 크게 벡터(Vector)와 래스터(Raster) 두 종류입니다. 벡터는 점·선·면 형태로 위치를 표현하는 방식이고, 래스터는 위성사진이나 수치표고모델처럼 격자(픽셀)로 이루어진 데이터입니다. 레이어를 불러올 때는 상단 메뉴 레이어 > 레이어 추가에서 벡터 레이어 추가, 래스터 레이어 추가, WMS/WMTS 등 원하는 유형을 고릅니다. 레이어 패널 안에서 레이어 이름 왼쪽 체크박스를 끄면 해당 레이어가 캔버스에서 숨겨지므로, 여러 레이어를 켜고 끄며 원하는 정보만 확인할 수 있습니다. 산불 대응 현장에서는 연소 위험지역(래스터)과 소방서 위치(벡터 점)를 같은 캔버스에 올려 놓고 대응 거리를 분석합니다.

🗂️ 속성 테이블에는 어떤 정보가 들어 있나요?

속성 테이블(Attribute Table)은 레이어에 포함된 각 공간 객체의 정보를 행과 열로 정리한 표입니다. 데이터베이스의 테이블과 구조가 같습니다. 예를 들어 대피소 레이어라면 각 대피소마다 이름, 주소, 수용인원, 운영 기관 같은 정보가 열(Column)로 들어 있고, 각 대피소 하나하나가 행(Row)이 됩니다. 속성 테이블을 보려면 레이어 패널에서 원하는 레이어를 오른쪽 클릭 > 속성 테이블 열기를 선택합니다. 표 안의 특정 행을 클릭하면 지도 위에서 해당 객체가 선택(노란색 하이라이트)되므로 위치와 정보를 동시에 확인할 수 있습니다. 해봐야 아는 것 한 가지가 있는데, 속성 테이블을 열어서 상단 연필 아이콘(편집 모드 전환)을 누르지 않으면 값을 수정할 수 없습니다. 편집 모드로 들어가지 않은 상태에서는 셀을 클릭해도 글자가 바뀌지 않습니다. 직접 열어보고 편집 모드 전후 차이를 확인하는 것이 가장 빠른 이해 방법입니다. 재난 상황에서는 대피소별 수용인원 열을 기준으로 일정 인원 이상인 시설만 골라내는 필터 작업에 속성 테이블이 핵심적으로 쓰입니다.

🎯 첫 실습으로 무엇을 해보면 좋을까요?

첫 실습으로 가장 추천하는 과제는 공개 행정 경계 데이터를 불러와 색상을 바꾸고, 속성 테이블에서 특정 조건으로 객체를 선택해 보는 것입니다. 국가공간정보포털(nsdi.go.kr) 또는 통계지리정보서비스(sgis.kostat.go.kr) 같은 공공 사이트에서 시도·시군구 경계 SHP 파일을 내려받을 수 있습니다. 파일을 내려받은 뒤 QGIS에서 레이어 > 레이어 추가 > 벡터 레이어 추가를 선택하고, 찾아보기 버튼으로 .shp 파일을 지정한 다음 추가 버튼을 누릅니다. 레이어가 캔버스에 올라오면 레이어 패널에서 해당 레이어를 더블 클릭해 레이어 속성 창을 열고, 심볼 탭에서 색상과 테두리를 바꿔 보세요. 이어서 속성 테이블을 열고 상단 표현식으로 객체 선택 버튼(ε 모양 아이콘)을 눌러 인구수나 면적 같은 특정 조건을 입력해 보면, 필터 개념을 몸으로 익히게 됩니다. 이 과정이 익숙해지면 침수 예상 구역 레이어에서 특정 침수 깊이 이상인 구역만 골라 대피소 레이어와 겹쳐 보는 분석으로 자연스럽게 이어집니다.

🖥️ 화면에서 따라하기

따라하기 단계

  1. QGIS 설치
    qgis.org 접속 > 다운로드 페이지에서 운영체제 선택 후 장기 지원 버전 설치 파일 내려받기
  2. 데이터 준비
    국가공간정보포털(nsdi.go.kr) 로그인 > 오픈마켓 > 행정경계 SHP 파일 내려받기
    새 프로젝트를 열면 보이는 빈 작업창
    새 프로젝트를 열면 보이는 빈 작업창
  3. 벡터 레이어 추가
    상단 메뉴 레이어 > 레이어 추가 > 벡터 레이어 추가 > 찾아보기로 .shp 파일 선택 > 추가 클릭
    벡터 레이어를 불러온 뒤 레이어 패널에 나타난 모습
    벡터 레이어를 불러온 뒤 레이어 패널에 나타난 모습
  4. 좌표계 확인
    레이어 패널에서 레이어 오른쪽 클릭 > 레이어 속성 > 소스 탭에서 CRS 항목 확인
    화면 오른쪽 아래의 좌표계 표시
    화면 오른쪽 아래의 좌표계 표시
  5. 심볼 변경
    레이어 패널에서 레이어 더블 클릭 > 심볼 탭 > 색 채우기·테두리 색 변경 후 확인 클릭
  6. 속성 테이블 조회
    레이어 오른쪽 클릭 > 속성 테이블 열기 > 표현식으로 객체 선택 버튼 클릭 > 조건식 입력 후 선택 실행
    속성 테이블에서 값 확인하기
    속성 테이블에서 값 확인하기

※ 프로그램 버전에 따라 메뉴 이름이 조금씩 다를 수 있습니다.

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

QGIS에서 처음 마주치는 오류 메시지나 개념을 빠르게 이해하도록 AI에게 물을 때 쓰는 프롬프트

너는 GIS 초보자를 돕는 QGIS 튜터다.
내가 QGIS를 사용하다 겪은 문제나 이해 안 되는 개념을 설명하면, 다음 형식으로 답해줘.
1. 이 오류나 개념이 왜 생기는지 원리를 두 문장 이내로 설명
2. QGIS 화면에서 실제로 눌러야 할 메뉴와 버튼 이름을 순서대로 나열
3. 해결 후 결과가 올바른지 확인하는 방법 한 줄
전문용어는 처음 나올 때 괄호 안에 한 줄 풀이를 붙여줘.
확인되지 않은 버전 정보나 외부 링크는 만들지 마.
내 문제: [QGIS에서 겪은 오류 메시지 또는 이해 안 되는 개념을 여기에 붙여넣기]
사용 중인 운영체제: [Windows / macOS / Linux]

공개 재난 데이터를 QGIS 실습에 활용하는 방법을 단계별로 안내받을 때 쓰는 프롬프트

너는 재난안전 분야 GIS 실무 교육 전문가다.
아래 조건에 맞는 QGIS 실습 시나리오를 만들어줘.
대상 재난 유형: [홍수 / 산사태 / 산불 중 하나 선택]
사용 가능한 데이터: 공개 행정경계 SHP, 공개 수치표고모델(DEM) 래스터
실습 목표: QGIS에서 레이어 추가 → 좌표계 확인 → 속성 테이블 필터 → 결과 저장까지 한 번에 경험
형식: 단계별 번호 목록, 각 단계마다 QGIS 메뉴 이름과 버튼 이름을 실제 명칭으로 표기
제약: 유료 데이터나 로그인이 필요한 서비스는 제외, 초보자가 1시간 내에 완료할 수 있는 분량
사람이 반드시 확인해야 할 항목: 좌표계 일치 여부, 속성 테이블 필드명이 한글 깨짐 없이 표시되는지

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

🧪 직접 해보기

  • 국가공간정보포털(nsdi.go.kr)에서 시군구 경계 SHP 파일을 내려받아 QGIS에 불러오고, 좌표계가 무엇으로 설정되어 있는지 오른쪽 아래 상태 표시줄에서 직접 확인해 본다.
  • 속성 테이블을 열어 표현식으로 객체 선택 기능으로 특정 조건(예: 면적이 일정 값 이상)을 입력해 보고, 선택된 객체가 캔버스에서 어떻게 강조되는지 눈으로 확인한다.
  • 같은 지역의 레이어 두 개를 각각 다른 좌표계로 불러와 캔버스에서 어긋나는 현상을 직접 재현해 보고, 좌표계를 맞춘 뒤 차이를 비교한다.

❓ 자주 묻는 질문

Q. QGIS는 완전 무료인가요? 나중에 비용이 생기지는 않나요?
A. QGIS는 오픈소스 라이선스(GPL)로 배포되어 소프트웨어 자체를 내려받아 쓰는 데는 별도 비용이 없습니다. 다만 함께 쓰는 플러그인이나 데이터 서비스는 제공 주체에 따라 정책이 다를 수 있으므로, 개별 플러그인의 라이선스는 설치 전에 확인하는 것이 좋습니다.

Q. SHP 파일 말고 다른 형식의 데이터도 QGIS에서 열 수 있나요?
A. 네, QGIS는 GeoJSON, KML, GeoPackage, CSV(좌표 열 포함), GeoTIFF 등 다양한 공간 데이터 형식을 지원합니다. CSV 파일처럼 좌표 정보가 열로 들어 있는 파일은 레이어 > 레이어 추가 > 구분된 텍스트 레이어 추가를 통해 불러올 수 있습니다.

Q. 좌표계를 잘못 지정했을 때 데이터가 손상되나요?
A. 원본 파일 자체가 바뀌지는 않습니다. 좌표계를 잘못 지정하면 지도 위 표시 위치가 틀어질 뿐이고, 레이어 속성에서 올바른 좌표계로 다시 지정하면 됩니다. 단, 잘못된 좌표계로 다른 이름으로 저장한 경우에는 원본 파일을 다시 불러와 처음부터 작업하는 것이 안전합니다.

QGIS를 처음 열었을 때 낯선 화면에 당황하는 것은 누구나 겪는 일입니다. 하지만 좌표계, 레이어, 속성 테이블 이 세 가지 개념만 자기 것으로 만들면 그 이후의 모든 작업이 이 세 가지 위에서 돌아간다는 것을 금방 느끼게 됩니다. 처음부터 모든 기능을 파악하려 하지 말고, 오늘 안내한 순서대로 파일 하나를 불러와 색을 바꾸고 속성 테이블을 한 번 열어보는 것만으로도 충분한 시작입니다. 실제 재난안전 업무에서는 이 기초 위에 공간 분석(버퍼, 오버레이, 경로 분석 등)이 얹히는데, 다음 편에서는 QGIS에서 처음 해보는 공간 분석, 그중에서도 '버퍼'와 '교차 분석'이 재난 대피 계획에서 어떻게 쓰이는지를 다룰 예정입니다.

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


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

📌 바로가기

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

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