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

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

(2025年8月14日).pahooEnv導入
(2025年6月14日)GoogleMaps JavaScript APIの変更に対応した.
(2023年8月5日)国土地理院ジオコーディングAPIを利用できるようにした.検索キーの最小・最大長が指定できるようにした.

目次

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

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

サンプル・プログラム

圧縮ファイルの内容
searchLibrary.phpサンプル・プログラム本体
.pahooEnvクラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。
使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで住所・ランドマークから緯度・経度を求める」などを参照。include_path が通ったディレクトリに配置すること。
searchLibrary.php 更新履歴
バージョン 更新日 内容
2.6.0 2025/08/14 .pahooEnv導入
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追加
pahooInputData.php 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加
pahooGeoCode.php 更新履歴
バージョン 更新日 内容
6.8.0 2025/08/10 アクセスキーなどを ".env" に分離
6.7.1 2025/07/26 jsLine_Gmap() - bug-fix
6.7.0 2025/07/20 drawJSmap,drawGMap -- 引数 $markerLevel 追加
6.6.0 2025/07/19 drawJSmap,drawGMap,drawLeaflet -- マップ中心マーカー表示引数を追加
6.5.0 2025/06/14 GoogleMaps JavaScript APIの変更に対応

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

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

準備:PHP の https対応

クラウド連携や相手先サイトのデータを読み込むのに https通信を使うため、PHPに OpenSSLモジュールが組み込まれている必要がある。関数  phpinfo  を使って、下図のように表示されればOKだ。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dll
Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

準備:pahooInputData 関数群

PHPのバージョンや入力データのバリデーションなど、汎用的に使う関数群を収めたファイル "pahooInputData.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooInputData.php" を利用するが、常に最新のファイルを1つ配置すればよい。

また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。

準備:pahooGeoCode クラス

pahooGeoCode.php

  40: class pahooGeoCode {
  41:     public $items;      // 検索結果格納用
  42:     public $error;      // エラー・フラグ
  43:     public $errmsg;     // エラー・メッセージ
  44:     public $hits;       // 検索ヒット件数
  45:     public $webapi// 直前に呼び出したWebAPI URL
  46: 
  47:     // -- 以下のデータは .env ファイルに記述可能
  48:     // Google Cloud Platform APIキー
  49:     // https://cloud.google.com/maps-platform/
  50:     // ※Google Maps APIを利用しないのなら登録不要
  51:     public $GOOGLE_API_KEY_1 = '';      // HTTPリファラ用
  52:     public $GOOGLE_API_KEY_2 = '';      // IP制限用
  53:     public $GOOGLE_MAP_ID    = '';      // GoogleMaps ID
  54: 
  55:     // Yahoo! JAPAN Webサービス アプリケーションID
  56:     // https://e.developer.yahoo.co.jp/register
  57:     // ※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
  58:     public $YAHOO_APPLICATION_ID = '';
  59: 
  60:     // OSM Nominatim Search API利用時に知らせるメールアドレス
  61:     // https://wiki.openstreetmap.org/wiki/JA:Nominatim#.E6.A4.9C.E7.B4.A2
  62:     // ※OSM Nominatim Search APIを利用しないのなら登録不要
  63:     public $NOMINATIM_EMAIL = '';
  64: 
  65:     // IP2Location.io APIキー
  66:     // https://www.ip2location.io/
  67:     // ※IP2Location.ioを利用しないのなら登録不要
  68:     public $IP2LOCATION_API_KEY = '';

GoogleマップやLeafletなどによる地図描画や住所検索を行うためのクラスが pahooGeoCode である。同梱のクラス・ファイル "pahooGeoCode.php" は include_path が通ったディレクトリに配置してほしい。他のプログラムでも pahooGeoCodeクラス を利用するが、常に最新のクラス・ファイルを1つ配置すればよい。
PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

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

PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

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

weatherMap.php

  65: // 地図描画サービスの選択
  66: //    0:Google
  67: //    2:地理院地図・OSM
  68: define('MAPSERVICE', 2);
  69: 
  70: // マップの表示サイズ(単位:ピクセル)
  71: define('MAP_WIDTH',  600);
  72: define('MAP_HEIGHT', 480);
  73: // マップID
  74: define('MAPID', 'map_id');
  75: // 初期値
  76: define('DEF_LATITUDE',  35.0);          // 緯度
  77: define('DEF_LONGITUDE', 137.0);         // 経度
  78: define('DEF_TYPE',      'GSISTD');      // マップタイプ
  79: define('DEF_ZOOM',      4);             // ズーム
  80: 
  81: define('SEMICIRCLE',    30);            // 半円を代替する多角形頂点数

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

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

searchLibrary.php

  75: // 「カーリル図書館API」アプリケーションID
  76: // https://calil.jp/api/dashboard/ から入手
  77: // .pahooEnvに書くか、下記に直接記入してください
  78: if (isset($_ENV['PAHOO_CALIL_APPLICATIONID'])) {
  79:     define('APPLICATION_KEY', $_ENV['PAHOO_CALIL_APPLICATIONID']);
  80: else {
  81:     define('APPLICATION_KEY', '********************************');
  82: }

https://calil.jp/api/dashboard/ からアプリケーションキーを取得する。無料。
入手したアプリケーションキーを、.aphooEnv ファイルの PAHOO_CALIL_APPLICATIONID にセットするか、直接、定数 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 外観写真(現時点では空)

解説:図書館検索

searchLibrary.php

 185: /**
 186:  * 数値に対応するアルファベットを返す
 187:  * @param   int $i 値
 188:  * @return  string アルファベット
 189: */
 190: function num2alpha($i) {
 191:     return chr(64 + $i);
 192: }

searchLibrary.php

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

searchLibrary.php

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

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

参考サイト

(この項おわり)
header