--- title: 最寄りのルノアールを検索するためのスクリプト author: kazu634 date: 1969-12-31 url: /1970/01/01/_65/ wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4747;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - Perl ---
2点間の緯度と経度がわかれば距離が計算できるので、それを用いて最寄りのルノアールを検索するスクリプトを作成してみました(すでにルノアールの緯度と経度のデータを取得済みであることが前提になっています)。
# === Libraries === use strict; use warnings; # 警告用のモジュール use Data::Dumper; # sayを使う use Perl6::Say; # ラジアンに変換するためのモジュール use Math::Trig; # ウェブサービスにアクセスするためのモジュール use WebService::Simple; use XML::Simple; use YAML::Syck; # DBモジュール use DBI; # If you make a CGI, use CGI::Carp; # === Main part === # 引数の取得 my $address = shift() || "戸塚駅"; # ウェブサービスにアクセスする my $geocode = WebService::Simple->new( base_url => "http://maps.google.com/maps/geo", param => { output => 'xml', hl => 'ja', ie => 'UTF8', oe => 'UTF8', } ); # レスポンスの取得 my $response = $geocode->get( { q => $address, } ); # 緯度と経度の取得 my ( $lng, $lat ) = split( /,/, XMLin( $response->content )->{Response}->{Placemark}->{Point} ->{coordinates} ); # データベースへの接続 my $dbh = DBI->connect( 'dbi:mysql:dbname=sample', 'root', 'musashi', { RaiseError => 1, AutoCommit => } ); # ステートメントハンドラの作成 my $sth = $dbh->prepare("SELECT shopname, lat, lng FROM renoir;"); # ステートメントハンドラの実行 # もしプレースホルダを用いていれば、引数を指定する # 例: $sth->execute("$query%"); $sth->execute(); # データを格納するハッシュを宣言 my %distance; # do something while ( my @row = $sth->fetchrow_array ) { # say "$row[0]: processing..."; $distance{$row[]} = calc_distance($lat, $lng, $row[1], $row[2]); } # ステートメントハンドラの解放 $sth->finish; # データベースハンドラの解放 $dbh->disconnect; foreach my $x (sort { $distance{$a} <=> $distance{$b} } keys %distance) { say "$x: $distance{$x}"; } # === Sub routines === sub calc_distance { my ( $src_lng, $src_lat, $target_lng, $target_lat ) = @_; $src_lng = deg2rad($src_lng); $src_lat = deg2rad($src_lat); $target_lng = deg2rad($target_lng); $target_lat = deg2rad($target_lat); my $lat = abs($src_lat - $target_lat); my $lng = abs($src_lng - $target_lng); my $disp_lng = 6378137 * $lng * cos($src_lat); my $disp_lat = 6378137 * $lat; return (sqrt(($disp_lng ** 2) + ($disp_lat ** 2))) / 1000; }
kazu634@kazu634-desktop% perl nearby.pl 東京駅 ~/public_html/cgi-bin [3685] 喫茶室ルノアール東京駅八重洲北口店: .435315984950852 CafeRenoirニュー八重洲北口店: .467543208698977 喫茶室ルノアール西銀座店: .642982000229979 喫茶室ルノアール銀座2丁目店: .702398928767422 喫茶室ルノアール日本橋高島屋前店: .732463961865684 喫茶室ルノアール銀座松屋通り店: .740393397722928 喫茶室ルノアールニュー銀座店: .75542502659804 喫茶室ルノアール銀座昭和通り店: .838414132025791 喫茶室ルノアール神田西口店: .869663761208432 CafeRenoir日比谷店: .897535877486945 喫茶室ルノアール神田南口駅前店: 1.01098051357989 喫茶室ルノアール銀座6丁目店: 1.08625003221537 喫茶室ルノアール神田北口駅前店: 1.09072059057988 喫茶室ルノアール歌舞伎座前店: 1.10796217223668 CafeRenoir日本橋三越前店: 1.18155794316319 喫茶室ルノアール新橋第一ホテル横店: 1.48410756949907 喫茶室ルノアールニュー秋葉原店: 1.54212153453434 喫茶室ルノアール秋葉原店: 1.63742738214139 CafeRenoir秋葉原昭和通り口店: 1.69909449355394 喫茶室ルノアール新橋サンルート店: 1.78354029735583 喫茶室ルノアール本郷三丁目店: 2.36420940618699 喫茶室ルノアール水道橋西口店: 2.36967239112471 喫茶室ルノアール芝大門店: 2.4978765111691 CafeRenoir御徒町春日通り店: 2.51018524532367 CafeRenoir上野公園前店: 2.55816645974866 喫茶室ルノアール上野しのばず口店: 2.67644546004129 喫茶室ルノアール飯田橋西口店: 2.77507641963975 喫茶室ルノアール赤坂見附店: 3.30276167166024 喫茶室ルノアール市ヶ谷駅前店: 3.42102550732542 喫茶室ルノアール市ヶ谷外堀通り店: 3.53709343480954 喫茶室ルノアール田町三田口駅前店: 3.66202973989548 喫茶室ルノアール日暮里谷中店: 3.94246072598764 喫茶室ルノアール日暮里東口店: 4.03695060915453 喫茶室ルノアール四谷店: 4.12610587079289 喫茶室ルノアール西日暮里第一店: 4.31473177312909 喫茶室ルノアール品川港南口店: 5.13907013778664 喫茶室ルノアール巣鴨駅前店: 5.27893044081758 喫茶室ルノアール品川高輪口店: 5.35139941874248 喫茶室ルノアール千駄ヶ谷駅前店: 6.23538684551861 喫茶室ルノアール新宿3丁目ビッグスビル店: 6.5453489357914 喫茶室ルノアール大崎ニューシティ店: 6.63945918250293 喫茶室ルノアール亀戸駅前店: 6.74062841206796 喫茶室ルノアールニュー新宿3丁目店: 6.77697915649173 喫茶室ルノアール新宿区役所横店: 7.05072429513845 喫茶室ルノアール高田馬場早稲田通り店: 7.06968951136699 喫茶室ルノアール渋谷シオノギビル店: 7.1240838306852 喫茶室ルノアール代々木西口駅前店: 7.13909675554724 喫茶室ルノアール新宿歌舞伎町店: 7.22403783727057 喫茶室ルノアール池袋東口店: 7.23780226955619 喫茶室ルノアール渋谷宮下公園店: 7.26931877899747 喫茶室ルノアール池袋パルコ横店: 7.3270604674247 喫茶室ルノアールニュー高田馬場店: 7.34290026009566 喫茶室ルノアール高田馬場第一店: 7.36479141976654 喫茶室ルノアール高田馬場ビッグボックス横店: 7.36904123056024 喫茶室ルノアール西武新宿駅前店: 7.40005424996067 喫茶室ルノアール渋谷南口店: 7.49746178714419 喫茶室ルノアール新宿大ガード店: 7.51323188722339 喫茶室ルノアール新宿西口駅前店: 7.58150054032627 喫茶室ルノアール新宿ハルク横店: 7.62020272070804 喫茶室ルノアール新宿小滝橋通り店: 7.64519920897494 喫茶室ルノアール新大久保駅前店: 7.65229083944699 喫茶室ルノアール渋谷東急ハンズ前店: 7.84131966635012 喫茶室ルノアール新宿西口エステックビル店: 7.85758639750782 喫茶室ルノアール大久保店: 8.04062475943237 喫茶室ルノアール西新宿西鉄イン店: 8.05412323485957 喫茶室ルノアール大森駅前店: 8.85907949468314 喫茶室ルノアール中野北口店: 11.3137961270589 喫茶室ルノアール中野サンプラザ前店: 11.4439040084503 喫茶室ルノアール蒲田西口店: 11.6915802640973 喫茶室ルノアール高円寺北口駅前店: 13.0266500378475 喫茶室ルノアール金町店: 13.9275885380925 喫茶室ルノアール京急川崎駅前店: 14.6570012552232 喫茶室ルノアール川崎銀柳街店: 14.8850590342952 喫茶室ルノアール鶴見駅前店: 17.7002234767128 喫茶室ルノアール本八幡店: 18.3395170961463 喫茶室ルノアール三鷹北口駅前店: 22.9806502621709 喫茶室ルノアール横浜元町店: 24.1345490376862 喫茶室ルノアール横浜関内駅前店: 24.7777407408182 喫茶室ルノアール横浜伊勢佐木町店: 25.1164169878391 喫茶室ルノアール川越店: 36.7869920377336 喫茶室ルノアール大船店: 38.0985342051618 喫茶室ルノアール鎌倉駅前店: 38.9676916856126 喫茶室ルノアール立川店: 39.0582655451701 喫茶室ルノアール立川駅前店: 39.0967111720432 喫茶室ルノアール立川南口店: 39.1415652734928 喫茶室ルノアール箱根湯本駅前店: 83.2994705463744 喫茶室ルノアール阿佐ヶ谷駅前店: 15851.4253911619