2. Datasets : 지역별 주유소 위치 정보 및 가격 정보 데이터셋과 사용자의 현재 위치 받기

1. 유가정보 API 신청

우리팀은 지역별 주유소 위치 정보 및 가격 정보를 제공하기 위해 오피넷(Opinet)유가정보 API를 활용하였다. 오피넷이란 한국석유공사에서 운영중인 유가 정보 사이트로, 석유사업자가 보고한 자료를 토대로 전국 주유소와 자동차충전소의 현재 판매 가격과 정유사, 대리점의 평균 공급가격 등 다양한 유가 정보를 제공하고 있다.

오피넷에서 제공하는 유가정보 API 리스트를 보면 주유소 전국 평균가격(현재)부터 전국/지역별 최저가 주유소(Top 20)까지 있는 것을 확인할 수 있는데, 우리는 그 중에서 특정한 위치에서 지정된 거리 내에 있는 주유소의 유가정보가 필요하므로 아래의 반경 내 주유소 API만을 사용했다. 해당 API를 사용하면 검색할 반경(radius)을 원하는대로 설정이 가능하고, 제품(prodcd)과 정렬방식(sort)도 선택이 가능하다.

2. 사용자의 현재 위치 받기

유가 정보 API를 사용하기 전, 서비스의 편리한 사용을 위해 우리는 사용자의 위치 정보를 Google Geolocation API로 받아오고자 했다. 사용자가 "최저가 주유소 찾아줘" 했을 때, 스피커로 하여금 "어디 사시는데요?'라고 되묻지 않게 말이다. Google Geolocation API는 사용자의 기지국 및 WiFi 노드에 대한 정보를 기반으로 위치 및 정확도 반경을 반환한다. 우리는 Google Geolocation API를 이용해서 사용자의 Ip주소를 통해 현위치의 위도, 경도값을 받아 사용하기로 했다.

def location(): #find users location
    url = 'https://www.googleapis.com/geolocation/v1/geolocate?key=AIzaSyDkx6muQn1Jz-y6hLOcTPVdYAhklm6WJQo'
    data = {
        'considerIp': True,
        #'homeMobileCountryCode': 450,
        #'homeMobileNetworkCode': 5,
        #'radioType':'gsm',
        #'carrier': "SKTelecom",
        #"wifiAccessPoints":[{'macAddress':'40:DC:9D:06:EC:CA'}]
    }
    result = requests.post(url, data)
    a=result.json()
    lat=a['location']['lat'] # Y point
    lng=a['location']['lng'] # X point
    return lat,lng

Google Geolocation API를 불러오는 데에는 성공했지만, 오피넷과 Geolocation에서 요구하는 위도랑 경도값 측정 단위가 서로 달랐다. 오피넷은 kotec이라는 기준으로 측정한 값이고, Geolocation은 wgs84라는 기준으로 측정한 값이었다. 따라서 우리는 wgs84에서 kotec(=tm128)으로 변환하는 과정을 함수로 만들어주었다. 함수의 내용은 링크을 참고했다.

WGS84 형식에서 오피넷의 TM128 형식으로 변환하기

우리는 좌표 변환에 관련된 함수를 포함하고있는 Pyproj 패키지를 이용했다. parameter로 받은 WGS84형식의 lat,lng 값을 TM128형식으로 변환하여 x_point, y_point 변수에 담아 반환한 것이다. 자세한 코드 설명은 다음 포스팅에서 계속된다.

def trans(lat,lng): #wgs84 -> tm128
    WGS84 = { 'proj':'latlong', 'datum':'WGS84', 'ellps':'WGS84', }

    TM128 = { 'proj':'tmerc', 'lat_0':'38N', 'lon_0':'128E', 'ellps':'bessel',
   'x_0':'400000', 'y_0':'600000', 'k':'0.9999',
   'towgs84':'-146.43,507.89,681.46'}

    def wgs84_to_tm128(longitude, latitude):
       return transform( Proj(**WGS84), Proj(**TM128), longitude, latitude )
            
    x_point,y_point=wgs84_to_tm128(lng,lat)
    return x_point,y_point

3. 유가정보 API 요청

사용자의 위치정보를 알고 난 후에는 그에 맞는 주유소 상호와 판매 가격을 유가 정보 API에서 불러왔다. 우리팀은 browse 함수를 통해 불러 왔으며 우리가 사용하고자하는 Element는 다음과 같았다

  • OS_NM : 주유소 상호
  • PRICE : 판매 가격
def ask_oil_type(ans):
    if ans == "경유" :
        return "D047"
    elif ans == "휘발유" : 
        return "B027"
    else :
        return None
def browse(x_point,y_point,oil_type):
    url = 'http://www.opinet.co.kr/api/aroundAll.do'
    payload = {
        "code" : 'key값', // 인증키 값은 오피넷에 메일을 보내 받을 수 있음
        "out" : "json",
        "x" : x_point,
        "y" : y_point,
        "radius" : "5000",
        "prodcd" : oil_type ,
        "sort" : "1"
        }
    result = requests.get(url,params=payload).json()
    return result

좌표 변환 후 뽑아낸 유가정보 API 속 주유소 상호와 가격은 아래와 같다.

좋은 웹페이지 즐겨찾기