【Google MapsAPI】GeoCoding API  ~郵便番号で住所を検索する~

# GeoCoding API ~郵便番号で住所を検索する~

## GeoCoding APIとは

GeoCoding APIは主に、住所を渡すと地理座標を返してくれるようなAPIです。
ショップリストで地図上にお店の場所となるマーカーを配置したり、そのお店の位置を地図で表示したりできるのも　これでしょう。

[スタートガイド](https://developers.google.com/maps/documentation/geocoding/start)
[開発者向けドキュメント](https://developers.google.com/maps/documentation/geocoding/intro)


## GeoCoding APIを始めてみる

Geocoding APIを使用して開発を開始するにあたり、下記を設定する必要があります。

- 請求先アカウントを作成（プロジェクトで請求を有効にする必要があります）
- プロジェクトの作成＆Geocoding APIの有効化
- 認証要件（APIキー生成が必要です）

※下記の参考ページから「Get Stated」ボタンで設定を進めます。

【参考】[Get Started with Google Maps Platform](https://developers.google.com/maps/gmp-get-started?hl=ja)


## GeoCoding APIを使ってみる

APIの使用法を確認します。

リクエストの形式は下記のフォーマットで行います。

レスポンスで受け取る形式をJSONかXMLで指定できます。

```
https://maps.googleapis.com/maps/api/geocode/{outputFormat(json or xml)}?{parameters}
```

### Request(parameters)

**今回は日本の郵便番号でリクエストを送り、住所を取得してみましょう。**
下記のパラメータを指定してリクエストを送ります。
また、リクエストを送る際、レスポンス結果をフィルタリングすることもできます。

|           key             |       Value        |
|:-------------------------:|:------------------:|
|address|郵便番号|
|language|日本語|
|components|レスポンス結果をフィルタリングする条件（詳細は[こちら](https://developers.google.com/maps/documentation/geocoding/intro?hl=ja#ComponentFiltering)）|
|key|APIKey|

※リクエストパラメータの詳細は[こちら]
(https://developers.google.com/maps/documentation/geocoding/intro?hl=ja#ComponentFiltering)

```
https://maps.googleapis.com/maps/api/geocode/json?address=1008111&language=ja&components=country:JP&key={YOUR_API_KEY}
```

### Response

レスポンスは下記のようにaddress_components配列の中で分類されて返ってきます。

```json
{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "100-8111",
               "short_name" : "100-8111",
               "types" : [ "postal_code" ]
            },
            {
               "long_name" : "１",
               "short_name" : "１",
               "types" : [ "political", "sublocality", "sublocality_level_4" ]
            },
            {
               "long_name" : "千代田",
               "short_name" : "千代田",
               "types" : [ "political", "sublocality", "sublocality_level_2" ]
            },
            {
               "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" ]
            }
         ],
         "formatted_address" : "日本 〒100-8111",
         "geometry" : {
            "location" : {
               "lat" : 35.6835978,
               "lng" : 139.7541838
            },
            "location_type" : "ROOFTOP",
            "viewport" : {
               "northeast" : {
                  "lat" : 35.6926604,
                  "lng" : 139.7701912
               },
               "southwest" : {
                  "lat" : 35.6745342,
                  "lng" : 139.7381764
               }
            }
         },
         "place_id" : "ChIJaWqAGwuMGGARe50QFyCjp78",
         "types" : [ "postal_code" ]
      }
   ],
   "status" : "OK"
}
```

※レスポンスの詳細は[こちら](https://developers.google.com/maps/documentation/geocoding/intro?hl=ja#GeocodingResponses)

**日本の住所の場合、毎度同じ形式ではないことに注意です！！**

下記4パターンを比較すると。。。
※他にもパターンがあるかもしれません。

例1) 千葉県千葉市中央区春日　の場合

|           key             |       Value        |
|:-------------------------:|:------------------:|
|administrative_area_level_1|千葉県|
|         locality          |千葉市|
|        sublocality        |中央区|
|        sublocality        |春日|

例2) 東京都千代田区千代田１　の場合

|           key             |       Value        |
|:-------------------------:|:------------------:|
|administrative_area_level_1|東京都|
|         locality          |千代田区|
|        sublocality        |千代田|
|        sublocality        |1|

例3) 北海道松前郡松前町　の場合

|           key             |       Value        |
|:-------------------------:|:------------------:|
|administrative_area_level_1|       北海道        |
|administrative_area_level_2|       松前郡        |
|         locality          |       松前町        |


例4) 東京都利島村　の場合

|           key             |       Value        |
|:-------------------------:|:------------------:|
|administrative_area_level_1|       東京都        |
|administrative_area_level_2|       利島村        |


分類の大きさ順に下記のような感じでしょうか。

|           key             |       Value        |
|:-------------------------:|:------------------:|
|administrative_area_level_1|都道府県|
|administrative_area_level_2|郡、村|
|locality|市区町|
|sublocality(sublocality_level_1, sublocality_level_2)|地名等|

レスポンスのパターンを理解して、郵便番号で住所自動入力のフォームを実装できそうですね:thumbsup: