Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

行いたいこと

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

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

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

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


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] => 東京都渋谷区千駄ヶ谷5丁目24
                )

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

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

        )

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

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

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

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

        )

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

            [1] => Array
                (
                    [address] => 東京都墨田区押上1丁目1-2
                )

            [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! YOLP API のコンテンツジオコーダAPI

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

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


{
    "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

$array = array(
  '新国立美術館' => '東京都港区六本木7-22-2',
  '代々木駅' => '東京都渋谷区千駄ヶ谷5丁目24',
  '千駄ヶ谷駅' => '東京都渋谷区千駄ヶ谷1丁目35',
  '東京スカイツリー' => '東京都墨田区押上1丁目1-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);

?>

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


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] => 東京都渋谷区千駄ヶ谷5丁目24
                )

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

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

        )

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

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

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

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

        )

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

            [1] => Array
                (
                    [address] => 東京都墨田区押上1丁目1-2
                )

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

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

        )

)

積み残し

Google Maps v3 API でもやっておく

TakeshiNickOsanai
Developer Relation Manager, Sales Engineer/PreSales, User Community Supporter, CMS Engineer, AWS Certified Solutions Architect
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away