DEVELOPERS BLOGデベロッパーズブログ

  1. HOME > 
  2. 加藤 正人のデベロッパーズブログ > 
  3. 駅データ.jp のデータを CakePHP から使う

加藤 正人のデベロッパーズブログ

加藤 正人

氏名
加藤 正人
役職
多分SE
血液型
秘密
出没
美味しいもののあるところ
特色
タヒチ大好き。ちょいメタボ。

加藤 正人

2014/08/09

駅データ.jp のデータを CakePHP から使う

 

鉄道路線と駅のデータを無償提供してくれている「駅データ.jp」さんのデータを、CakePHP からなるべく簡単に使う方法を考えてみた。

折角だから、CakePHP のキャッシュを使って駅データサーバへのアクセスを減らすようにした。

01//
02// 駅データ.jp API をアクセスするためのクラスとメソッド群
03//
04class 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 のコード中で以下のようにする。

1App::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」の路線駅情報をアクセスできる。

関連タグ: 駅データ.jp  CakePHP2 

関連エントリー

CakePHP のレンダリング結果を保存したい

CakePHP 2.x の Cookie と js.cookie.js

時刻入力用 jQuery Plugin TimePicki の不具合調整

CakePHP プラグインで HTTPS 判定

作業用モデルビヘイビア