ジオコーディングと逆ジオコーディングをする方法(Google Geocoding APIの使い方)

ジオコーディングと逆ジオコーディングをする方法(Google Geocoding APIの使い方)

この記事では、ジオコーディング(住所、または地名から位置座標を調べる)と、逆ジオコーディング(位置座標から住所を調べる)の両方ができる、Google Geocoding APIの使い方を説明します。位置情報を扱うウェブサービスでは必須の機能かもしれません。

基本的なルール

Google Geocoding APIを利用する前に、基本的なルールをおさえておきましょう。特にレートリミットや、Google Mapsとセットで使用する必要がある点は重要です。

APIキーが不要

2015年9月現在、APIキーを用意しなくても利用することができます。

レートリミット

下記のレートリミットが定められています。1日あたり2,500回というのは、個人サイトであっても達してしまう可能性が大いにあるので、意識しておきましょう。例えば、「Google Maps上のクリックした場所の住所を取得する」などといったウェブサービスを公開したら、まさに、すぐ達しちゃいますよ〜。

1日あたり2,500
1秒あたり5

Google Mapsとの要連携

Geocoding APIは、Google Mapsの機能を助ける目的で提供されています。そのため、取得したデータは、Google Mapsに反映させる目的でのみ、使用が許可されています。必ず、同ページにGoogle Mapsの地図を表示するようにしましょう。下記は注意書きの引用です。

「裏で何らかのデータベースを作成する」などといった使い方は禁止です。そもそもレートリミットを考えるとその使い方も難しくはありますが…。

The Geocoding API may only be used in conjunction with a Google map; geocoding results without displaying them on a map is prohibited.

Usage Limitsより引用

リクエスト方法

この章では、Google Geocoding APIの具体的な使い方について説明しています。

エンドポイント

GET https://maps.googleapis.com/maps/api/geocode/json

パラメータ

リクエストの際に、必要なパラメータの一覧です。基本的にaddress、またはlatlngを指定する必要がありますが、componentsを指定した場合、両方とも省略することができます。

address
住所、または地名を指定すると、それにマッチする緯度、経度を取得する。
latlng
緯度、経度を指定すると、その時点の住所を取得する。いわゆる逆ジオコーディング。
components
検索結果にフィルターをかけることができる。値は、項目:値で指定し、複数ある場合はパイプライン(|)で区切る。値については、このAPIの返り値で調べることができる。
route … ルートの正式名称、または略称。
locality … locality、またはsublocality。
administrative_area … administrative_areaの全てのレベル。
postal_code … postal_code、または、postal_code_prefix。
country … 国名、または2文字の国コード。
sensor
ユーザーの現在地を利用するプログラムの場合はtrue、違う場合はfalseを指定する。
bounds
南西端と北東端の座標を指定することで、その矩形領域内に検索結果を絞ることができる。ただし、厳密ではない。南西端の緯度経度|北東端の緯度経度というように指定する。
language
言語を指定する。日本ならjp、英語ならen
region
2文字のccTLD(トップレベルドメイン)で地域を指定する。ただし、厳密ではない。

サンプルのリクエスト

1日の制限回数があるため、全てのデモをお見せすることはできないので、リクエストURLのサンプルをいくつか紹介します。URLアドレス欄にコピーし、データを取得してみて下さい。

ジオコーディング

addressプロパティに指定した地名から、位置座標を取得します。

GET https://maps.googleapis.com/maps/api/geocode/json?address=tokyo&sensor=false

逆ジオコーディング

latlngプロパティに指定した位置座標から住所を取得します。1つの座標を指定するだけでも、多くの結果を取得できるのが分かると思います。

GET https://maps.googleapis.com/maps/api/geocode/json?latlng=35.794507,139.790788&sensor=false

componentsを利用する

componentsの国名に日本を指定してリクエストをします。このパラメータを指定時は、必須パラメータを省略できます。

GET https://maps.googleapis.com/maps/api/geocode/json?components=country:jp&sensor=false

矩形領域内で取得

boundsの値を指定し、富山県内をラーメンというキーワードで検索します。

GET https://maps.googleapis.com/maps/api/geocode/json?address=ラーメン&bounds=36.274399,136.768509|36.98262,137.763397&sensor=false

結果を英語で取得

言語を英語に設定します。

GET https://maps.googleapis.com/maps/api/geocode/json?address=tokyo&language=en&sensor=false

取得できるJSON

この章では、APIリクエストに成功した時に取得できるJSONの内容について、説明します。

サンプル

下記は、2件のデータを含むレスポンスのサンプルです。郵便番号から番地までを網羅したformatted_addressの他、都道府県、市区町村などのレベルに区分されたデータ、範囲を示す位置座標など、多くのデータを取得できるのが分かると思います。address_componentsはキーがなく配列形式になっているので、解析処理が少々、面倒くさいかもしれません。typesは、componentsに指定する値の指標となります。

JSON

{
"results" : [
{
   "address_components" : [
{
   "long_name" : "名駅",
   "short_name" : "名駅",
   "types" : [ "sublocality_level_1", "sublocality", "political" ]
},
{
   "long_name" : "中村区",
   "short_name" : "中村区",
   "types" : [ "ward", "locality", "political" ]
},
{
   "long_name" : "名古屋市",
   "short_name" : "名古屋市",
   "types" : [ "locality", "political" ]
},
{
   "long_name" : "愛知県",
   "short_name" : "愛知県",
   "types" : [ "administrative_area_level_1", "political" ]
},
{
   "long_name" : "日本",
   "short_name" : "JP",
   "types" : [ "country", "political" ]
},
{
   "long_name" : "450-0002",
   "short_name" : "450-0002",
   "types" : [ "postal_code" ]
}
   ],
   "formatted_address" : "日本, 〒450-0002 愛知県名古屋市中村区名駅",
   "geometry" : {
"bounds" : {
   "northeast" : {
"lat" : 35.1763749,
"lng" : 136.8928419
   },
   "southwest" : {
"lat" : 35.1675336,
"lng" : 136.8793773
   }
},
"location" : {
   "lat" : 35.1698058,
   "lng" : 136.8886609
},
"location_type" : "APPROXIMATE",
"viewport" : {
   "northeast" : {
"lat" : 35.1763749,
"lng" : 136.8928419
   },
   "southwest" : {
"lat" : 35.1675336,
"lng" : 136.8793773
   }
}
   },
   "partial_match" : true,
   "place_id" : "ChIJiwaO_Nx2A2ARVKyWLu2eiHc",
   "types" : [ "sublocality_level_1", "sublocality", "political" ]
},
{
   "address_components" : [
{
   "long_name" : "駅大通",
   "short_name" : "駅大通",
   "types" : [ "route" ]
},
{
   "long_name" : "千代田町",
   "short_name" : "千代田町",
   "types" : [ "sublocality_level_1", "sublocality", "political" ]
},
{
   "long_name" : "千歳市",
   "short_name" : "千歳市",
   "types" : [ "locality", "political" ]
},
{
   "long_name" : "北海道",
   "short_name" : "北海道",
   "types" : [ "administrative_area_level_1", "political" ]
},
{
   "long_name" : "日本",
   "short_name" : "JP",
   "types" : [ "country", "political" ]
},
{
   "long_name" : "066-0062",
   "short_name" : "066-0062",
   "types" : [ "postal_code" ]
}
   ],
   "formatted_address" : "日本, 〒066-0062 北海道千歳市千代田町 駅大通",
   "geometry" : {
"bounds" : {
   "northeast" : {
"lat" : 42.8277318,
"lng" : 141.6510364
   },
   "southwest" : {
"lat" : 42.8250837,
"lng" : 141.647105
   }
},
"location" : {
   "lat" : 42.8261209,
   "lng" : 141.6486503
},
"location_type" : "GEOMETRIC_CENTER",
"viewport" : {
   "northeast" : {
"lat" : 42.8277567302915,
"lng" : 141.6510364
   },
   "southwest" : {
"lat" : 42.8250587697085,
"lng" : 141.647105
   }
}
   },
   "partial_match" : true,
   "place_id" : "ChIJkXZGAqkgdV8RE__5d1_RK1E",
   "types" : [ "route" ]
}
   ],
   "status" : "OK"
}

各プロパティの説明

取得できるJSONの主な項目の内容です。ジオコーディングをする場合はlocationを、逆ジオコーディングをする場合はformatted_addressの値を取り出せば、最低限の目的を果たすことができます。

types
場所のタイプ。
location
位置座標。
formatted_address
住所。多くの場合、郵便物の宛先として利用できるが、イギリスなど一部の国には対応していない。
address_components
都道府県、市区町村など、様々な区分に分けられた、場所情報が含まれた配列。全てのデータを読み取るには、ループ処理をする必要がある。
viewport
Google Mapsで表示させる時に、見栄えの良い矩形領域の位置座標。
bounds
この場所の純粋な範囲を示す矩形領域の位置座標。

住所コンポーネント

address_componentsに含まれる、各データは、どのような場所であることを示すのか。そのコードの内容は下記の通りです。

street_address
正確な住所。
route
ルート。
intersection
交差点。
political
政治的エンティティ。
country
国政エンティティ。国。
administrative_area_level_1
国レベルの下の第1次行政エンティティ。都道府県。
administrative_area_level_2
国レベルの下の第2次行政エンティティ。市区町村。日本ではこれに該当するものとしないものがあるので、一律にはできない。
administrative_area_level_3
国レベルの下の第3次行政エンティティ。市区町村以下。日本ではこれに該当するものとしないものがあるので、一律にはできない。
colloquial_area
通称。
locality
都市や町などの政治的エンティティ。
sublocality
地域の下の第1次行政エンティティ。
neighborhood
周辺地区。
premise
複合施設など。
subpremise
複合施設の内の1つの建物。
postal_code
郵便番号。
natural_feature
特徴的な地勢。
airport
空港。
park
公園。
point_of_interest
スポット。
post_box
私書箱。
street_number
正確な番地。
floor
階数。
room
部屋。