자동으로 액세스 정보를 입력하는 방법

프로더츠 플레이어가 본직서세이 히로시 입니다.

다양한 서비스에 자주 나오는 그 액세스 정보.
먹어 로그 님 등, 음식점의 정보를 표시하는 서비스에도 물론 있는, 언제나 그렇습니다.

먹어 로그 님 의 스쿠쇼

하지만 실제로 수십만 건에 달하는 데이터(이번은 시설이라고 부른다) 모두에 대해 1건 1건 입력해 가는 것은 고양이의 손을 빌려도 일고생입니다.
이번에는 이러한 액세스 데이터를 GoogleAPI를 사용하여 자동으로 생성하는 방법을 소개합니다.

우선은 뭐니 뭐니해도 위도 경도



액세스 정보를 자동으로 생성하는데 있어서 가장 간이 되는 것이, 역 데이터와 시설에의 위도 경도 정보입니다.

위도 경도 정보는 11자리 숫자이므로 RubyOnRails로 말하면 decimal형을 사용합시다.
실수로, float 형을 사용하면 나중에 이상한 액세스 정보가 됩니다.

역 정보 얻기



자동 액세스는 기본적으로는 「어디의 역에서 도보(or차)로 ◯◯분」이라고 하는 정보가 작성됩니다.
따라서 우선 역 데이터가 필요합니다.
역의 데이터는 역 데이터.jp 으로부터 회원등록해, 무료 데이터 다운로드 가능한 범위의 데이터로 정확한 위도 경도 정보를 취득할 수 있습니다.

시설의 위도 경도 정보 삽입



원래 위도 경도 정보가 삽입되어 있는 경우는 문제 없습니다만, 많은 경우 그런 것을 입력시키는 등록 폼은 없습니다.
따라서 주소 → 위도 경도 정보로 변환해야합니다.

이것은 Google의 Google Maps Geocoding API을 사용하여 변환합시다. (이것이 1번 정밀도 좋았다)
{
   "results" : [
      {
....
....
....
         "formatted_address" : "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA",
         "geometry" : {
            "location" : {
               "lat" : 37.4224764,
               "lng" : -122.0842499
            },
            "location_type" : "ROOFTOP",
            "viewport" : {
               "northeast" : {
                  "lat" : 37.4238253802915,
                  "lng" : -122.0829009197085
               },
               "southwest" : {
                  "lat" : 37.4211274197085,
                  "lng" : -122.0855988802915
               }
            }
         },
         "place_id" : "ChIJ2eUgeAK6j4ARbn5u_wAGqWA",
         "types" : [ "street_address" ]
      }
   ],
   "status" : "OK"
}

이런 데이터가 되돌아오므로, 잘 위도 경도의 정보만 빼내 줍니다.

다음으로 시설에서 가까운 역 찾기



ruby에는 geokit-rails 와 gem이 있어, 이 gem에 의해 반경◯◯km의 시설을 취득할 수 있다.
아래와 같은 설정을 해 준다.
  acts_as_mappable(default_units: :kms,
                   default_formula: :sphere,
                   distance_field_name: :distance,
                   lat_column_name: :latitude,
                   lng_column_name: :longitude)

그리고 중요한 것이 대상이 되는 시설을 역으로 취급하는 것이다.
  scope :find_candidate_stations, lambda { |from, num|
    Station.where(id: Station.within(num, origin: from))
      .by_distance(origin: from)
  }
# というようなscopeを使い
# 対象施設(destination)

from = Station.new(lat: destination.lat, lon: destination.lon)
near_stations = find_candidate_stations(from, 10) # 対象施設から半径10kmの駅を取得している

이제 대상 시설에서 반경 10km의 후보가 되는 역을 취득하는 데 성공했을 것이다.

역에서 액세스 정보 얻기



아래 준비가 되었으므로 마침내 액세스 데이터를 가져옵니다.

Google Maps Direction API 을 사용합니다.

https://maps.googleapis.com/maps/api/directions/json?origin={시점 위도 경도}&destination={종점 위도 경도}&mode={walking or driving}&key={API 키}

※ API 키는 여기에서 취득합니다 Google Developer Console

이렇게 얻은 데이터는 json 형식으로 필요한 부분을 빼내면 아래와 같은 부분.
{
....
....
....
   "routes" : [
....
....
....
         "legs" : [
            {
               "distance" : {
                  "text" : "0.4 km",
                  "value" : 425
               },
               "duration" : {
                  "text" : "5分",
                  "value" : 315
               },
               "end_address" : "日本, 〒101-0062 東京都千代田区神田駿河台4丁目 東京復活大聖堂",
               "end_location" : {
                  "lat" : 35.6980715,
                  "lng" : 139.7660134
               },
               "start_address" : "日本, 〒113-0034 東京都文京区湯島1丁目5 外堀通り",
               "start_location" : {
                  "lat" : 35.7006197,
                  "lng" : 139.7639851
               },
....
....
....
}

이 부분을 추출하면

◯◯역에서 도보(or차)로 ☓☓분이라는 액세스 정보가 감성한다.

요약



수만 시설도 손으로 일일이 손으로 입력하는 것은 현실 문제 무리이므로 자동화하지 않으면 할 수 없다.
따라서 이번 Google의 API를 사용한 액세스 정보의 자동 생성 방법에 대해 썼다.

절차를 정리하면
  • 역 데이터 얻기
  • 목적 데이터의 위도 경도 정보 취득
  • 후보가 되는 가장 가까운 역(반경◯◯km의 역) 후보를 취득
  • Google Map Direction API에서 경로 정보 얻기

  • 이다.

    수입으로 수만 건의 액세스 정보를 넣는 것은 어렵습니다.
    「부인, 그렇게 생각하십니까? 그렇지만,····」라고 되돌려 주세요.

    ※다트의 대전 상대·스폰서 모집하고 있습니다. 잘 부탁드립니다!

    좋은 웹페이지 즐겨찾기