Edited at

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

More than 1 year has 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 でもやっておく