行いたいこと
住所と施設名が含まれた連想配列 $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
)
)
)
方針
- 配列 をforeachで回し、住所の値 $value を取得
- $valueをYahoo! YOLP APIで問い合わせる
- Yahoo! APIから取得したデータを元に、緯度と経度のデータを取得
- 多次元連想配列 $addressData に順番に格納していく
Yahoo! YOLP APIとは
- Yahoo! Open Local Platform の略
- Yahoo! Japan デベロッパーネットワークで提供しているAPIの一つ
- 各種地理情報データが取得できる
- 開発者登録を行う必要がある
- 緯度経度情報は [コンテンツジオコーダAPI]から取得できる
Yahoo! YOLP API のコンテンツジオコーダ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 でもやっておく