DEVELOPERS BLOGデベロッパーズブログ
- HOME >
- 加藤 正人のデベロッパーズブログ >
- 駅データ.jp のデータを CakePHP から使う
加藤 正人のデベロッパーズブログ
- 氏名
- 加藤 正人
- 役職
- 多分SE
- 血液型
- 秘密
- 出没
- 美味しいもののあるところ
- 特色
- タヒチ大好き。ちょいメタボ。
- 2020/12/15
- CakePHP3 のリダイレクトがうまく行かない例
- 2020/11/12
- Apache Bench
- 2020/10/05
- PhpSpreadsheet でExcel ファイルを読み込む (CakePHP3)
鉄道路線と駅のデータを無償提供してくれている「駅データ.jp」さんのデータを、CakePHP からなるべく簡単に使う方法を考えてみた。
折角だから、CakePHP のキャッシュを使って駅データサーバへのアクセスを減らすようにした。
01 | // |
02 | // 駅データ.jp API をアクセスするためのクラスとメソッド群 |
03 | // |
04 | class EkiDataAccess extends Object |
05 | { |
06 | const CacheKey = 'EkiData' ; |
07 |
08 | public function __construct() |
09 | { |
10 | // 駅データ.jp 用キャッシュキー設定 |
11 | if ( !Cache::config(self::CacheKey) ) |
12 | { |
13 | // EkiData キャッシュが設定されていない場合のみ既定値で設定する。 |
14 | Cache::config(self::CacheKey, array ( |
15 | 'engine' => 'File' , |
16 | 'duration' => '+7 days' , // キャッシュの有効期限は7日 |
17 | 'path' => CACHE . self::CacheKey . DS, |
18 | 'prefix' => 'ekidata_' , |
19 | )); |
20 | } |
21 | parent::__construct(); |
22 | } |
23 | // 都道府県 ID で指定された都道府県に所属する路線の一覧を配列形式で返す |
24 | // 第2パラメータ $full が true の場合は、取得したデータをそのまま配列化して返す。 |
25 | // false の場合は {路線コード} => {路線名} の連想リストとして返す |
26 | public function getLinesByPrefId( $id , $full =TRUE) |
27 | { |
28 | if ( !( $result =Cache::read( "p_{$id}" , self::CacheKey)) ) |
29 | { |
30 | $result = Xml::toArray(Xml::build( "http://www.ekidata.jp/api/p/{$id}.xml" )); |
31 | if ( !@ $result [ 'ekidata' ][ 'line' ][0] ) |
32 | { |
33 | // line 構造が1つしかない場合の処理 |
34 | $result [ 'ekidata' ][ 'line' ] = array ( $result [ 'ekidata' ][ 'line' ]); |
35 | } |
36 | Cache::write( "p_{$id}" , $result , self::CacheKey); |
37 | } |
38 | if ( ! $full ) |
39 | { |
40 | $tmp = array (); |
41 | foreach ( $result [ 'ekidata' ][ 'line' ] as $l ) |
42 | { |
43 | $tmp [ $l [ 'line_cd' ]] = $l [ 'line_name' ]; |
44 | } |
45 | $result = $tmp ; |
46 | } |
47 | return $result ; |
48 | } |
49 |
50 | // 路線 ID で指定された路線に所属する駅の一覧を配列形式で返す |
51 | // 第2パラメータ $full が true の場合は、取得したデータをそのまま配列化して返す。フルデータには路線名情報も含まれている。 |
52 | // false の場合は {駅コード} => {駅名} の連想リストとして返す |
53 | public function getStationsByLineId( $id , $full =TRUE) |
54 | { |
55 | if ( !( $result =Cache::read( "l_{$id}" , self::CacheKey)) ) |
56 | { |
57 | $result = Xml::toArray(Xml::build( "http://www.ekidata.jp/api/l/{$id}.xml" )); |
58 | if ( !@ $result [ 'ekidata' ][ 'station' ][0] ) |
59 | { |
60 | // station 構造が1つしかない場合の処理 |
61 | $result [ 'ekidata' ][ 'station' ] = array ( $result [ 'ekidata' ][ 'line' ]); |
62 | } |
63 | Cache::write( "l_{$id}" , $result , self::CacheKey); |
64 | } |
65 | if ( ! $full ) |
66 | { |
67 | $tmp = array (); |
68 | foreach ( $result [ 'ekidata' ][ 'station' ] as $s ) |
69 | { |
70 | $tmp [ $s [ 'station_cd' ]] = $s [ 'station_name' ]; |
71 | } |
72 | $result = $tmp ; |
73 | } |
74 | return $result ; |
75 | } |
76 |
77 | // 駅 ID で指定された駅情報を返す |
78 | public function getStationDetailByStationId( $id ) |
79 | { |
80 | if ( !( $result =Cache::read( "s_{$id}" , self::CacheKey)) ) |
81 | { |
82 | $result = Xml::toArray(Xml::build( "http://www.ekidata.jp/api/s/{$id}.xml" )); |
83 | Cache::write( "s_{$id}" , $result , self::CacheKey); |
84 | } |
85 | return $result ; |
86 | } |
87 | } |
使用する場合は CakePHP のコード中で以下のようにする。
1 | App::uses( 'EkiDataAccess' , {配置した場所}); // EkiDataAccess クラスをロードする |
2 |
3 | $ekidata = new EkiDataAccess(); // EkiDataAccess クラスのインスタンスを生成する |
4 |
5 | // 都道府県番号 (1~47) で指定された都道府県に所属する路線の簡易一覧を取得する |
6 | $line_list = $this ->ekidata->getLinesByPrefId({都道府県番号}, FALSE); |
7 | // 駅データ.jp の路線番号で指定された路線の所属駅の簡易一覧を取得する |
8 | $station_list = $this ->ekidata->getStationsByLineId({駅データ.jp の路線番号}, FALSE); |
以上で CakePHP から「駅データ.jp」の路線駅情報をアクセスできる。
関連エントリー
- 2018/04/14
- CakePHP のレンダリング結果を保存したい
- 2017/09/06
- CakePHP 2.x の Cookie と js.cookie.js
- 2017/07/08
- 時刻入力用 jQuery Plugin TimePicki の不具合調整
- 2017/06/18
- CakePHP プラグインで HTTPS 判定
- 2016/02/27
- 作業用モデルビヘイビア