見出し画像

Google Map APIを使って自宅から近い順に大学を探す

準備の記事はこちら

【前提条件】
・準備の記事のようにGoogle Maps APIを使えるようにする

【やりたいこと】
・進路検討の材料として、自宅から通える範囲なのか違うのかを知りたい
・距離、所要時間に基づいた大学一覧を作りたい

【事前準備】
・文部科学省のWebサイトに学校コードと共に全国の大学、短期大学、高等専門学校の一覧が提供されています(エクセル形式、CSV形式)。CSV形式のファイルをダウンロードする。保存先はPythonコードと同じディレクトリにするのが楽です(ファイルの場所指定が不要なため)。
・ダウンロードしたファイルをそのまま使っても良いし、学校コードから特定の条件を満たす学校だけをMAP検索しても良い。今回は、特定の都道府県の学校だけを検索できれば良いので、ダウンロードしたCSVファイルから、特定の都道府県を最初から抜き出しておく。上から3,4桁目が県コードになっているので、これを見て不要な都道府県をテキストエディタで削除した。
・ダウンロードしたCSVファイルを開き、どのような項目名(列名)のデータがあるか確認する。自分が使いたい列名が何か、を確認する。

【考慮すべき点】
・Google Maps APIで経路検索をすると、何故か適切な結果が得られず コンソールに"IndexError"が出るケースがありました。APIで request しているURLを直接、ブラウザに手入力すると適切にjson形式の結果が得られるにも関わらず。Pythonから request すると特定の学校でエラーとなる。原因の切り分けができなかったので、例外処理を入れました。

【作ったもの】

import requests
import json
from pprint import pprint
import pandas as pd

df = pd.read_csv("univ_list1.csv")
print("件数=", len(df))

univ_list = df["学校名"]
filename = "univ_result.csv"

for univ_name in univ_list:
    url = "https://maps.googleapis.com/maps/api/directions/json?origin=自宅の住所&destination={univ}&mode=DRIVING&key=自分のAPIキー"
    url = url.format(univ=univ_name)

    jsondata = requests.get(url).json()
    try:
#       print("大学名=", univ_name)
#       print("距離=", jsondata["routes"][0]["legs"][0]["distance"]["text"])
#       print("時間=", jsondata["routes"][0]["legs"][0]["duration"]["text"])
        with open(filename, mode="a"as f:
            print("," + ",".join((univ_name,jsondata["routes"][0]["legs"][0]["distance"]["text"],jsondata["routes"][0]["legs"][0]["duration"]["text"])), file=f)
        
    except IndexError:
        with open(filename, mode="a"as f:
            print("," + ",".join((univ_name,"Error","Error")), file=f)
            

【ざっくり解説】
・1〜4行目:必要なライブラリを読み込む
・5行目:事前準備に書いた CSVファイルを"univ_list1.csv"としてパソコンに保存。CSVファイルを読み込んで DataFrame を作る。
・6行目:動作上は不要な行。実行されたことを目視確認したいので全体の件数のみコンソールに表示する。
・7行目:5行目で作った DataFrame のうち、"学校名"の列だけ抜き出して学校名一覧の変数 univ_list に入れる。事前準備で確認した列名が"学校名"だった。
・8行目:Google Map 検索結果を書き込むファイル名に univ_result.csv と指定。
・9行目:変数 univ_list にある大学名を順番に変数 univ_name に入れて10行目以降を繰り返す。繰り返し処理は univ_list が最後まで辿り着いたら終了。
・10行目:変数 url にアクセスする Google Maps API の URL を入れる。この URL は準備の記事参照。出発地( origin )には自宅の住所を入力。目的地( destination )は変数 univ を参照、ここの文字列を変更して繰り返し処理。key は準備の記事参照。
・11行目:url の書式を指定して URL を入れる。10行目の {univ}の部分を univ_name に入っている文字列に置き換えて url とする。
・12行目:Google Maps API の結果を json 形式で取得し、jsondata に入れる。json 形式のデータは準備の記事参照。
・13行目:繰り返し処理( for 文)中にエラーが発生した場合に備えて例外処理を設定する。try では、正常時の処理を指定する。
・14〜16行目:動作確認中はコンソールに検索結果を表示していた名残。#をつけることでプログラム上、コメント文(=実行しない)としている。
・17行目:8行目で指定した検索結果を書き込むファイルを追記モードで開く。
・18行目:検索結果を用いて、「,大学名,距離,所要時間」を書き込む
・19行目:エラーが発生した際の例外処理を指定する。ここでは IndexError が発生した場合の例外処理を定義している。
・20-21行目:8行目で指定した検索結果を書き込むファイルを追記モードで開き、「,大学名,Error,Error」と書き込む。

【実行結果1】
 この結果、無事に指定した都道府県の学校への距離と所要時間の一覧が出来ました。ただし、今回 json 形式の結果をそのままCSVファイルに書き込んだので、文字列で書き込まれています。すると、距離順に並べようと思っても、10kmの方が2kmより上に並んでしまいます。(文字の順番なので)
 楽に距離順に並べ変えたいので、ひと工夫します。

検索結果の距離、所要時間が文字列で書き込まれている

【ひと工夫】
 Python Code 上で並び替えても良いのですが、並び替えなどは表計算ソフトで行う方が楽と思いました。そこで、距離を文字列から数値にします。
 try で指定する正常時の処理において、距離について以下のように修正しました。
.replace("km","") を用いて "km" を ""(無)に置き換える
これにより、距離が数値になりました。(int型, float型など指定した方が正しいでしょうが、うまくいったので今回はこれでヨシとしました。欲しい結果が得られれば良い、と気楽に考えました。

    try:
        print("大学名=", univ_name)
        km = jsondata["routes"][0]["legs"][0]["distance"]["text"].replace("km","")
        with open(filename, mode="a"as f:
            print("," + ",".join((univ_name,km,jsondata["routes"][0]["legs"][0]["duration"]["text"])), file=f)

【実行結果2】

距離が数値になり近い順に並べ替えができるようになった

【今後の展開】
 CSVファイルを表計算ソフトで開きます。あとは、表計算ソフトの機能を使って、自宅から近い順に学校を並べた一覧を作成することが出来ました。
 今後の展開として、並べた学校に付随する情報を追記することが考えられます。学校サイトURLや偏差値情報など。
 でも、志望する学部により偏差値は変動するでしょうし、学科も多数ある。最近の受験事情は複雑です。なので、そこまでの必要性を感じなくなってきました。

いいなと思ったら応援しよう!