0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

この記事は、Qiita Engineer Festa 2024 3個目の記事です。
以下の記事より、すべての記事をご覧になれます。

本題

さて、急にぶっ飛んだ話題が来ましたね。今回は学校の都合でPlaces APIを利用して場所の検索をしなければならなくなりました。とりあえず、以下参考にした記事を掲載させていただきます。

以下、コードを貼り付けておきますので、必要に応じて使い分けてください。

main.py
import requests
import json
import time
import pandas as pd

GOOGLE_MAP_KEY = "" #Insert your API key.
FILTER_SEARCH_RADIUS = "40000" #Meter unit
FILTER_SEARCH_CENTER = "34.372798,135.302189"
FILTER_SEARCH_KEYWORD = ""

GET_URL = "https://maps.googleapis.com/maps/api/place/nearbysearch/json"

def getInfo(page_token):
    GET_PARAMS = {
        "key":GOOGLE_MAP_KEY,
        "location":FILTER_SEARCH_CENTER,
        "radius":FILTER_SEARCH_RADIUS,
        "keyword":FILTER_SEARCH_KEYWORD,
    }
    if(page_token != None):
        GET_PARAMS["pagetoken"] = page_token
    return requests.get(GET_URL, params=GET_PARAMS).json()
    
NEXT_PAGE_TOKEN = ""

SEARCH_RESULT = []

try:
    for i in range(100):
        if(i == 0):
            print("Start to get information from Google...")
            req = getInfo(None)
        else:
            req = getInfo(NEXT_PAGE_TOKEN)
        SEARCH_RESULT.extend(req["results"])
        time.sleep(5)
        NEXT_PAGE_TOKEN = req["next_page_token"]
except:
    print("Finished to get!")

pd.json_normalize(SEARCH_RESULT).to_csv(f'out{MODE}.csv', encoding='utf-16')

以下、若干の説明を加えておきます。

一回のリクエストで請求できる情報は20件まで

Places APIに一回Getリクエストを送ると、Resultsには20件しか入っていませんでした。しかし、絶対に20件以上の検索結果が出てきます。どうしたらいいのでしょうか?

ここで解決してくれるのが、next_page_tokenです。これを次のリクエストのpagetokenに指定することで、21件目以降の検索結果を表示することができます。

しかし、ここで問題が出てきます。それは、「検索結果の総計がわからないと何回このリクエストを実施したらいいかわからない」ということです。ここで、next_page_tokenに関する重要な情報として、追加の検索結果がない場合はそもそもnext_page_tokenがありません。したがって、僕は今回途方もない大きな数を指定して、next_page_tokenを取り出し次のリクエストをするというループにtry-exceptを設置して、next_page_tokenがない時にエラーを吐いてtry-exceptを終えるというプログラムを組んでいます。

CSVで保存する

今回は最終的にQGISで緯度経度を利用する必要があるので、CSVで保存した。Pythonの実行ファイルと同じフォルダに作成させた。ただし、一回の操作で全ての情報を一個のCSVに保存しておきたいので、あらかじめCSVにデータを作成する前に一つの配列に全てのデータを入れておくことにした。

test.py
#配列に追加
SEARCH_RESULT.extend(req["results"])

#CSVに変換
pd.json_normalize(SEARCH_RESULT).to_csv(f'out{MODE}.csv', encoding='utf-16')

ここで大事なのが、CSVをMacのExcelで扱うときに文字のエンコードがUTF-16でないと文字化けしますので、エンコードをUTF-16に指定しておきました。

最後に

今回も久しぶりの記事で、なおかつちょっと珍しい話題でした。次からは現実逃避でちょっとエミュレーターで遊んでいきたいと思います。こそれでは今後もエンジニアフェスタの記事をお楽しみにしてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?