sw 융합 프로젝트

고태경·2025년 5월 13일

이슈 및 해결

geocoding 4시간 걸림 + 네트워크 이슈로 그대로 멈춤

기존 코드

# 좌표 변환 (Geocoding)
!pip install requests tqdm

import requests
from tqdm.notebook import tqdm
from urllib.parse import quote
import pandas as pd
import time

# 1. 카카오 REST API 키 입력
KAKAO_REST_API_KEY = 'KakaoAK 7bc29ad53927d7c84514b6cd27e8d380'  # 실제 키로 바꿔주세요

# 2. 변환 함수 정의 (api_key 받도록 수정)
def get_lat_lon(address, api_key):
    url = "https://dapi.kakao.com/v2/local/search/address.json"
    headers = {"Authorization": api_key}
    params = {"query": address} 

    response = requests.get(url, headers=headers, params=params)
    if response.status_code != 200:
        return None, None

    result = response.json()
    if result['documents']:
        lon = float(result['documents'][0]['x'])
        lat = float(result['documents'][0]['y'])
        return lat, lon
    else:
        return None, None

# 3. 주소 컬럼에서 좌표 변환 (api_key 매개변수 추가)
def apply_geocoding(df, address_col='주소', api_key=None):
    latitudes = []
    longitudes = []

    for addr in tqdm(df[address_col]):
        lat, lon = get_lat_lon(addr, api_key)
        latitudes.append(lat)
        longitudes.append(lon)
        time.sleep(0.1)  # API 요청 속도 제한 방지

    df['위도'] = latitudes
    df['경도'] = longitudes
    return df

# 4. 좌표 변환 실행
apt = apply_geocoding(apt, address_col='주소', api_key=KAKAO_REST_API_KEY)
multi = apply_geocoding(multi, address_col='주소', api_key=KAKAO_REST_API_KEY)

  • apply_geocoding 함수로 수천 개 주소를 카카오 API로 변환하려 함
  • 1건씩 HTTP 요청 → 수천 건 요청 시 1건당 0.5초만 걸려도 수 시간이 걸림
  • 카카오 API는 초당 제한 있음 (10~30건/초) → 속도 느림 + 차단 위험

해결 방안
✅ 1. 캐시 사용 이미 변환한 주소는 다시 요청 안 하기 (딕셔너리로 저장)
✅ 2. tqdm + 중간 저장 진행 상태 보이게 하고, 중간에 저장 파일로 복구 가능하게
✅ 3. sleep() 넣기 속도 제한 걸리지 않도록 텀 주기
✅ 4. 또는 한 번 변환한 결과 CSV 저장 후 재활용

import requests
import time
from tqdm import tqdm

KAKAO_API_KEY = 'YOUR_REST_API_KEY'

def kakao_geocode(address):
    url = f'https://dapi.kakao.com/v2/local/search/address.json?query={address}'
    headers = {'Authorization': f'KakaoAK {KAKAO_API_KEY}'}
    res = requests.get(url, headers=headers)
    if res.status_code == 200:
        result = res.json()['documents']
        if result:
            return result[0]['y'], result[0]['x']  # 위도, 경도
    return None, None

# ✅ 캐시 딕셔너리 사용
geocoded_cache = {}

def safe_geocode(address):
    if address in geocoded_cache:
        return geocoded_cache[address]
    lat, lon = kakao_geocode(address)
    geocoded_cache[address] = (lat, lon)
    time.sleep(0.2)  # 속도 제한 회피용
    return lat, lon

# ✅ 적용 (진행 표시 + 중간 저장도 가능)
coords = []
for addr in tqdm(df['주소']):  # 주소 컬럼 이름에 맞게 수정
    lat, lon = safe_geocode(addr)
    coords.append((lat, lon))

df['위도'] = [c[0] for c in coords]
df['경도'] = [c[1] for c in coords]

# ✅ CSV로 저장해두기 (다음엔 안 돌려도 됨)
df.to_csv('geocoded_아파트좌표.csv', index=False)
profile
컴퓨터정보과

0개의 댓글