PHPで全国の図書館を検索する

(1/1)
カーリルの「図書館API」は、指定した緯度・経度の近くにある図書館の場所を求めることができるWebAPIサービスだ。地図サービスをクラウド連携することで、住所やランドマークから周辺にある図書館を探すPHPプログラムを作ってみる。

(2023年8月5日)国土地理院ジオコーディングAPIを利用できるようにした.検索キーの最小・最大長が指定できるようにした.

目次

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

PHPで全国の図書館を検索する
Googleマップ表示
「住所」に、住所やランドマーク、緯度経度を入力して「検索」ボタンをクリックすると、近くにある図書館がマップ上に表示されるとともに、一覧表示される。

サンプル・プログラム

圧縮ファイルの内容
searchLibrary.phpサンプル・プログラム本体
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで住所・ランドマークから緯度・経度を求める」などを参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
searchLibrary.php 更新履歴
バージョン 更新日 内容
2.5.0 2023/07/16 検索キーの最小・最大長の指定
2.4.0 2023/07/16 国土地理院ジオコーディングAPIを追加
2.3 2021/10/17 PHP8対応,リファラ・チェック改良
2.2 2020/04/04 OSM Nominatim Search API追加
2.11 2019/09/01 逆ジオコーディングサービスの選択肢を増やした
pahooGeoCode.php 更新履歴
バージョン 更新日 内容
6.3.1 2023/07/09 bug-fix
6.3.0 2023/07/02 getPointsGSI()追加
6.2.0 2023/07/02 ip2address()追加
6.1.0 2022/12/30 ip2address()追加
6.0.4 2022/12/13 PHP8.2対応
pahooInputData.php 更新履歴
バージョン 更新日 内容
1.3.0 2023/07/11 roundFloat() 追加
1.2.0 2023/04/22 exitIfLessVersion() 追加
1.1.2 2023/02/05 validString() 修正
1.11 2022/07/03 isCommandLine() 修正
1.1 2022/06/04 getValidString() 修正

サンプル・プログラムの流れ

PHPで全国の図書館を検索する
プログラムの流れは「PHP で最寄り駅を求める」の時と同じで、緯度・経度から施設情報を求める部分を、「カーリル図書館API 」に差し替えただけである。

準備:pahooGeoCode クラス

  37: class pahooGeoCode {
  38:     var $items;     //検索結果格納用
  39:     var $error;     //エラー・フラグ
  40:     var $errmsg;    //エラー・メッセージ
  41:     var $hits;      //検索ヒット件数
  42:     var $webapi;    //直前に呼び出したWebAPI URL
  43: 
  44:     //Google Cloud Platform APIキー
  45:     //https://cloud.google.com/maps-platform/
  46:     //※Google Maps APIを利用しないのなら登録不要
  47:     var $GOOGLE_API_KEY_1 = '**************************';   //HTTPリファラ用
  48:     var $GOOGLE_API_KEY_2 = '**************************';   //IP制限用
  49: 
  50:     //Yahoo! JAPAN Webサービス アプリケーションID
  51:     //https://e.developer.yahoo.co.jp/register
  52:     //※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
  53:     var $YAHOO_APPLICATION_ID = '*****************************';

地図サービスを利用するために、クラスファイル "pahooGeoCode.php" を使用する。組み込み関数  require_once  を使って読めるディレクトリに配置する。ディレクトリは、設定ファイル php.ini に記述されているオプション設定 include_path に設定しておく。
クラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

地図や住所検索として Google を利用するのであれば、Google Cloud Platform APIキー が必要で、その入手方法は「Google Cloud Platform - WebAPIの登録方法」を、Yahoo!JAPAN を利用するのであれば、Yahoo! JAPAN Webサービス アプリケーションIDが必要で、その入手方法は「Yahoo!JAPAN デベロッパーネットワーク - WebAPIの登録方法」を、それぞれ参照されたい。

準備:地図サービス(WebAPI)の選択

  51: //地図描画サービスの選択
  52: //    0:Google
  53: //    2:地理院地図・OSM
  54: define('MAPSERVICE', 2);
  55: 
  56: //住所検索サービスの選択
  57: //    0:Google
  58: //    1:Yahoo!JAPAN
  59: //   11:HeartRails Geo API
  60: //   12:OSM Nominatim Search API
  61: //   13:国土地理院ジオコーディングAPI
  62: define('GEOSERVICE', 11);
  63: 
  64: //逆ジオコーディングサービスの選択
  65: //    0:Google
  66: //    1:Yahoo!JAPAN
  67: //   11:HeartRails Geo API
  68: //   21:簡易ジオコーディングサービス
  69: define('REVGEOSERVICE', 1);

表示する地図は、Googleマップ地理院地図・オープンストリートマップ(OSM)から選べる。あらかじめ、定数 MAPSERVIC に値を設定すること。
住所検索サービスは、GoogleYahoo!JAPANHeartRails Geo APIOSM Nominatim Search API国土地理院ジオコーディングAPI から選べる。あらかじめ、定数 GEOSERVICE に値を設定すること。
逆ジオコーディングサービスは、GoogleYahoo!JAPANHeartRails Geo API簡易ジオコーディングサービスから選べる。あらかじめ、定数 REVGEOSERVICE に値を設定すること。

準備:カーリル・アプリケーションキーの取得

  72: //「カーリル図書館API」アプリケーションID
  73: // https://calil.jp/api/dashboard/ から入手
  74: define('APPLICATION_KEY', '*************************************');

https://calil.jp/api/dashboard/ からアプリケーションキーを取得する。無料。
入手したアプリケーションキーを、定数 APPLICATION_KEY に格納する。

カーリル図書館API:図書館データベース

カーリル図書館APIは、入力パラメータ(IN)として GET方式を、出力結果(OUT)が XMLまたはJSONで戻るというAPIである。
WebAPIのURL
URL
https://api.calil.jp/library

入力パラメータ
フィールド名 要否 内  容
appkey 必須 カーリル図書館APIのアプリケーションキー。
pref 任意 検索に都道府県名を指定する。UTF-8エンコード。
city 任意 検索に市区町村名を指定する。UTF-8エンコード。
systemid 任意 検索に図書館システムIDを指定する。
geocode 任意 検索に緯度、経度(世界測地系)を指定する。例:136.7163027,35.390516
format 任意 出力形式で、xmlまたはjsonを指定する。デフォルトはxml。
callback 任意 JSONPのcallback関数名を指定します。デフォルトはcallback。
limit 任意 図書館の取得件数を指定する。
応答データ構造(xml) Libraries Library systemid 図書館システムID systemname システム名称 libkey システム毎の図書館キー libid 図書館のユニークID short 略称 formal 正式名称 url_pc PC版ウェブサイト address 住所 pref 都道府県 city 市町村 post 郵便番号 tel 電話番号 geocode 位置情報 category カテゴリー image 外観写真(現時点では空)

解説:図書館検索

 179: /**
 180:  * 数値に対応するアルファベットを返す
 181:  * @param   int $i 値
 182:  * @return  string アルファベット
 183: */
 184: function num2alpha($i) {
 185:     return chr(64 + $i);
 186: }

 188: /**
 189:  * カーリル図書館検索APIのURLを取得する
 190:  * @param   double $latitude  緯度(世界測地系)
 191:  * @param   double $longitude 経度(世界測地系)
 192:  * @return  string URL 図書館検索APIのURL
 193: */
 194: function getURL_searchLibraly($latitude, $longitude) {
 195:     $appkey = APPLICATION_KEY;
 196: 
 197:     return "https://api.calil.jp/library?appkey={$appkey}&format=xml&geocode={$longitude},{$latitude}";
 198: }

 200: /**
 201:  * カーリル図書館検索APIを利用して指定座標の近くにある図書館検索する
 202:  * @param   double $latitude  緯度(世界測地系)
 203:  * @param   double $longitude 経度(世界測地系)
 204:  * @param   array $items 情報を格納する配列
 205:  * @return  int ヒットした施設数/FALSE
 206: */
 207: function searchLibraly($latitude, $longitude, &$items) {
 208:     $url = getURL_searchLibraly($latitude, $longitude);
 209:     $xml = @simplexml_load_file($url);
 210:     if ($xml == '' || $xml == FALSE)
 211:         return array(FALSE, 'カーリル図書館検索APIの不具合', FALSE);
 212: 
 213:     //検索結果取りだし
 214:     $cnt = 1;
 215:     $libraries = $xml->Library;
 216:     foreach ($libraries as $library) {
 217:         $items[$cnt]['id']    = num2alpha($cnt);
 218:         $items[$cnt]['title'] = (string)$library->formal;   //正式名称
 219:         $items[$cnt]['libid'] = (string)$library->libid;    //図書館ID
 220:         $items[$cnt]['url'] = (string)$library->url_pc//PC版サイト
 221:         $items[$cnt]['address'] = (string)$library->address;    //住所
 222:         preg_match('/([0-9|\.]+)\,([0-9|\.]+)/', (string)$library->geocode, $arr);
 223:         $items[$cnt]['longitude'] = (double)$arr[1];        //経度
 224:         $items[$cnt]['latitude']  = (double)$arr[2];        //緯度
 225:         $items[$cnt]['description'] =<<< EOT
 226: <span class="small"><a href="{$items[$cnt]['url']}" target="_blank">{$items[$cnt]['title']}</a><br />({$items[$cnt]['address']})</span>
 227: EOT;
 228:         $cnt++;
 229:     }
 230:     if ($cnt == 1)
 231:         return array(FALSE, '検索結果なし', FALSE);
 232: 
 233:     return array($cnt - 1, '', $url);
 234: }

WebAPIを呼び出して結果を受け取るのはユーザー関数 searchLibraly である。結果は配列変数 $items に格納する。

参考サイト

(この項おわり)
header