Google Map API 使ってみた

## はじめに

住所から緯度経度変換がしたい！
そうだ、Google Map APIを使おう！

## 使用するAPI

outputFormatとparametersは任意の値

```
https://maps.googleapis.com/maps/api/geocode/outputFormat?parameters
```

https://developers.google.com/maps/documentation/geocoding/overview?hl=ja

### リクエスト

#### outputFormat

jsonかxmlを指定できる

#### parameters（必須）

address（アドレス）とkey（APIキー）
オプションは割愛

### レスポンス

```json
{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "1600",
               "short_name" : "1600",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "Amphitheatre Pkwy",
               "short_name" : "Amphitheatre Pkwy",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Mountain View",
               "short_name" : "Mountain View",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Santa Clara County",
               "short_name" : "Santa Clara County",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "California",
               "short_name" : "CA",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "United States",
               "short_name" : "US",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "94043",
               "short_name" : "94043",
               "types" : [ "postal_code" ]
            }
         ],
         "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",
         "plus_code": {
            "compound_code": "CWC8+W5 Mountain View, California, United States",
            "global_code": "849VCWC8+W5"
         },
         "types" : [ "street_address" ]
      }
   ],
   "status" : "OK"
}
```

#### status

リクエストのステータスが含まれ、APIが機能していない理由を追跡するのに役立つデバッグ情報が含まれる

|status  |意味  |
|---|---|
|OK  |住所は正常に解析され、少なくとも1つのジオコードが返却|
|ZERO_RESULTS|ジオコードは成功したが結果が返却されない（ジオコーダーに存在しない住所が渡された場合に発生することがある|
|OVER_DAILY_LIMIT|APIキーが正しくない、アカウントが使えない、使用量の上限が超えている、お支払い方法が無効になっている|
|OVER_QUERY_LIMIT|割当量が超えている|
|REQUEST_DENIED|リクエストが拒否された|
|INVALID_REQUEST|リクエストパラメータがおかしい|
|UNKNOWN_ERROR|サーバーエラーでリクエストが処理できないかった（再試行すると成功する場合がある）|

ステータスがOK以外の時はerror_messageが返却される場合がある

#### Results

##### types

シカゴの場合、都市を意味する「locality」を返却する
（政治的実体である「political」も返却する）

##### formatted_address

人間が読める住所

##### address_components

適用可能な個別のコンポーネント

|status  |意味  |
|---|---|
|types|コンポーネントのタイプ（[typesの種類](https://developers.google.com/places/web-service/supported_types?hl=ja)）|
|long_name|コンポーネントの全文説明|
|short_name|コンポーネントの略称|

##### postcode_localities

郵便番号に含まれるすべての地域を示す

##### geometry

|status  |意味  |
|---|---|
|location|ジオコーディングされた緯度と経度の値|
|location_type|指定された場所に関する追加データ|
|viewport|返された結果を表示するための推奨ビューポート|
|bounds|返された結果を完全に含むことができる境界ボックス|

##### plus_code

番地の代わりに使用できる

##### partial_match

ジオコーダーが要求された住所の一部と一致することはできたものの、元の要求と完全に一致するものを返さなかったことを示し、スペルミスや不完全な住所の元のリクエストを調べることが推奨されている

##### place_id

Google APIで使用できる一意の識別子

## まとめ

存在しない住所を入力しても部分一致して返してくれたり、判別できなくても200で返却されるので、実際に使う際は返却値によって場合わけが必要そう。