Railgo Web サービスをPHPで利用する



1.Mash Up Award 3rd
第3回にまで発展して、参加APIも増えたMash Up Award。うまく、いいアイデアが浮かばないままに、とりあえず、RailGoの機能でも使ってみようかと、すこし試そうとしたのだけれども、さてPHPからどうやって使えばいいのだろうと、特に認証のあたりが今ひとつ不明で良くわからず。ということで、適当に調べながらとりあえず、動くものを作ってみた。


2.参考
一応、いろいろとやるうえで参考にしたのはとりあえず公式サイトのヘルプ。
RailGoWebService040506DocV1_01.pdf
RailGoアプリケーションの手引き
これに加えて、
ブログ: 岡崎 - Okazaki's blog
それからPHPのマニュアルである
PHP: SoapClient->__construct() - Manual


3.ヘッダ認証
SoapClientで、がちゃがちゃとまではすぐにたどり着くのだけれども、認証のところが今ひとつよくわからず。で、いろいろと試したのだけれども、とりあえず、後ろにつけているサンプルのようにすればうまくいった。


4.あとは
あとは、ぞろぞろと各値の構造に従って引っ張ってこれば、それらしく値の取得が出来る模様。なんか、もう少しスマートなやり方もあるような気がするけれど、とりあえず、動く事で今回は安心しておく。


5.それ以上
それ以上に、これを使って何を作るかが問題なのだけれど。


プログラムサンプル:

<?php
 print("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
?>

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
 <head>
 </head>
 <body>
<?php
//SOAPクライアントへ接続
try {
 $wsdl = "http://wstest.railgo.jp/Expservice06.asmx?WSDL";
 $RailGo = new SoapClient($wsdl);

 //////////
 //*******認証設定*******
 //////////
 //認証用ヘッダ設定用変数
 $name_space="http://expart.est.co.jp/ExpService";  //名前空間
 $name="Authentication";
 $auth =new stdClass;
 $auth->User = "mctuser3";  //MashUpAward3用
 $auth->Password = "symfyws6";  //MashUpAward3用
 //ヘッダの作成
 $header = new SoapHeader($name_space,$name, $auth,false);
 //ヘッダのセット
 $RailGo->__setSoapHeaders(array($header));
 //print_r($header); //For Debug
 //print_r($RailGo->__getFunctions()); //For Debug:取得した関数一覧の出力
 //print_r($RailGo->__getTypes()); //For Debug:取得したタイプ一覧の出力

 //////////
 //*******ナビゲーションオプション設定*******
 //////////
 //ナビゲーションオプションの取得
 $NavigationOption=$RailGo->GetDefaultNavigation();
 //ナビゲーションオプションの変更(以下は例示)
 $NavigationOption->GetDefaultNavigationResult->AnswerCount=3;
 //$NavigationOption->GetDefaultNavigationResult->TargetTime=date(His);
 //$NavigationOption->GetDefaultNavigationResult->TargetDate=date(Ymd);
 //true:Departure,false:Arrival
 $NavigationOption->GetDefaultNavigationResult->Departure=true;
 //検索順序 Search = 1 探索順,Time = 2 時間順,Fare = 4 運賃順,Pass = 8 定期順
 $NavigationOption->GetDefaultNavigationResult->Sort=$RailGo->SortType.Time;
 //print_r($NavigationOption); //For Debug

 //////////
 //*******一括駅情報検索*******
 //////////
 $stations=array('新宿','池袋','渋谷','有楽町','新橋','大手町');
 //SearchStationAll関数のパラメータを配列に設定(stdClassに設定も可)
 //SearchStation関数の場合は、最初の配列を'StationYomi'にして、String 形式の駅名を設定
 $SearchStationAllParams=array('StationYomiArray'=>$stations, 
                               'AreaType'=>$RailGo->AreaType.Japan,
                               'StationType'=>$RailGo->StationType.RailRoad,
                               'Date'=>'20070101');
 //一括駅情報検索の実行
 $SearchStationAllRes = $RailGo->SearchStationAll($SearchStationAllParams);
 //とりあえず出力例
 print('一括駅情報検索<br />');
 //print_r($SearchStationAllRes); //For Debug:取得した結果一覧の出力
 print('<ul>');
 for($i=0;$i<count($stations);$i++){
  print('<li>');
  print($stations[$i].'の検索結果');
  print('<ul>');
  //複数候補の場合は、配列として処理
  if(is_array($SearchStationAllRes->SearchStationAllResult->ArrayOfStation[$i]->Station)){
   foreach($SearchStationAllRes->SearchStationAllResult->ArrayOfStation[$i]->Station as $value){
    print('<li>');
    print('駅名:'.$value->LongName.'(Latitude:'.PosChange($value->Latitude).',Longitude:'.PosChange($value->Longitude).')');
    print('</li>');
   }
  }else{
   $value=$SearchStationAllRes->SearchStationAllResult->ArrayOfStation[$i]->Station;
   print('<li>');
   print('駅名:'.$value->LongName.'(Latitude:'.PosChange($value->Latitude).',Longitude:'.PosChange($value->Longitude).')');
   print('</li>');
  }
  print('</ul>');
  print('</li>');
 }
 print('</ul>');
 print('<br />');
 //////////
 //*******経路情報検索*******
 //////////
 //SearchCourse関数のパラメータをstdClassに設定(配列に設定も可)
 $SearchCourseParams=new stdClass;
 //0が出発,最後が到着,間は経由地(ここでは、出発と到着のみを設定)
 //一括駅情報検索結果$SearchStationAllResultより、Station 形式のデータを取り出す
 //結果が複数の場合は配列で返ってくるため、配列データかどうかをStationArrayCheck関数で確認し、
 //配列の場合は、ここではとりあえず先頭の結果を配列でない場合は、単一の結果として、パラメータに受け渡す(以下同様)
 $SearchCourseParams->Stations[0]
  =StationArrayCheck($SearchStationAllRes->SearchStationAllResult->ArrayOfStation[0]->Station);
 $SearchCourseParams->Stations[1]
  =StationArrayCheck($SearchStationAllRes->SearchStationAllResult->ArrayOfStation[3]->Station);
 //検索オプションの設定:取得(設定)した$NavigationOptionより、Navigation 形式のデータを取り出す
 $SearchCourseParams->SearchOption=$NavigationOption->GetDefaultNavigationResult;
 //経路情報検索の実行
 $SearchCourseRes = $RailGo->SearchCourse($SearchCourseParams);
 //とりあえず出力例
 print('経路情報検索('.$stations[0].''.$stations[3].')<br />');
 //print_r($SearchCourseRes); //For Debug:取得した結果一覧の出力
 print('<ul>');
 foreach($SearchCourseRes->SearchCourseResult->Course as $value){
  $ways=split(',',$value->Description);
  $way=implode('',$ways);
  print('<li>');
  print('経路:'.$way.'<br />所用時間:'.$value->TotalTime.'分(内乗車時間:'.$value->TotalBoardTime.'分)<br />');
  print('片道運賃:'.$value->TotalFare->OneWayFare.'円(往復運賃:'.$value->TotalFare->RoundTripFare.'円)');
  print(' 乗り換え回数:'.$value->TransferCount.'回 距離:'.$value->TotalDistance.'×100m<br />');
  print('</li>');
 }
 print('</ul>');
 print('<br />');
 //SearchCourseall関数の場合
 $SearchCourseAllParams=new stdClass;
 //出発駅データセットSearchStationAllResultより、Station 形式のデータを取り出す
 $SearchCourseAllParams->DepartureStations[0]
  =StationArrayCheck($SearchStationAllRes->SearchStationAllResult->ArrayOfStation[0]->Station);
 $SearchCourseAllParams->DepartureStations[1]
  =StationArrayCheck($SearchStationAllRes->SearchStationAllResult->ArrayOfStation[1]->Station);
 $SearchCourseAllParams->DepartureStations[2]
  =StationArrayCheck($SearchStationAllRes->SearchStationAllResult->ArrayOfStation[2]->Station);
 //到着駅データセットSearchStationAllResultより、Station 形式のデータを取り出す
 $SearchCourseAllParams->ArrivalStations[0]
  =StationArrayCheck($SearchStationAllRes->SearchStationAllResult->ArrayOfStation[3]->Station);
 $SearchCourseAllParams->ArrivalStations[1]
  =StationArrayCheck($SearchStationAllRes->SearchStationAllResult->ArrayOfStation[4]->Station);
 $SearchCourseAllParams->ArrivalStations[2]
  =StationArrayCheck($SearchStationAllRes->SearchStationAllResult->ArrayOfStation[5]->Station);
 //検索オプションの設定:取得(設定)した$NavigationOptionより、Navigation 形式のデータを取り出す
 $NavigationOption->GetDefaultNavigationResult->AnswerCount=10;
 $SearchCourseAllParams->SearchOption=$NavigationOption->GetDefaultNavigationResult;
 //経路情報一括検索の実行
 $SearchCourseAllRes = $RailGo->SearchCourseAll($SearchCourseAllParams);
 print('経路情報一括検索<br />');
 //print_r($SearchCourseAllRes); //For Debug:取得した結果一覧の出力
 print('<ul>');
 foreach($SearchCourseAllRes->SearchCourseAllResult->Course as $value){
  $ways=split(',',$value->Description);
  $way=implode('',$ways);
  print('<li>');
  print('経路:'.$way.'<br />所用時間:'.$value->TotalTime.'分(内乗車時間:'.$value->TotalBoardTime.'分)<br />');
  print('片道運賃:'.$value->TotalFare->OneWayFare.'円(往復運賃:'.$value->TotalFare->RoundTripFare.'円)');
  print(' 乗り換え回数:'.$value->TransferCount.'回 距離:'.$value->TotalDistance.'×100m<br />');
  print('</li>');
 }
 print('</ul>');
 print('<br />');
}catch (SoapFault $exception){
 print('Line:'.$exception->getLine().',Message:'.$exception->getMessage ());
}
?>
 </body>
</html>
<?PHP
//配列データ判定用関数
function StationArrayCheck($Station){
 if(is_array($Station)){
  return $Station[0];
 }else{
  return $Station;
 }
}
//緯度経度変換用関数
function PosChange($pos){
 return round($pos->degree+$pos->minutes/60+$pos->second/3600,5);
}

?>



実行結果:

一括駅情報検索

    ・ 新宿の検索結果
          o 駅名:新宿(Latitude:35.6875,Longitude:139.70306)
          o 駅名:新宿(東京メトロ)(Latitude:35.68917,Longitude:139.70417)
          o 駅名:新宿御苑前(Latitude:35.68525,Longitude:139.71419)
          o 駅名:新宿三丁目(Latitude:35.6875,Longitude:139.70861)
          o 駅名:新宿西口(Latitude:35.69056,Longitude:139.70222)
    ・ 池袋の検索結果
          o 駅名:池袋(Latitude:35.72669,Longitude:139.71436)
    ・ 渋谷の検索結果
          o 駅名:渋谷(Latitude:35.65536,Longitude:139.70442)
    ・ 有楽町の検索結果
          o 駅名:有楽町(Latitude:35.67222,Longitude:139.76583)
    ・ 新橋の検索結果
          o 駅名:新橋(Latitude:35.66333,Longitude:139.7625)
    ・ 大手町の検索結果
          o 駅名:大手町(東京都)(Latitude:35.6825,Longitude:139.7675)
          o 駅名:大手町(愛媛県)(Latitude:33.83656,Longitude:132.75792)


経路情報検索(新宿〜有楽町)

    ・ 経路:新宿→[JR中央線快速]→神田(東京都)→[JR山手線外回り]→有楽町
      所用時間:25分(内乗車時間:16分)
      片道運賃:190円(往復運賃:380円) 乗り換え回数:1回 距離:111×100m
    ・ 経路:新宿→[都営新宿線急行]→市ケ谷→[東京メトロ有楽町線(和光市−新木場)]→有楽町
      所用時間:28分(内乗車時間:11分)
      片道運賃:260円(往復運賃:520円) 乗り換え回数:1回 距離:74×100m
    ・ 経路:新宿→[JR総武線]→市ケ谷→[東京メトロ有楽町線(和光市−新木場)]→有楽町
      所用時間:29分(内乗車時間:17分)
      片道運賃:310円(往復運賃:620円) 乗り換え回数:1回 距離:82×100m


経路情報一括検索

    ・ 経路:池袋→[東京メトロ丸ノ内線(池袋−荻窪)]→大手町(東京都)
      所用時間:18分(内乗車時間:14分)
      片道運賃:190円(往復運賃:380円) 乗り換え回数:0回 距離:81×100m
    ・ 経路:渋谷→[東京メトロ銀座線]→新橋
      所用時間:20分(内乗車時間:13分)
      片道運賃:160円(往復運賃:320円) 乗り換え回数:0回 距離:63×100m
    ・ 経路:渋谷→[東京メトロ半蔵門線]→永田町→[東京メトロ有楽町線(和光市−新木場)]→有楽町
      所用時間:21分(内乗車時間:10分)
      片道運賃:160円(往復運賃:320円) 乗り換え回数:1回 距離:59×100m
    ・ 経路:渋谷→[JR山手線内回り]→新橋
      所用時間:22分(内乗車時間:18分)
      片道運賃:190円(往復運賃:380円) 乗り換え回数:0回 距離:121×100m
    ・ 経路:渋谷→[東京メトロ半蔵門線]→大手町(東京都)
      所用時間:22分(内乗車時間:16分)
      片道運賃:190円(往復運賃:380円) 乗り換え回数:0回 距離:87×100m
    ・ 経路:渋谷→[JR山手線内回り]→有楽町
      所用時間:23分(内乗車時間:20分)
      片道運賃:190円(往復運賃:380円) 乗り換え回数:0回 距離:132×100m
    ・ 経路:新宿→[JR中央線快速]→御茶ノ水→[東京メトロ丸ノ内線(池袋−荻窪)]→大手町(東京都)
      所用時間:24分(内乗車時間:14分)
      片道運賃:320円(往復運賃:640円) 乗り換え回数:1回 距離:94×100m
    ・ 経路:池袋→[東京メトロ有楽町線(和光市−新木場)]→有楽町
      所用時間:25分(内乗車時間:19分)
      片道運賃:190円(往復運賃:380円) 乗り換え回数:0回 距離:97×100m
    ・ 経路:新宿→[JR中央線快速]→神田(東京都)→[JR山手線外回り]→有楽町
      所用時間:25分(内乗車時間:16分)
      片道運賃:190円(往復運賃:380円) 乗り換え回数:1回 距離:111×100m



関連リンク:
Mash up Award 3rd - 開催概要 - サン・マイクロシステムズ
RailGoアプリケーションの手引き
RailGoWebService040506DocV1_01.pdf
PHP: SoapClient->__construct() - Manual
ブログ: 岡崎 - Okazaki's blog
関連サーチ:
Mash up Award 3rd(AMAZON.co.jp)
Mash up Award 3rd(Google)
Mash up Award 3rd(Technorati.jp)
Powered BY AmazoRogi

Web2.0 プログラマーズ API & マッシュアップ メソッド
発売元 : 翔泳社
発売日 : 2007-06-20 (単行本(ソフトカバー))
売上ランク : 79697 位 (AMAZON.co.jp)
¥ 1,890 通常24時間以内に発送
Powered BY AmazoRogi Data as of 2007-08-17
See detail & latest visit AMAZON.co.jp