ZAPAnet総合情報局 > ZAPAブログ2.0 > 宿・ホテル検索-ZAPAnet-作りました

宿・ホテル検索-ZAPAnet-作りました

2006年07月23日 プログラミングTIPS
宿・ホテル検索-ZAPAnet-作りました。

宿・ホテル検索-ZAPAnet-



宿・ホテル検索-ZAPAnet-では、じゃらんWebサービスを利用して、宿・ホテル予約-じゃらんnetの宿・ホテルの情報を表示することができます。

例えば、「北海道」の宿を調べたいときであれば、TOPページの「北海道」のリンクをクリックして、次のページに進むと条件指定画面が表示されます。
地域指定、宿タイプ指定
屋外プール 駐車場無料 内湯・大浴場
温泉 貸切風呂・貸切露天 展望風呂
サウナ ジャグジー マッサージ
貸しスキー 貸しボード ペットOKの宿
エステ設備 卓球あり 送迎あり
チェックアウト11時以降
など自分の目的にあったホテルの検索ができるようになっています。
条件を決めたら、「検索」ボタンをクリックすると、条件に合った宿・ホテルが表示されます。

検索結果画面では、ブログでの口コミ情報とGoogleでの検索結果が簡単に得られるようになっています。
また、Google マップと連携して、旅館の場所を地図で確認できるようになっています。
位置情報に多少の誤差はありますが、大体の位置は把握できると思います。


以下、この位置情報を表示させるために苦労した点のメモを残しておきます。



じゃらんWebサービスのAPI仕様については、
じゃらんWebサービス - じゃらん宿表示API
に書いてありますが、AWSなどと同様にRESTで簡単に情報を取得できるようになっています。
RESTとは、REpresentational State Transferの略語です。 HTTPでXMLを得るといったシンプルで簡易なアーキテクチャシステムのことを主にさしています。 SOAPなどに比べて幅広い開発者の方にご利用いただけるため、じゃらんWebサービスではRESTを採用しています。
リクエストURLは、
https://jws.jalan.net/APILite/HotelSearch/V1/
で、リクエストパラメータを指定することでXMLが返ってきます。
例:
https://jws.jalan.net/APILite/HotelSearch/V1/?key=guest&pref=010000&l_area=012900&s_area=012911&h_type=1&start=1&count=1

レスポンスには、経度(ミリ秒)と緯度(ミリ秒)が返ってきますが、この経度・緯度の取り扱いに苦労しました。
APIサンプルには、
X 経度(ミリ秒) 半角数字 1 510057281
Y 緯度(ミリ秒) 半角数字 1 163501149
と書かれていましたが、経度・緯度の読み方がわかりませんでした。

ミリ秒って何??


経度で知っているのは、東経135度くらいです。
経度:510057281と書かれても、何のことだかさっぱりわかりませんでした。

経度・緯度情報から地図を表示させたかったので、Google マップを調べてみると、こちらは単位がWGS84と書かれていました。

WGS84って何??


調べてみると、WGS84測地系とは世界測地系のことで、2002年4月1日に日本測地系から移行したことがわかりました。

世界測地系?日本測地系?


さらにいろいろ調べていると、たたみラボ: マッシュアップ日記(1)Map!緯度経度!さんのところで、同じじゃらんWebサービスを利用した記事が載っていました。
  フォーマット 測地系
Google degree(xxx.xxxxxxxx) wgs84
じゃらん ミリ秒(yyyyyyyyy) 日本
フロムエー 度・分・秒(zzz.zz.zz) 日本
見事にバラバラです…。
しかもこの記事内では、Perlの変換スクリプトが紹介されていましたが、自分はPHPで作りたいので、Perlのスクリプトは使いたくありません。
そこで、自力でじゃらんのミリ秒からGoogleのWGS84に変換してみようと、Googleで検索してみました。

が、なかなか変換の式が見当たりません…。
そもそも検索するにしても、地図表記の単位系の呼び方が良くわからないので検索もうまくできません。
ミリ秒とか度・分・秒とかdegreeでは違うものが検索されてしまいます。


ここで諦めてしまうのも悔しいので、もう少し調べて、まずはじゃらんのミリ秒から度・分・秒に変換することにしました。
参考にしたページ→Mio User's - フォーラム
以下の関数を自分で作ってみました。
//ミリ秒から度・分・秒に変換する怪しげな関数
function mil2do($x){ $k["do"] = (int)($x / 3600 / 1000); $k["hun"] = (int)(( ($x / 1000) % 3600) / 60); $k["byo"] = (($x / 1000) % 3600) % 60; return $k; };
この関数で多分、ミリ秒から度・分・秒に変換できるはずです。(多少誤差は出てきますが)

続いて、度・分・秒からdegreeに変換することにしました。
参考にしたページ→02 DATUM
このサイトに、変換式が掲載されていました。
緯度Bと経度Lの数値は、度単位(D)で与えてください。

BWGS84 = BTokyo - 0.00010695*BTokyo + 0.000017464*LTokyo + 0.0046017
LWGS84 = LTokyo - 0.000046038*BTokyo - 0.000083043*LTokyo + 0.010040
この変換式を実行する関数を作って、Google マップに経度・緯度情報を与えてみましたが、全然違う位置にポイントが表示されてしまいました。
北海道千歳のホテルを表示するはずが、なぜか海の上が表示されてしまって、

海上ホテルか!


と、思わず突っ込んでしまいそうになりました。

上記変換式を良く読んでみると、「度単位(D)で与えてください。」と書かれていることを見落としていました。
見落としたと言うよりは、度単位(D)が何なのかわからなかったのが原因でもありますが…。
最初に変換した度・分・秒と度単位(D)は、実は形式が違っていました。
海上ホテルが表示されてしまうのも当たり前でした。

そこで、度・分・秒から度単位(D)に変換してから、WGS84に変換することにしました。
参考にしたページ→[教えて!goo] 緯度、経度の 10進法と 60進法の変換方法について
できあがった関数は以下の通りです。
//度・分・秒から度単位(D)に変換し、さらにWGS84に変換する怪しげな関数
function do2wgs($keido,$ido){
$keido = $keido["do"]+($keido["hun"]/60)+($keido["byo"]/3600);
	$ido = $ido["do"]+($ido["hun"]/60)+($ido["byo"]/3600);
	$wgs["ido"] = $ido - (0.00010695 * $ido) + (0.000017464 * $keido) + 0.0046017;
	$wgs["keido"] = $keido - (0.000046038 * $ido) - (0.000083043 * $keido) + 0.010040;
return $wgs;
};

この二つの関数を使って、度・分・秒から度単位(D)WGS84に変換した経度・緯度情報をGoogle マップに与えて表示してみたところ…

ほぼ正常に表示されました!


ほぼと言うのは、多少誤差があって数100mずれてしまう場合があるからです。(一応このくらいなら許容範囲かと…)


単位系が良くわからなくて、少し苦労しましたが、なんとか宿・ホテル検索-ZAPAnet-は完成しました。
どのくらいの精度なのかは、実際に宿・ホテル検索-ZAPAnet-で検索してみてください。