ひろこま Hack Log

プログラミングや機械学習などの知識を記録・共有します

Google mapのPlaces APIで周辺の建物を検索してみた

f:id:twx:20190715172505p:plain
Google Map API

Places APIとは

任意の場所の詳細情報(緯度・経度や名称、住所など)を検索できます。名称のオートコンプリートや、周辺の建物の検索なんかもできたりします。

GoogleMaps — GoogleMaps v0.11.0

Pythonで周辺建物を検索してみた

以下のpythonモジュールを使用しました。

github.com

pipで簡単にインストールできます。

pip install -U googlemaps

ライブラリの使いかはこちらを参考にしました。

hexdocs.pm

周辺の建物を検索するには「Places API Nearby Search」というサービスを使います。 ソースコードは以下。language='ja'と指定しないと、名称がアルファベットで出力されちゃうので注意。

import googlemaps
import pprint

key = 'XXXXXXXXXXXXXXXXXXXX'
client = googlemaps.Client(key)

loc = {'lat': 35.466589, 'lng': 139.612761}

place_result = client.places_nearby(
    location=loc, radius=50, language='ja')
pprint.pprint(place_result)

結果はこんな感じです。(一部省略してあります。)

{'html_attributions': [],
 'next_page_token': 'xxx',
 'results': [{'geometry': {'location': {'lat': 35.4663647, 'lng': 139.6129279},
                           'viewport': {'northeast': {'lat': 35.4677136302915,
                                                      'lng': 139.6142768802915},
                                        'southwest': {'lat': 35.4650156697085,
                                                      'lng': 139.6115789197085}}},
              'icon': 'https://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png',
              'id': 'aeca9886685761003f01d78a4fa4c10491a8be2e',
              'name': '旧東海道',
              'place_id': 'ChIJLbxC5AhcGGARkY38u0Tqeas',
              'reference': 'ChIJLbxC5AhcGGARkY38u0Tqeas',
              'scope': 'GOOGLE',
              'types': ['route'],
              'vicinity': '楠町'},
             {'geometry': {'location': {'lat': 35.4663889, 'lng': 139.6125689},
                           'viewport': {'northeast': {'lat': 35.4677378802915,
                                                      'lng': 139.6139178802915},
                                        'southwest': {'lat': 35.4650399197085,
                                                      'lng': 139.6112199197085}}},
              'icon': 'https://maps.gstatic.com/mapfiles/place_api/icons/generic_business-71.png',
              'id': '0a68a2bc20ac9b5fa4e39de3242f3576acfadae1',
              'name': 'プティ ガール(petit girl)',
              'place_id': 'ChIJ1YKR-ghcGGAROC-fh0ieLPA',
              'plus_code': {'compound_code': 'FJ87+H2 日本、神奈川県 横浜市',
                            'global_code': '8Q7XFJ87+H2'},
              'reference': 'ChIJ1YKR-ghcGGAROC-fh0ieLPA',
              'scope': 'GOOGLE',
              'types': ['point_of_interest', 'establishment'],
              'vicinity': '横浜市西区楠町5−16 横浜コーヨー十番館102'},
             {'geometry': {'location': {'lat': 35.4663939, 'lng': 139.6124014},
                           'viewport': {'northeast': {'lat': 35.46772748029149,
                                                      'lng': 139.6137440802915},
                                        'southwest': {'lat': 35.46502951970849,
                                                      'lng': 139.6110461197085}}},
              'icon': 'https://maps.gstatic.com/mapfiles/place_api/icons/restaurant-71.png',
              'id': '9450d962e044233a02bbbf3e33b84f2032bc7c77',
              'name': '萬進楼',
              'opening_hours': {'open_now': False},
              'photos': [{'height': 1152,
                          'html_attributions': ['<a '
                                                'href="https://maps.google.com/maps/contrib/101751152504650295458/photos">Fukushima '
                                                'Yasuo</a>'],
                          'photo_reference': 'CmRaAAAAPLBsLNUYV1gsUdBd5Mrp0tt93FdXTCU3Omsdp3v0D0KRz_XGIM36VP_rKhz_5VHskert10P8s42_6Of0RW0FoCbrL_z7vOZLbkqq7IWV8G1Klkdmdj9H4o3NYH6d7K2nEhAVJnI4GcINkj3Av-KU0aHXGhTV2Ow5GhCxZVduTKYqURBJkuNRiw',
                          'width': 2048}],
              'place_id': 'ChIJ-9XA9ghcGGARniXT049qEt4',
              'plus_code': {'compound_code': 'FJ86+HX 日本、神奈川県 横浜市',
                            'global_code': '8Q7XFJ86+HX'},
              'rating': 3.8,
              'reference': 'ChIJ-9XA9ghcGGARniXT049qEt4',
              'scope': 'GOOGLE',
              'types': ['restaurant',
                        'food',
                        'point_of_interest',
                        'establishment'],
              'user_ratings_total': 17,
              'vicinity': '横浜市西区楠町17−10'},
             {'geometry': {'location': {'lat': 35.466927, 'lng': 139.612583},
                           'viewport': {'northeast': {'lat': 35.4682594802915,
                                                      'lng': 139.6139772302915},
                                        'southwest': {'lat': 35.4655615197085,
                                                      'lng': 139.6112792697085}}},
              'icon': 'https://maps.gstatic.com/mapfiles/place_api/icons/shopping-71.png',
              'id': 'f4730a3b53b3660d0b8f82e4bbba7d7fff7c67a7',
              'name': 'ポーラ化粧品横浜西口営業支店',
              'place_id': 'ChIJh-Hv8ghcGGARPMI8OPmzhqs',
              'plus_code': {'compound_code': 'FJ87+Q2 日本、神奈川県 横浜市',
                            'global_code': '8Q7XFJ87+Q2'},
              'reference': 'ChIJh-Hv8ghcGGARPMI8OPmzhqs',
              'scope': 'GOOGLE',
              'types': ['store', 'point_of_interest', 'establishment'],
              'vicinity': '横浜市西区楠町17−4'},
             {'geometry': {'location': {'lat': 35.4668692, 'lng': 139.6130542},
                           'viewport': {'northeast': {'lat': 35.46826093029149,
                                                      'lng': 139.6144353802915},
                                        'southwest': {'lat': 35.46556296970849,
                                                      'lng': 139.6117374197085}}},
              'icon': 'https://maps.gstatic.com/mapfiles/place_api/icons/generic_business-71.png',
              'id': '85b3712965a3932404e956d0a4c4c5bb249188d3',
              'name': '横浜南幸駐輪場',
              'opening_hours': {'open_now': True},
              'photos': [{'height': 2448,
                          'html_attributions': ['<a '
                                                'href="https://maps.google.com/maps/contrib/108784195876784182303/photos">バーン</a>'],
                          'photo_reference': 'CmRaAAAAY46xCh0SOBHzMYQ1GD4grsNIsmSKe71qv79k48letMiGNSxNIbrMH6u0D14gGx97TenmqHKmz7FKCZdhrcqocznPvyNRzI5uoBRaRocrXTwJB0CYN8t-9LjKCG1z4iMiEhCGCi9iMhYBA-UnziVcuV1CGhSbrtiulRgcg4xpKyI_Nu0GFX5Q2A',
                          'width': 3264}],
              'place_id': 'ChIJWXOlTMddGGARfAKOfka3cIE',
              'plus_code': {'compound_code': 'FJ87+P6 日本、神奈川県 横浜市',
                            'global_code': '8Q7XFJ87+P6'},
              'reference': 'ChIJWXOlTMddGGARfAKOfka3cIE',
              'scope': 'GOOGLE',
              'types': ['parking', 'point_of_interest', 'establishment'],
              'vicinity': '横浜市西区南幸2丁目12−1'},
        ...省略...],
 'status': 'OK'}

駐輪場の情報も抽出できており、かなり細かいレベルまで検索できていることがわかります。

価格は?

2019年7月15日現在、以下のページで価格が定義されています。Places - Nearby Searchは、5000リクエストまでなら無料のようです。

cloud.google.com

検索エリアの半径を変えると?

上のコードでは半径50メートルの円の中を検索していました。その結果、駐車場などのかなりマイナーな情報まで得られました。しかし、半径を5000メートルのように大きくしてみるとホテルやショッピングモールといった有名な建物しか得られなくなります。

これについてGoogleサポートに問い合わせたところ、これはバグではなくGoogle API側の「意図した挙動」であると回答をいただきました。半径5000メートル内のマイナーな建物を検索するには、ちょっと工夫が要りそうです。

半径ってどうやって測ってるの?

半径の定義もGoogleサポートに問い合わせてみました。すると、半径rとしたとき、メルカトル図法上で半径rの円を描き、その円の中に存在する場所情報を、ある程度有名なものに絞って返しているそうです。「正射影図法じゃなくてメルカトル図法なんですか?」って聞き直したら、「そうです」とのこと。へーーー勉強になりました。

本日は、Google mapのPlaces APIで周辺の建物を検索する方法をご紹介しました。良い記事だと思っていただいた方は、以下の「★+」ボタンのクリック、SNSでのシェア、「読者になる」ボタンのクリックをお願いします。

Koma Hirokazu 's Hacklog ―― Copyright © 2018 Koma Hirokazu