공간 분석/공간 분석 기초

QGIS Python 실전 프로젝트: 서울시 공공 와이파이 소외지역 분석 자동화

Data Jun 2026. 2. 28. 22:46

이번 프로젝트는 서울시 공공 와이파이 지점 데이터를 활용해
와이파이 영향권 밖의 소외 지역을 도출하는 공간 분석 자동화 사례입니다.

 

분석 흐름은 다음과 같습니다.

 

1️⃣ 와이파이 지점 재투영
2️⃣ 250m 버퍼 생성
3️⃣ 공간 인덱스 생성
4️⃣ 서울시 행정구역에서 버퍼 영역 제외(Difference)

 

즉,
“와이파이가 닿지 않는 서울시 영역”을 계산하는 구조입니다.

 

1. 분석 단계 설명

 1) 재투영 (Reproject)

# 2. 재투영

# 2.1 재투영 할당 객체 저장(메모리 기반)
output_wifie_re = 'memory: wifi_re'

# 2.2 재투영 파라미터 설정
reParams = {'INPUT': wifiPath, 'TARGET_CRS': 'EPSG:5186', 'OUTPUT': output_wifie_re}

# 2.3 재투영 실행
reWifi = processing.run('native:reprojectlayer', reParams)

# 2.4 재투영된 객체 QGIS 레이어 저장
QgsProject.instance().addMapLayer(reWifi['OUTPUT'])

공간 연산(버퍼, 거리 계산)은
투영 좌표계(미터 단위)가 필요합니다.

따라서 EPSG:5186으로 재투영합니다.

 

 2) 버퍼 생성 (250m)

# 3. 버퍼

# 3.1 버퍼 영향범위 설정
buffer_distance = 250

# 3.2 버퍼 할당 객체 저장(메모리 기반)

output_wifi_buffer = 'memory:wifi_buffer'

# 3.3 버퍼 파라미터 설정
bufferParams = {'INPUT' : reWifi['OUTPUT'], 'DISTANCE' : buffer_distance, 'DISSOLVE' : 1,'OUTPUT' : output_wifi_buffer}

# 3.4 버퍼 실행
bufferWifi = processing.run('native:buffer', bufferParams)

# 3.5 버퍼 객체 QGIS 레이어 저장
QgsProject.instance().addMapLayer(bufferWifi['OUTPUT'])
print('버퍼 완료 :', time.time()-start)
  • 250m 반경 영향권 생성
  • DISSOLVE = 1 → 겹치는 버퍼를 하나로 병합

이 단계에서
서울 전역의 “와이파이 서비스 가능 영역”이 만들어집니다.

 

3) 공간 인덱스 생성

# 4. 공간 인덱스 생성

# 4.1 공간 인덱스 할당 객체 생성 (메모리 기반)
output_index_wifi = 'memory:wifi_index'
output_index_seoul = 'memory:seoul_index'

# 4.2 인덱스 생성 파라미터
indexParams_wifi = {'INPUT' : bufferWifi['OUTPUT'], 'OUTPUT' : output_index_wifi}
indexParams_seoul = {'INPUT' : seoulguPath, 'OUTPUT' : output_index_seoul}

# 4.3 인덱스 생성 실행
indexWifi = processing.run('native:createspatialindex', indexParams_wifi)
indexSeoul = processing.run('native:createspatialindex', indexParams_seoul)
print('인덱스 생성 완료 :', time.time()-start)

왜 공간 인덱스를 추가했는가?

Difference 같은 공간 연산은 모든 도형을 서로 비교해야 합니다.

데이터가 많으면 연산 속도가 급격히 느려집니다.

공간 인덱스는

  • R-tree 구조 기반
  • 필요한 영역만 탐색
  • 불필요한 비교 제거

즉,
공간 연산 속도를 크게 향상시키는 가속 장치입니다.

실무에서는 대용량 데이터 처리 시 필수입니다.

 

4) Difference (빼기 연산)

# 5. 빼기

# 5.1 임시 산출물
output_seoul_diff_wifi = 'memory:seoul_diff_wifi'

# 5.2 빼기 파라미터
diffParams = {'INPUT' : indexSeoul['OUTPUT'], 'OVERLAY' : indexWifi['OUTPUT'],'OUTPUT' : output_seoul_diff_wifi}

# 5.3 빼기 실행
seoul_diff_wifi = processing.run('native:difference', diffParams)

# 5.4 빼기 결과 추가
QgsProject.instance().addMapLayer(seoul_diff_wifi['OUTPUT'])
print('빼기 완료 :', time.time()-start)

서울시 전체 행정구역에서 와이파이 버퍼 영역을 제외합니다.

결과는  와이파이 영향권 밖의 소외 지역

 

2. 프로젝트 코드

import processing
import time

start = time.time()

# 1. Shp Paths
wifiPath = r'~PATH\SHP\P1\공공와이파이\seoul_public_WIFI.shp'
seoulguPath = r'~PATH\SHP\P1\구경계\LARD_ADM_SECT_SGG_11.shp'

# 2. 재투영

# 2.1 재투영 할당 객체 저장(메모리 기반)
output_wifie_re = 'memory: wifi_re'

# 2.2 재투영 파라미터 설정
reParams = {'INPUT': wifiPath, 'TARGET_CRS': 'EPSG:5186', 'OUTPUT': output_wifie_re}

# 2.3 재투영 실행
reWifi = processing.run('native:reprojectlayer', reParams)

# 2.4 재투영된 객체 QGIS 레이어 저장
QgsProject.instance().addMapLayer(reWifi['OUTPUT'])

# 3. 버퍼

# 3.1 버퍼 영향범위 설정
buffer_distance = 250

# 3.2 버퍼 할당 객체 저장(메모리 기반)

output_wifi_buffer = 'memory:wifi_buffer'

# 3.3 버퍼 파라미터 설정
bufferParams = {'INPUT' : reWifi['OUTPUT'], 'DISTANCE' : buffer_distance, 'DISSOLVE' : 1,'OUTPUT' : output_wifi_buffer}

# 3.4 버퍼 실행
bufferWifi = processing.run('native:buffer', bufferParams)

# 3.5 버퍼 객체 QGIS 레이어 저장
QgsProject.instance().addMapLayer(bufferWifi['OUTPUT'])
print('버퍼 완료 :', time.time()-start)


# 4. 공간 인덱스 생성

# 4.1 공간 인덱스 할당 객체 생성 (메모리 기반)
output_index_wifi = 'memory:wifi_index'
output_index_seoul = 'memory:seoul_index'

# 4.2 인덱스 생성 파라미터
indexParams_wifi = {'INPUT' : bufferWifi['OUTPUT'], 'OUTPUT' : output_index_wifi}
indexParams_seoul = {'INPUT' : seoulguPath, 'OUTPUT' : output_index_seoul}

# 4.3 인덱스 생성 실행
indexWifi = processing.run('native:createspatialindex', indexParams_wifi)
indexSeoul = processing.run('native:createspatialindex', indexParams_seoul)
print('인덱스 생성 완료 :', time.time()-start)

# 5. 빼기

# 5.1 임시 산출물
output_seoul_diff_wifi = 'memory:seoul_diff_wifi'

# 5.2 빼기 파라미터
diffParams = {'INPUT' : indexSeoul['OUTPUT'], 'OVERLAY' : indexWifi['OUTPUT'],'OUTPUT' : output_seoul_diff_wifi}

# 5.3 빼기 실행
seoul_diff_wifi = processing.run('native:difference', diffParams)

# 5.4 빼기 결과 추가
QgsProject.instance().addMapLayer(seoul_diff_wifi['OUTPUT'])
print('빼기 완료 :', time.time()-start)

 

3. 프로젝트 구조 요약

  • 재투영 → 거리 정확성 확보
  • 버퍼 → 서비스 영향권 생성
  • 공간 인덱스 → 연산 속도 최적화
  • Difference → 소외 지역 도출

모든 과정을 Python으로 자동화했기 때문에

  • 재현 가능
  • 반복 가능
  • 배치 처리 가능

GUI 클릭 방식과 가장 큰 차이입니다.

 

4. 실무적 의미

이 구조는 다음과 같은 분석에 확장 가능합니다.

  • 의료 취약지역 분석
  • 대피소 접근성 분석
  • 공공시설 사각지대 분석
  • 상권 커버리지 분석

즉,
공간 접근성 분석의 기본 패턴입니다.

 

5. 정리 

QGIS Python을 활용해 재투영–버퍼–공간 인덱스–Difference 과정을 자동화하면, 서울시 공공 와이파이 소외 지역을 효율적으로 도출할 수 있으며 대용량 공간 분석에서도 성능을 확보할 수 있습니다.

 

서울 와이파이 포인트 - 서울 와이파이 버퍼
서울 와이피이 소외지역 결과 예