본문 바로가기
[업무 지식]/Crawling

[geocode] 지오코딩으로 위치 정보 추출하기

by 에디터 윤슬 2025. 1. 2.

하나의 위치 정보 추출하기

from dotenv import load_dotenv
import os
import requests

load_dotenv()
GOOGLE_API_ID = os.getenv('GOOGLE_API_ID')

# API 요청 URL 생성
base_url = "https://maps.googleapis.com/maps/api/geocode/json"
address = "강원도 고성군 현내면 통일전망대로 20"
params = {
    "address": address,
    "key": GOOGLE_API_ID,
    "language": "ko"  # 응답을 한국어로 설정
}

# API 호출
response = requests.get(base_url, params=params)

# 응답 처리
if response.status_code == 200:
    data = response.json()
    if data["status"] == "OK":
        # 첫 번째 결과 가져오기
        result = data["results"][0]
        formatted_address = result["formatted_address"]
        location = result["geometry"]["location"]
        
        print("주소:", formatted_address)
        print("위도:", location["lat"])
        print("경도:", location["lng"])
    else:
        print(f"Geocoding 실패: {data['status']}")
else:
    print(f"API 요청 실패: {response.status_code}")

 

주소: 대한민국 강원특별자치도 고성군 현내면 통일전망대로
위도: 38.572332
경도: 128.3890568

 

서울 부근 박물관의 위치 정보 추출하기

import os
import requests
import json
from urllib.parse import urlencode
from dotenv import load_dotenv

# .env 파일 로드 (API Key 보안 관리)
load_dotenv()

# Google API Key 설정
GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")

# Google Places API URL
# nearbysearch로 특정 위치와 반경 내의 박물관 정보를 가져옵니다
PLACES_API_URL = "https://maps.googleapis.com/maps/api/place/nearbysearch/json"

def get_museums(location, radius=50000):
    """
    Google Places API를 사용해 특정 위치에서 반경 내의 박물관 정보를 가져옵니다.
    :param location: 중심 위치 (위도, 경도) 문자열 (예: "37.5665,126.9780")
    :param radius: 검색 반경 (미터 단위)
    :return: 박물관 정보 리스트
    """
    params = {
        "key": GOOGLE_API_KEY,
        "location": location,
        "radius": radius,
        "keyword": "박물관",  # '박물관' 키워드로 검색
        "language": "ko"  # 결과를 한국어로 반환
    }
    
    response = requests.get(PLACES_API_URL, params=params)
    
    if response.status_code == 200:
        data = response.json()
        if "results" in data:
            return data["results"]  # 박물관 정보 리스트 반환
        else:
            print("결과가 없습니다.")
            return []
    else:
        print(f"API 요청 실패: {response.status_code}")
        return []

def save_to_geojson(museums, filename="museums.geojson"):
    """
    박물관 데이터를 GeoJSON 형식으로 저장합니다.
    :param museums: 박물관 정보 리스트
    :param filename: 저장할 파일 이름
    """
    features = []
    
    for museum in museums:
        name = museum.get("name")
        location = museum.get("geometry", {}).get("location", {})
        lat = location.get("lat")
        lng = location.get("lng")
        
        if lat is not None and lng is not None:
            features.append({
                "type": "Feature",
                "geometry": {
                    "type": "Point",
                    "coordinates": [lng, lat],
                },
                "properties": {
                    "name": name,
                    "address": museum.get("vicinity"),
                    "rating": museum.get("rating"),
                },
            })
    
    geojson_data = {
        "type": "FeatureCollection",
        "features": features,
    }
    
    with open(filename, "w", encoding="utf-8") as f:
        json.dump(geojson_data, f, ensure_ascii=False, indent=4)

def main():
    # 서울 중심 좌표 (위도, 경도)
    seoul_location = "37.5665,126.9780"
    
    # 반경 50km 내의 박물관 정보 가져오기
    museums = get_museums(seoul_location, radius=50000)
    
    if not museums:
        print("박물관 정보를 가져오지 못했습니다.")
        return
    
    print(f"{len(museums)}개의 박물관 정보를 가져왔습니다.")
    
    # GeoJSON 파일로 저장
    save_to_geojson(museums)
    print("GeoJSON 파일이 생성되었습니다: museums.geojson")

if __name__ == "__main__":
    main()

 

전국 박물관의 위치 정보 추출하기

import os
import requests
import json
import pandas as pd
from urllib.parse import urlencode
from dotenv import load_dotenv

# .env 파일 로드 (API Key 보안 관리)
load_dotenv()

# Google API Key 설정
GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")

# Google Places API URL
PLACES_API_URL = "https://maps.googleapis.com/maps/api/place/nearbysearch/json"

def get_museums(location, radius=50000, keyword="박물관"):
    """
    Google Places API를 사용해 특정 위치에서 반경 내의 박물관 정보를 가져옵니다.
    :param location: 중심 위치 (위도, 경도) 문자열 (예: "37.5665,126.9780")
    :param radius: 검색 반경 (미터 단위)
    :param keyword: 검색 키워드 (예: '박물관')
    :return: 박물관 정보 리스트
    """
    params = {
        "key": GOOGLE_API_KEY,
        "location": location,
        "radius": radius,
        "keyword": keyword,
        "language": "ko"  # 결과를 한국어로 반환
    }
    
    all_results = []
    next_page_token = None

    while True:
        if next_page_token:
            params["pagetoken"] = next_page_token
        
        response = requests.get(PLACES_API_URL, params=params)
        
        if response.status_code == 200:
            data = response.json()
            if "results" in data:
                all_results.extend(data["results"])
            
            # 다음 페이지 토큰이 있는 경우 계속 요청
            next_page_token = data.get("next_page_token")
            if not next_page_token:
                break
            
            # 다음 페이지 요청을 위해 대기 (API 제한)
            import time
            time.sleep(2)
        else:
            print(f"API 요청 실패: {response.status_code}")
            break
    
    return all_results

def save_to_json(data, filename="museums.json"):
    """
    데이터를 JSON 파일로 저장합니다.
    :param data: 저장할 데이터
    :param filename: 저장할 파일 이름
    """
    with open(filename, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=4)

def load_from_json(filename="museums.json"):
    """
    JSON 파일에서 데이터를 로드합니다.
    :param filename: 로드할 파일 이름
    :return: 로드된 데이터
    """
    with open(filename, "r", encoding="utf-8") as f:
        return json.load(f)

def convert_to_dataframe(museums):
    """
    박물관 데이터를 데이터프레임으로 변환합니다.
    :param museums: 박물관 정보 리스트
    :return: pandas DataFrame
    """
    data = []
    
    for museum in museums:
        name = museum.get("name")
        address = museum.get("vicinity")
        rating = museum.get("rating")
        location = museum.get("geometry", {}).get("location", {})
        lat = location.get("lat")
        lng = location.get("lng")
        
        data.append({
            "Name": name,
            "Address": address,
            "Rating": rating,
            "Latitude": lat,
            "Longitude": lng,
        })
    
    return pd.DataFrame(data)

def main():
    # 주요 도시 중심 좌표 설정 (서울, 부산, 대구, 대전 등)
    locations = [
        "37.5665,126.9780",  # 서울
        "35.1796,129.0756",  # 부산
        "35.8714,128.6014",  # 대구
        "36.3504,127.3845",  # 대전
        "37.4563,126.7052",  # 인천
        "35.1595,126.8526",  # 광주
        "33.4996,126.5312"   # 제주도
    ]
    
    all_museums = []
    
    for location in locations:
        print(f"Fetching museums near {location}...")
        museums = get_museums(location)
        all_museums.extend(museums)
    
    print(f"총 {len(all_museums)}개의 박물관 정보를 가져왔습니다.")
    
    # JSON 파일로 저장
    save_to_json(all_museums)
    
    # 데이터프레임으로 변환 및 출력
    df = convert_to_dataframe(all_museums)
    
    print(df.head())  # 데이터프레임의 상위 5개 행 출력
    
    # CSV 파일로 저장 (선택 사항)
    df.to_csv("museums.csv", index=False, encoding="utf-8-sig")
    
if __name__ == "__main__":
    main()