251015 [ Day 66 ] - Project (20)

TaeHyun·2025년 10월 15일

TIL

목록 보기
78/184

시작하며

오늘은 프로젝트 중간 점검을 받고, 기간이 아직 남았으니 기능 하나 정도만 더 추가해 보라는 피드백을 받았다. 그래서 팀원들과 어떤 기능이 추가되면 좋을지 회의를 하다가, 재활용품과 재생에너지의 연관성을 설명하기 위해 사용자가 이미지를 추가해 분류하면 해당 클래스의 재활용품이 어떤 과정을 거쳐 재생에너지에 도움이 되는지를 시각적으로 알 수 있도록 지도에 표시해 보기로 했다.

Reverse Geocoding

사용자에게서 HTML5 Geolocation으로 현재 위치를 받고, 그 좌표를 네이버 클라우드 플랫폼 Maps API를 통해 구와 동으로 변환하여 지도에 표기했다. 이후 클래스별 재활용품이 재생에너지가 되기까지의 경로를 미리 지정해 두고, 사용자의 현재 위치와 해당 경로를 선으로 연결하여 시각적으로 파악할 수 있게 해주는 기능을 구상하고 시작했다.

# 역지오코딩 API 라우터
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
import os
import requests

router = APIRouter(tags=["geocoding"])

# 환경 변수에서 네이버 API 키 가져오기
NAVER_CLIENT_ID = os.getenv("NAVER_CLIENT_ID", "")
NAVER_CLIENT_SECRET = os.getenv("NAVER_CLIENT_SECRET", "")

# 요청 모델
class ReverseGeocodeRequest(BaseModel):
    lat: float
    lng: float

# 역지오코딩 API
@router.post("/api/geocode/reverse")
async def reverse_geocode(data: ReverseGeocodeRequest):
    """
    네이버 역지오코딩 API를 프록시하여 좌표를 주소로 변환

    요청 예시:
    {
        "lat": 37.5665,
        "lng": 126.9780
    }

    응답 예시:
    {
        "address": "서울특별시 중구 태평로1가",
        "gu": "중구",
        "dong": "태평로1가"
    }
    """
    try:
        # 네이버 역지오코딩 API 호출
        url = f"https://maps.apigw.ntruss.com/map-reversegeocode/v2/gc?coords={data.lng},{data.lat}&output=json&orders=addr"

        headers = {
            "x-ncp-apigw-api-key-id": NAVER_CLIENT_ID,
            "x-ncp-apigw-api-key": NAVER_CLIENT_SECRET
        }

        print(f"[DEBUG] 네이버 API 호출: {url}")
        print(f"[DEBUG] 헤더: {headers}")

        response = requests.get(url, headers=headers, timeout=10)

        print(f"[DEBUG] 응답 상태: {response.status_code}")
        print(f"[DEBUG] 응답 내용: {response.text}")

        if response.status_code != 200:
            raise HTTPException(status_code=response.status_code, detail=f"네이버 API 오류: {response.text}")

        result = response.json()

        if result.get("results") and len(result["results"]) > 0:
            region = result["results"][0]["region"]

            return {
                "address": f"{region['area1']['name']} {region['area2']['name']} {region['area3']['name']}",
                "gu": region["area2"]["name"],
                "dong": region["area3"]["name"]
            }

        raise HTTPException(status_code=404, detail="주소를 찾을 수 없습니다.")

    except requests.exceptions.RequestException as e:
        raise HTTPException(status_code=500, detail=f"API 호출 오류: {str(e)}")

마치며

오늘은 재활용품이 재생에너지가 되는 정확한 과정을 조사하기 이전이라 임시로 지점을 정해 지도에 표시해 보았는데, 꽤 괜찮아서 잘 추가한 기능인 것 같다.

profile
Hello I'm TaeHyunAn, Currently Studying Data Analysis

0개의 댓글