じゃらんAPIの詳細
非常にシンプルなつくりですが、じゃらんAPIを利用して、じゃらんの宿をGoogle上に表示するサンプルです。
GoogleMapに表示するために、じゃらんから提供される、緯度経度を変換する必要がありますが、その変換部分をサーバーサイドでおこなっています。また、JSONで出力することで、Ajaxとして使いやすくしてみました。
以下のソースを参考にしてください。
http://jalan.tatamilab.jp/map/hotel_search.cgiのソース
#!/usr/bin/perl -w
#じゃらん宿表示API活用サンプル
#XMLをJSONに変換
#じゃらんの緯度経度をGoogleでそのままつかえる緯度経度に変換
#
#フナミタカオ@たたみラボ
#2006/06/16 初版リリース
#2006/06/22 Kmlへのコンバージョン追加
#このソースは、コピー改変していただいてかまいません。どうぞ、じゃらん宿表示APIをご活用ください。
#じゃらん宿表示APIの詳細は http://jws.jalan.net/ws/viw/U01001
use strict;
use utf8;
use LWP::Simple;
use XML::Simple;
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
use JSON;
use CGI::Carp qw(fatalsToBrowser);
use Location::GeoTool; #ココギコさんのGeoToolを使わせていただいています。
#http://www.annocpan.org/~KOKOGIKO/Location-GeoTool-1.98/lib/Location/GeoTool/Japanese.pod
my $xs = XML::Simple->new();
#QUERY_STRINGを取得
my $query_string = $ENV{'QUERY_STRING'};
if (!$query_string ){
$query_string = "key=guest&pref=010000&l_area=012900&s_area=012911&start=1&count=1";
$query_string = "key=guest&pref=&l_area=&s_area=&start=1&count=1";
}
#じゃらんからデータを取得
my $url = "http://jws.jalan.net/APILite/HotelSearch/V1/?pict_size=1&$query_string";
my $res = get($url);
my $resRef;
if($res){
$resRef = $xs->XMLin($res,ForceArray => ['Hotel']);
$resRef->{request_url} = $url;
#必要な情報を用いて、再構築、座標系の変換もここで行う。
#じゃらんは、測地系:日本、単位:ミリ秒(非常に目面しいですねえ...)
#Googleは 測地系:世界、単位:度
foreach my $hotel (@{$resRef->{Hotel}}){
if ($hotel->{Y} == 999999999 || $hotel->{X} == 999999999){
($hotel->{lat},$hotel->{lng}) = (-1,-1);
}else{
my $obj = Location::GeoTool->create_coord($hotel->{Y}/1000,$hotel->{X}/1000,'tokyo','second');
($hotel->{lat},$hotel->{lng}) = $obj->datum_wgs84->format_degree->array;
}
}
}else{
$resRef->{request_url} = $url;
}
#JSONで戻す
if($query_string =~ /JSON=/){
my $resJs = objToJson($resRef);
utf8::encode($resJs);
print "Content-Type: text/javascript; charset=utf-8\n\n";
print $resJs."\n";
}elsif($query_string =~ /KML=/){
#KMLへコンバージョン
my $kmlRef = {Folder=>{Placemark => []}};
my $folder = $kmlRef->{Folder};
$folder->{name} = "jalan API -> KML Sample";
$folder->{description} = "jalan API to KML";
foreach my $hotel (@{$resRef->{Hotel}}){
next if ($hotel->{lat} == -1);
my $imgtag = '
' if ($hotel->{PictureURL});
my $Placemark =
{
description => ''.$hotel->{HotelCatchCopy}.'
'.$hotel->{HotelCaption}.'
'.$hotel->{HotelAddress}.'
じゃらんで詳細を見る
]]>',
name => $hotel->{HotelName},
LookAt => {
longitude => $hotel->{lng},
latitude => $hotel->{lat},
range => 0,
tilt => 0,
},
Point => {
coordinates => $hotel->{lng}.','.$hotel->{lat},
}
};
push(@{$folder->{Placemark}},$Placemark);
}
my $xml = $xs->XMLout($kmlRef,NoAttr=>1,RootName=>'kml');
print "Content-Type: text/kml; charset=utf-8\n";
print "Content-Disposition: attachment; filename=\"yado.kml\"\n\n";
my $head = qq(\n);
$xml = $head . $xml;
print qq(\x{ef}\x{bb}\x{bf}); #一応BOMを書いてみる
print $xml;
}else{
my $xml = $xs->XMLout($resRef,NoAttr=>1,RootName=>'Results');
print "Content-Type: text/xml; charset=utf-8\n\n";
my $head = qq(\n);
$xml = $head . $xml;
print $xml;
}
フナミタカオ@たたみラボ