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

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 이야기를 더 보고 싶다면 아래 채널도 함께 보세요.

📌 바로가기

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

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