Python - 현재 위치 좌표 알아내기

marco x brown·2020년 2월 23일
1

Better than yesterday

목록 보기
2/3
post-custom-banner

OpenWeatherMap API로 현재 위치의 날씨 데이터를 가져 오려면 위도, 경도 데이터가 필요하다. 예전에 React Native로 날씨 정보 샘플 앱을 만들었을 땐 Expoexpo-location 라이브러리로 쉽게 가져올 수 있었는데, Python에서는 아무리 찾아도 비슷한 라이브러리가 없는 듯 하다.

돌고 돌아 Google Maps의 Geolocation API의 힘을 빌려 시도해보기로 했다.

https://developers.google.com/maps/documentation/geolocation/intro

API 키 발급

API 키를 발급 받기 위해 Google Cloud Platform Console의 문서를 따라 진행한다.
새 프로젝트를 생성해서 진행했다.

  1. Google Cloud Platform에서 사용자 인증 정보

  2. 상단의 사용자 인증 정보 만들기 - API 키

Geolocation API 통신

일단 지금 몹시 당황스럽다. API 키를 URL에 분명히 잘 넣어서 요청을 보냈음에도 불구하고 404 에러가 뜨길래 이것저것 바꿔가며 계속 요청했더니 429 에러가 뜨기 시작했다.

{
  "error": {
    "code": 429,
    "message": "Quota exceeded for quota group 'default' and limit 'Requests per day' of service 'geolocation.googleapis.com' for consumer 'project_number:203791520321'.",
    "errors": [
      {
        "message": "Quota exceeded for quota group 'default' and limit 'Requests per day' of service 'geolocation.googleapis.com' for consumer 'project_number:203791520321'.",
        "domain": "global",
        "reason": "rateLimitExceeded"
      }
    ],
    "status": "RESOURCE_EXHAUSTED"
  }
}

분명 10번? 10번 내외?밖에 하질 않았는데 하루 할당량 초과란다.

뭔가 좀 이상하다.
지난 주 첫 테스트 때는 Requests per 100 seconds로 책정이 되었던 것 같은데, 이번엔 Requests per day로 책정된 것으로 보인다. 아니 근데, 하루에 한도가 1인 게 말이 되나?

대시보드를 조금 더 찾아보다가 우측 상단 메뉴에 선물 상자 아이콘의 무료 평가판 상태 알림이 뜨는 걸 발견했다. 프리 티어를 아예 시작도 안하고 있던 것이었다. 그래서 하루에 하나...

아래처럼 Google Cloud Platform 무료로 사용해 보기를 쉽게 신청한다.

잠시 텀을 두고 대시보드로 다시 들어가면 일당 요청량이 무제한으로 바뀐 것을 확인할 수 있다.

자 이제 성공적으로 결과값을 받아 오고 있다. 소스코드와 결과값은 아래에 있다.
다음엔 Telegram 봇과 어떻게 위치 데이터를 상호작용할지 고민해볼 예정이다.

# location_getter.py

import os
import requests
from dotenv import load_dotenv

load_dotenv(verbose=True)

LOCATION_API_KEY = os.getenv('LOCATION_API_KEY')

url = f'https://www.googleapis.com/geolocation/v1/geolocate?key={LOCATION_API_KEY}'
data = {
    'considerIp': True,
}

result = requests.post(url, data)

print(result.text)
  • considerIp: 위치 정보를 가져오는데에 현재의 IP 주소를 참조할 것인지에 대한 속성이다. IP를 사용하지 않을 거라면 cellTowerswifiAccessPoints 속성을 사용하면 된다.
{
  "location": {
    "lat": 37.4734848,
    "lng": 126.9202944
  },
  "accuracy": 1968
}
  • accuracy: 주어진 예상되는 위치에 대한 정확도(원의 반지름)을 미터 단위로 나타낸다.
profile
개발자로 크는 중
post-custom-banner

7개의 댓글

comment-user-thumbnail
2020년 11월 19일

안녕하세요. api 초보자 입니다. 도움을 제발 받고싶어서 댓글 남깁니다...
위의 코드에 제 키를 넣고 돌려봤는데 404에러가 뜨더라구요. 찾아보니까 cellTowers, wifiAccessPoints 속성 중 1개를 반드시 적어야 한다고 봤는데, 혹시 딱 저 코드만으로 현재 위치 좌표값을 얻으신 건가요...?

3개의 답글
comment-user-thumbnail
2021년 1월 8일

결과물의 lat이랑 lng의 요소의 값을 따로 가져올수는 없나요?

답글 달기