住所が含まれた連想配列から緯度経度を取得して、多次元連想配列を生成する

## 行いたいこと

住所と施設名が含まれた連想配列 $array があるとする

```php
$array = array(
  '新国立美術館' => '東京都港区六本木7-22-2',
  '代々木駅' => '東京都渋谷区千駄ヶ谷５丁目２４',
  '千駄ヶ谷駅' => '東京都渋谷区千駄ヶ谷１丁目３５',
  '東京スカイツリー' => '東京都墨田区押上１丁目１－２',
);
```

この連想配列から住所データを取得。地理情報APIを叩き、緯度経度を取得。
最終的に、施設名・住所・緯度・経度がそれぞれまとまった多次元連想配列として $addressDataを生成したい。

多次元連想配列は以下のようにしたい。


```php


Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [name] => 新国立美術館
                )

            [1] => Array
                (
                    [address] => 東京都港区六本木7-22-2
                )

            [2] => Array
                (
                    [latitude] => 35.66518532
                )

            [3] => Array
                (
                    [longitude] => 139.72615925
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [name] => 代々木駅
                )

            [1] => Array
                (
                    [address] => 東京都渋谷区千駄ヶ谷５丁目２４
                )

            [2] => Array
                (
                    [latitude] => 35.68540198
                )

            [3] => Array
                (
                    [longitude] => 139.70221892
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [name] => 千駄ヶ谷駅
                )

            [1] => Array
                (
                    [address] => 東京都渋谷区千駄ヶ谷１丁目３５
                )

            [2] => Array
                (
                    [latitude] => 35.68141652
                )

            [3] => Array
                (
                    [longitude] => 139.71038779
                )

        )

    [3] => Array
        (
            [0] => Array
                (
                    [name] => 東京スカイツリー
                )

            [1] => Array
                (
                    [address] => 東京都墨田区押上１丁目１－２
                )

            [2] => Array
                (
                    [latitude] => 35.71026838
                )

            [3] => Array
                (
                    [longitude] => 139.81215754
                )

        )

)

```

## 方針

1. 配列 をforeachで回し、住所の値 $value を取得
2. $valueをYahoo! YOLP APIで問い合わせる
3. Yahoo! APIから取得したデータを元に、緯度と経度のデータを取得
4. 多次元連想配列 $addressData に順番に格納していく


## Yahoo! YOLP APIとは
* Yahoo! Open Local Platform の略
* Yahoo! Japan デベロッパーネットワークで提供しているAPIの一つ
* 各種地理情報データが取得できる
* 開発者登録を行う必要がある
    * https://developer.yahoo.co.jp/start/
* 緯度経度情報は [コンテンツジオコーダAPI]から取得できる
    * https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/contentsgeocoder.html


## Yahoo! YOLP API のコンテンツジオコーダAPI

* queryに住所を定義して問い合わせると、地理情報の返り値が取得できる。
* エンドポイントは
    * https://map.yahooapis.jp/geocode/cont/V1/contentsGeoCoder

例として、東京スカイツリーの住所である [東京都墨田区押上１丁目1-2] を叩くと、以下のようなレスポンスが取得できる

https://map.yahooapis.jp/geocode/V1/geoCoder?output=json&appid=APIキー&query=東京都墨田区押上１丁目1-2

```json

{
    "ResultInfo": {
        "Count": 1,
        "Total": 1,
        "Start": 1,
        "Status": 200,
        "Description": "",
        "Copyright": "",
        "Latency": 0.138
    },
    "Feature": [
        {
            "Id": "13107.3.1.1.2",
            "Gid": "",
            "Name": "東京都墨田区押上1丁目1-2",
            "Geometry": {
                "Type": "point",
                "Coordinates": "139.81215754,35.71026838",
                "BoundingBox": "139.80856600,35.70832500 139.81863900,35.71281000"
            },
            "Category": [],
            "Description": "",
            "Style": [],
            "Property": {
                "Uid": "e996e94fd30294fdce30ec5d399923b32e41c8ad",
                "CassetteId": "b22fee69b0dcaf2c2fe2d6a27906dafc",
                "Yomi": "トウキョウトスミダクオシアゲ1チョウメ",
                "Country": {
                    "Code": "JP",
                    "Name": "日本"
                },
                "Address": "東京都墨田区押上1丁目1-2",
                "GovernmentCode": "13107",
                "AddressMatchingLevel": "6",
                "AddressType": "地番・戸番"
            }
        }
    ]
}
```

Feature->Geometory->Coordinates
に、緯度と経度情報が含まれている。この値を取得することとする。
Yahoo! YOLP API では、経度->緯度の順番に値が与えられるが、今回は緯度=>経度として取得する。

## 実装

phpで書いてみた

```php
<?php

$array = array(
  '新国立美術館' => '東京都港区六本木7-22-2',
  '代々木駅' => '東京都渋谷区千駄ヶ谷５丁目２４',
  '千駄ヶ谷駅' => '東京都渋谷区千駄ヶ谷１丁目３５',
  '東京スカイツリー' => '東京都墨田区押上１丁目１－２',
);

// カウンター変数 $i を定義

$i = 0;


// 配列を元に、住所の値 $valueを取得
// Yahoo YOLP APIを叩いてJSONを取得する

foreach ($array as $key => $value) {

    $base_url = 'https://map.yahooapis.jp/geocode/V1/geoCoder?output=json&appid=APIキー';
    $param = '&query=' . $value;
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $base_url. $param);
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  

// APIから取得したJSONを$responseに格納

    $response = curl_exec($curl);

// 取得したJSONから、緯度経度の情報を取得して、$geoに配列として格納 

    $response = json_decode($response);
    $Coordinates = $response ->Feature[0]->Geometry->Coordinates;
    $geo = explode(",", $Coordinates); 

// 多次元連想配列 $addressDataに、施設名・住所・緯度・経度を格納していく

    $addressData[$i][] = array('name' => $key);
    $addressData[$i][] = array('address' => $value);
    $addressData[$i][] = array('latitude' => $geo[1]);
    $addressData[$i][] = array('longitude' => $geo[0]);

    curl_close($curl);

// カウンター変数 $i をインクリメント
    
     $i++;

}

// データを確認するため、多次元連想配列 $addressData を表示してみる 

      print_r($addressData);

?>
```

実行結果はこちら。期待通りに多次元連想配列を生成できました。

```php


Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [name] => 新国立美術館
                )

            [1] => Array
                (
                    [address] => 東京都港区六本木7-22-2
                )

            [2] => Array
                (
                    [latitude] => 35.66518532
                )

            [3] => Array
                (
                    [longitude] => 139.72615925
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [name] => 代々木駅
                )

            [1] => Array
                (
                    [address] => 東京都渋谷区千駄ヶ谷５丁目２４
                )

            [2] => Array
                (
                    [latitude] => 35.68540198
                )

            [3] => Array
                (
                    [longitude] => 139.70221892
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [name] => 千駄ヶ谷駅
                )

            [1] => Array
                (
                    [address] => 東京都渋谷区千駄ヶ谷１丁目３５
                )

            [2] => Array
                (
                    [latitude] => 35.68141652
                )

            [3] => Array
                (
                    [longitude] => 139.71038779
                )

        )

    [3] => Array
        (
            [0] => Array
                (
                    [name] => 東京スカイツリー
                )

            [1] => Array
                (
                    [address] => 東京都墨田区押上１丁目１－２
                )

            [2] => Array
                (
                    [latitude] => 35.71026838
                )

            [3] => Array
                (
                    [longitude] => 139.81215754
                )

        )

)

```

## 積み残し

Google Maps v3 API でもやっておく