目次
サンプル・プログラム:実行例

サンプル・プログラム
searchOutlet.php | サンプル・プログラム本体 |
pahooGeoCode.php | 住所・緯度・経度に関わるクラス pahooGeoCode。 使い方は「PHPで住所・ランドマークから最寄り駅を求める」などを参照。include_path が通ったディレクトリに配置すること。 |
サンプル・プログラムの流れ

準備:pahooGeoCode クラス
0037: class pahooGeoCode {
0038: var $items; //検索結果格納用
0039: var $error; //エラーフラグ
0040: var $hits; //検索ヒット件数
0041: var $webapi; //直前に呼び出したWebAPI URL
0042:
0043: //Google Cloud Platform APIキー
0044: //https://cloud.google.com/maps-platform/
0045: //※Google Maps APIを利用しないのなら登録不要
0046: var $GOOGLE_API_KEY_1 = '**************************'; //HTTPリファラ用
0047: var $GOOGLE_API_KEY_2 = '**************************'; //IP制限用
0048:
0049: //Yahoo! JAPAN Webサービス アプリケーションID
0050: //https://e.developer.yahoo.co.jp/register
0051: //※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
0052: var $YAHOO_APPLICATION_ID = '*****************************';
クラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

地図としてGoogleマップを利用するのであれば、Google Cloud Platform APIキー が必要で、その入手方法は「Google Cloud Platform - WebAPIの登録方法」を、YOLPマップを利用するのであれば、Yahoo! JAPAN Webサービス アプリケーションIDが必要で、その入手方法は「Yahoo!JAPAN デベロッパーネットワーク - WebAPIの登録方法」を、それぞれ参照されたい。
準備:地図サービス(WebAPI)の選択
0038: //地図描画サービスの選択
0039: // 0:Google
0040: // 2:地理院地図・OSM
0041: define('MAPSERVICE', 2);
0042:
0043: //住所検索サービスの選択
0044: // 0:Google
0045: // 1:Yahoo!JAPAN
0046: // 11:HeartRails Geo API
0047: // 12:OSM Nominatim Search API
0048: define('GEOSERVICE', 11);
0049:
0050: //逆ジオコーディングサービスの選択
0051: // 0:Google
0052: // 1:Yahoo!JAPAN
0053: // 11:HeartRails Geo API
0054: // 21:簡易ジオコーディングサービス
0055: define('REVGEOSERVICE', 0);
住所検索サービスは、Google、Yahoo!JAPAN、HeartRails Geo API、OSM Nominatim Search API から選べる。あらかじめ、定数 GEOSERVICE に値を設定すること。
逆ジオコーディングサービスは、Google、Yahoo!JAPAN、HeartRails Geo API、簡易ジオコーディングサービスから選べる。あらかじめ、定数 REVGEOSERVICE に値を設定すること。

モバイラーズオアシス 電源情報API
URL |
---|
https://oasis.mogya.com/api/v1/spots.json |
フィールド名 | 要否 | 内 容 |
---|---|---|
n | 必須 | 検索範囲の北端の緯度(世界測地系) |
s | 必須 | 検索範囲の南端の緯度(世界測地系) |
e | 必須 | 検索範囲の東端の経度(世界測地系) |
w | 必須 | 検索範囲の西端の経度(世界測地系) |
lat | 任意 | 検索中心の緯度(世界測地系) |
lng | 任意 | 検索中心の経度(世界測地系) |
解説:電源情報検索
0206: /**
0207: * モバイラーズオアシス 電源情報APIのURLを取得する
0208: * @param double $n, $w北西端の緯度・経度(世界測地系)
0209: * @param double $s, $e南東端の緯度・経度(世界測地系)
0210: * @return string URL 電源情報APIのURL
0211: */
0212: function getURL_searchOutletV1($n, $w, $s, $e) {
0213: return "https://oasis.mogya.com/api/v1/spots.json?n={$n}&w={$w}&s={$s}&e={$e}";
0214: }
0216: /**
0217: * モバイラーズオアシス電源情報APIを利用して指定座標の近くにある店舗を検索
0218: * @param double $latitude 緯度(世界測地系)
0219: * @param double $longitude 経度(世界測地系)
0220: * @param double $distance 範囲(メートル)
0221: * @param array $items 情報を格納する配列
0222: * @param object $pgc pahooGeoCodeクラス
0223: * @return array(ヒットした施設数, メッセージ, APIのURL)
0224: */
0225: function searchOutlet($latitude, $longitude, $distance, &$items, $pgc) {
0226: if (isphp5over() == FALSE) return FALSE;
0227:
0228: list($n, $w) = $pgc->getPointDistance($longitude, $latitude, $distance, 0 - $distance);
0229: list($s, $e) = $pgc->getPointDistance($longitude, $latitude, 0 - $distance, $distance);
0230:
0231: $url = getURL_searchOutletV1($n, $w, $s, $e);
0232: $json = @file_get_contents($url);
0233:
0234: if ($json == FALSE) {
0235: $message = 'モバイラーズオアシス電源情報APIが停止';
0236: } else {
0237: $obj = json_decode($json);
0238: $flag = FALSE;
0239: switch ($obj->status) {
0240: case 'ZERO_RESULTS':
0241: $message = '指定範囲に電源がない';
0242: break;
0243: case 'TOO_MUCH_SPOTS':
0244: $message = '検索結果が多すぎる.範囲を絞り込んでください';
0245: break;
0246: case 'INVALID_REQUEST':
0247: $message = 'モバイラーズオアシス電源情報API呼び出し不正';
0248: break;
0249: default:
0250: $message = '';
0251: $flag = TRUE;
0252: break;
0253: }
0254: if ($flag) {
0255: $message = '指定範囲に電源はない';
0256: $i = 1;
0257: foreach ($obj->results as $key=>$val) {
0258: $items[$i]['id'] = num2alpha($i);
0259: $items[$i]['title'] = htmlspecialchars($val->title, ENT_QUOTES);
0260: $items[$i]['address'] = htmlspecialchars($val->address, ENT_QUOTES);
0261: $items[$i]['latitude'] = $val->latitude;
0262: $items[$i]['longitude'] = $val->longitude;
0263: $items[$i]['url'] = isset($val->url) ? $val->url : '';
0264: $items[$i]['mo_url'] = isset($val->mo_url) ? $val->mo_url : '';
0265: //充電情報
0266: $items[$i]['charge'] = '';
0267: if (isset($val->tags)) {
0268: foreach ($val->tags as $key=>$item) {
0269: if (isset($item->name) && preg_match('/用途\:充電/iu', $item->name)) {
0270: $items[$i]['charge'] = '可能';
0271: }
0272: }
0273: }
0274: //電源情報
0275: $items[$i]['powersupply'] = '';
0276: if (isset($val->tags)) {
0277: $key = 0;
0278: foreach ($val->tags as $item) {
0279: if (isset($item->name) && preg_match('/電源\:/iu', $item->name)) {
0280: $str = ($key > 0) ? ', ' : '';
0281: $str .= preg_replace('/電源\:/iu', '', $item->name);
0282: $items[$i]['powersupply'] .= $str;
0283: $key++;
0284: }
0285: }
0286: }
0287: //Wi-Fi情報
0288: $items[$i]['wireless'] = '';
0289: if (isset($val->wireless)) {
0290: $key = 0;
0291: foreach ($val->wireless as $item) {
0292: if (isset($item->name)) {
0293: $str = ($key > 0) ? ', ' : '';
0294: $str .= preg_replace('/用途\:/iu', '', $item->name);
0295: $items[$i]['wireless'] .= $str;
0296: $key++;
0297: }
0298: }
0299: }
0300: $site = ($items[$i]['url'] == '') ? '' : "<a href=\"{$items[$i]['url']}\" target=\"_blank\">⇒公式サイト</a><br />";
0301: $charge = ($items[$i]['charge'] == '') ? 'なし' : $items[$i]['charge'];
0302: $power = ($items[$i]['powersupply'] == '') ? 'なし' : $items[$i]['powersupply'];
0303: $wifi = ($items[$i]['wireless'] == '') ? 'なし' : $items[$i]['wireless'];
0304: $items[$i]['description'] =<<< EOT
0305: <span class="small"><a href="{$items[$i]['url']}" target="_blank">{$items[$i]['title']}</a><br />{$site}住所:{$items[$i]['address']}<br />充電:{$charge}<br />電源:{$power}<br />WiFi:{$wifi}</span>
0306: EOT;
0307: $i++;
0308: $message = '';
0309: if ($i > 26) break; //検索打ち切り
0310: }
0311: }
0312: }
0313: return array($i - 1, $message, $url);
0314: }

充電情報については、応答データの tags から、パターンマッチで充電に関するテキストがあれば格納する。
電源情報については、応答データの tags から、パターンマッチで電源に関するテキストがあれば格納する。
Wi-Fi情報については、応答データの wireless から、パターンマッチでテキストがあれば格納する。
活用例
参考サイト
- モバイラーズオアシス 電源情報API
- PHPでGoogleを利用して住所から緯度・経度を求める:ぱふぅ家のホームページ
- 電源・WiFiが使える店舗・施設を地図・住所で探す:みんなの知識 ちょっと便利帳
(2022年3月19日)Leafletでマップ移動時に緯度・経度を拾わない不具合を修正した。
(2021年10月17日)PHP8対応,リファラ・チェック改良