210 lines
21 KiB
Markdown
210 lines
21 KiB
Markdown
---
|
||
title: 最寄りのルノアールを検索するためのスクリプト
|
||
author: kazu634
|
||
date: 1969-12-31
|
||
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
|
||
|
||
---
|
||
<div class="section">
|
||
<p>
|
||
2点間の緯度と経度がわかれば距離が計算できるので、それを用いて最寄りのルノアールを検索するスクリプトを作成してみました(すでにルノアールの緯度と経度のデータを取得済みであることが前提になっています)。
|
||
</p>
|
||
|
||
<h4>
|
||
Perlスクリプト
|
||
</h4>
|
||
|
||
<pre class="syntax-highlight">
|
||
<span class="synComment"># === Libraries ===</span>
|
||
<span class="synStatement">use strict</span>;
|
||
<span class="synStatement">use warnings</span>;
|
||
<span class="synComment"># 警告用のモジュール</span>
|
||
<span class="synStatement">use </span>Data::Dumper;
|
||
<span class="synComment"># sayを使う</span>
|
||
<span class="synStatement">use </span>Perl6::Say;
|
||
<span class="synComment"># ラジアンに変換するためのモジュール</span>
|
||
<span class="synStatement">use </span>Math::Trig;
|
||
<span class="synComment"># ウェブサービスにアクセスするためのモジュール</span>
|
||
<span class="synStatement">use </span>WebService::Simple;
|
||
<span class="synStatement">use </span>XML::Simple;
|
||
<span class="synStatement">use </span>YAML::Syck;
|
||
<span class="synComment"># DBモジュール</span>
|
||
<span class="synStatement">use </span>DBI;
|
||
<span class="synComment"># If you make a CGI,</span>
|
||
<span class="synStatement">use </span>CGI::Carp;
|
||
<span class="synComment"># === Main part ===</span>
|
||
<span class="synComment"># 引数の取得</span>
|
||
<span class="synStatement">my</span> <span class="synIdentifier">$address</span> = <span class="synStatement">shift</span>() || <span class="synConstant">"戸塚駅"</span>;
|
||
<span class="synComment"># ウェブサービスにアクセスする</span>
|
||
<span class="synStatement">my</span> <span class="synIdentifier">$geocode</span> = WebService::Simple-><span class="synStatement">new</span>(
|
||
<span class="synConstant">base_url </span>=> <span class="synConstant">"http://maps.google.com/maps/geo"</span>,
|
||
<span class="synConstant">param </span>=> {
|
||
<span class="synConstant">output </span>=> <span class="synConstant">'xml'</span>,
|
||
<span class="synConstant">hl </span>=> <span class="synConstant">'ja'</span>,
|
||
<span class="synConstant">ie </span>=> <span class="synConstant">'UTF8'</span>,
|
||
<span class="synConstant">oe </span>=> <span class="synConstant">'UTF8'</span>,
|
||
}
|
||
);
|
||
<span class="synComment"># レスポンスの取得</span>
|
||
<span class="synStatement">my</span> <span class="synIdentifier">$response</span> = <span class="synIdentifier">$geocode</span>->get( { <span class="synConstant">q </span>=> <span class="synIdentifier">$address</span>, } );
|
||
<span class="synComment"># 緯度と経度の取得</span>
|
||
<span class="synStatement">my</span> ( <span class="synIdentifier">$lng</span>, <span class="synIdentifier">$lat</span> ) = <span class="synStatement">split</span>( <span class="synStatement">/</span><span class="synConstant">,</span><span class="synStatement">/</span>,
|
||
XMLin( <span class="synIdentifier">$response</span>->content )->{Response}->{Placemark}->{Point}
|
||
->{coordinates} );
|
||
<span class="synComment"># データベースへの接続</span>
|
||
<span class="synStatement">my</span> <span class="synIdentifier">$dbh</span> =
|
||
DBI-><span class="synStatement">connect</span>( <span class="synConstant">'dbi:mysql:dbname=sample'</span>, <span class="synConstant">'root'</span>, <span class="synConstant">'musashi'</span>,
|
||
{ <span class="synConstant">RaiseError </span>=> <span class="synConstant">1</span>, <span class="synConstant">AutoCommit </span>=> <span class="synConstant"></span>} );
|
||
<span class="synComment"># ステートメントハンドラの作成</span>
|
||
<span class="synStatement">my</span> <span class="synIdentifier">$sth</span> = <span class="synIdentifier">$dbh</span>->prepare(<span class="synConstant">"SELECT shopname, lat, lng FROM renoir;"</span>);
|
||
<span class="synComment"># ステートメントハンドラの実行</span>
|
||
<span class="synComment"># もしプレースホルダを用いていれば、引数を指定する</span>
|
||
<span class="synComment"># 例: $sth->execute("$query%");</span>
|
||
<span class="synIdentifier">$sth</span>->execute();
|
||
<span class="synComment"># データを格納するハッシュを宣言</span>
|
||
<span class="synStatement">my</span> <span class="synIdentifier">%distance</span>;
|
||
<span class="synComment"># do something</span>
|
||
<span class="synStatement">while</span> ( <span class="synStatement">my</span> <span class="synIdentifier">@row</span> = <span class="synIdentifier">$sth</span>->fetchrow_array ) {
|
||
<span class="synComment"># say "$row[0]: processing...";</span>
|
||
<span class="synIdentifier">$distance</span>{<span class="synIdentifier">$row</span>[<span class="synConstant"></span>]} = calc_distance(<span class="synIdentifier">$lat</span>, <span class="synIdentifier">$lng</span>, <span class="synIdentifier">$row</span>[<span class="synConstant">1</span>], <span class="synIdentifier">$row</span>[<span class="synConstant">2</span>]);
|
||
}
|
||
<span class="synComment"># ステートメントハンドラの解放</span>
|
||
<span class="synIdentifier">$sth</span>->finish;
|
||
<span class="synComment"># データベースハンドラの解放</span>
|
||
<span class="synIdentifier">$dbh</span>->disconnect;
|
||
<span class="synStatement">foreach</span> <span class="synStatement">my</span> <span class="synIdentifier">$x</span> (<span class="synStatement">sort</span> { <span class="synIdentifier">$distance</span>{<span class="synIdentifier">$a</span>} <=> <span class="synIdentifier">$distance</span>{<span class="synIdentifier">$b</span>} } <span class="synStatement">keys</span> <span class="synIdentifier">%distance</span>) {
|
||
say <span class="synConstant">"</span><span class="synIdentifier">$x</span><span class="synConstant">: </span><span class="synIdentifier">$distance</span><span class="synConstant">{</span><span class="synIdentifier">$x</span><span class="synConstant">}"</span>;
|
||
}
|
||
<span class="synComment"># === Sub routines ===</span>
|
||
<span class="synStatement">sub</span><span class="synIdentifier"> calc_distance </span>{
|
||
<span class="synStatement">my</span> ( <span class="synIdentifier">$src_lng</span>, <span class="synIdentifier">$src_lat</span>, <span class="synIdentifier">$target_lng</span>, <span class="synIdentifier">$target_lat</span> ) = <span class="synIdentifier">@_</span>;
|
||
<span class="synIdentifier">$src_lng</span> = deg2rad(<span class="synIdentifier">$src_lng</span>);
|
||
<span class="synIdentifier">$src_lat</span> = deg2rad(<span class="synIdentifier">$src_lat</span>);
|
||
<span class="synIdentifier">$target_lng</span> = deg2rad(<span class="synIdentifier">$target_lng</span>);
|
||
<span class="synIdentifier">$target_lat</span> = deg2rad(<span class="synIdentifier">$target_lat</span>);
|
||
<span class="synStatement">my</span> <span class="synIdentifier">$lat</span> = <span class="synStatement">abs</span>(<span class="synIdentifier">$src_lat</span> - <span class="synIdentifier">$target_lat</span>);
|
||
<span class="synStatement">my</span> <span class="synIdentifier">$lng</span> = <span class="synStatement">abs</span>(<span class="synIdentifier">$src_lng</span> - <span class="synIdentifier">$target_lng</span>);
|
||
<span class="synStatement">my</span> <span class="synIdentifier">$disp_lng</span> = <span class="synConstant">6378137</span> * <span class="synIdentifier">$lng</span> * <span class="synStatement">cos</span>(<span class="synIdentifier">$src_lat</span>);
|
||
<span class="synStatement">my</span> <span class="synIdentifier">$disp_lat</span> = <span class="synConstant">6378137</span> * <span class="synIdentifier">$lat</span>;
|
||
<span class="synStatement">return</span> (<span class="synStatement">sqrt</span>((<span class="synIdentifier">$disp_lng</span> ** <span class="synConstant">2</span>) + (<span class="synIdentifier">$disp_lat</span> ** <span class="synConstant">2</span>))) / <span class="synConstant">1000</span>;
|
||
}
|
||
</pre>
|
||
|
||
<h4>
|
||
実行結果
|
||
</h4>
|
||
|
||
<pre class="syntax-highlight">
|
||
kazu634@kazu634-desktop% perl nearby.pl 東京駅 ~/public_html/cgi-bin <span class="synStatement">[</span><span class="synConstant">3685</span><span class="synStatement">]</span>
|
||
喫茶室ルノアール東京駅八重洲北口店: <span class="synConstant"></span>.<span class="synConstant">435315984950852</span>
|
||
CafeRenoirニュー八重洲北口店: <span class="synConstant"></span>.<span class="synConstant">467543208698977</span>
|
||
喫茶室ルノアール西銀座店: <span class="synConstant"></span>.<span class="synConstant">642982000229979</span>
|
||
喫茶室ルノアール銀座2丁目店: <span class="synConstant"></span>.<span class="synConstant">702398928767422</span>
|
||
喫茶室ルノアール日本橋高島屋前店: <span class="synConstant"></span>.<span class="synConstant">732463961865684</span>
|
||
喫茶室ルノアール銀座松屋通り店: <span class="synConstant"></span>.<span class="synConstant">740393397722928</span>
|
||
喫茶室ルノアールニュー銀座店: <span class="synConstant"></span>.<span class="synConstant">75542502659804</span>
|
||
喫茶室ルノアール銀座昭和通り店: <span class="synConstant"></span>.<span class="synConstant">838414132025791</span>
|
||
喫茶室ルノアール神田西口店: <span class="synConstant"></span>.<span class="synConstant">869663761208432</span>
|
||
CafeRenoir日比谷店: <span class="synConstant"></span>.<span class="synConstant">897535877486945</span>
|
||
喫茶室ルノアール神田南口駅前店: <span class="synConstant">1</span>.<span class="synConstant">01098051357989</span>
|
||
喫茶室ルノアール銀座6丁目店: <span class="synConstant">1</span>.<span class="synConstant">08625003221537</span>
|
||
喫茶室ルノアール神田北口駅前店: <span class="synConstant">1</span>.<span class="synConstant">09072059057988</span>
|
||
喫茶室ルノアール歌舞伎座前店: <span class="synConstant">1</span>.<span class="synConstant">10796217223668</span>
|
||
CafeRenoir日本橋三越前店: <span class="synConstant">1</span>.<span class="synConstant">18155794316319</span>
|
||
喫茶室ルノアール新橋第一ホテル横店: <span class="synConstant">1</span>.<span class="synConstant">48410756949907</span>
|
||
喫茶室ルノアールニュー秋葉原店: <span class="synConstant">1</span>.<span class="synConstant">54212153453434</span>
|
||
喫茶室ルノアール秋葉原店: <span class="synConstant">1</span>.<span class="synConstant">63742738214139</span>
|
||
CafeRenoir秋葉原昭和通り口店: <span class="synConstant">1</span>.<span class="synConstant">69909449355394</span>
|
||
喫茶室ルノアール新橋サンルート店: <span class="synConstant">1</span>.<span class="synConstant">78354029735583</span>
|
||
喫茶室ルノアール本郷三丁目店: <span class="synConstant">2</span>.<span class="synConstant">36420940618699</span>
|
||
喫茶室ルノアール水道橋西口店: <span class="synConstant">2</span>.<span class="synConstant">36967239112471</span>
|
||
喫茶室ルノアール芝大門店: <span class="synConstant">2</span>.<span class="synConstant">4978765111691</span>
|
||
CafeRenoir御徒町春日通り店: <span class="synConstant">2</span>.<span class="synConstant">51018524532367</span>
|
||
CafeRenoir上野公園前店: <span class="synConstant">2</span>.<span class="synConstant">55816645974866</span>
|
||
喫茶室ルノアール上野しのばず口店: <span class="synConstant">2</span>.<span class="synConstant">67644546004129</span>
|
||
喫茶室ルノアール飯田橋西口店: <span class="synConstant">2</span>.<span class="synConstant">77507641963975</span>
|
||
喫茶室ルノアール赤坂見附店: <span class="synConstant">3</span>.<span class="synConstant">30276167166024</span>
|
||
喫茶室ルノアール市ヶ谷駅前店: <span class="synConstant">3</span>.<span class="synConstant">42102550732542</span>
|
||
喫茶室ルノアール市ヶ谷外堀通り店: <span class="synConstant">3</span>.<span class="synConstant">53709343480954</span>
|
||
喫茶室ルノアール田町三田口駅前店: <span class="synConstant">3</span>.<span class="synConstant">66202973989548</span>
|
||
喫茶室ルノアール日暮里谷中店: <span class="synConstant">3</span>.<span class="synConstant">94246072598764</span>
|
||
喫茶室ルノアール日暮里東口店: <span class="synConstant">4</span>.<span class="synConstant">03695060915453</span>
|
||
喫茶室ルノアール四谷店: <span class="synConstant">4</span>.<span class="synConstant">12610587079289</span>
|
||
喫茶室ルノアール西日暮里第一店: <span class="synConstant">4</span>.<span class="synConstant">31473177312909</span>
|
||
喫茶室ルノアール品川港南口店: <span class="synConstant">5</span>.<span class="synConstant">13907013778664</span>
|
||
喫茶室ルノアール巣鴨駅前店: <span class="synConstant">5</span>.<span class="synConstant">27893044081758</span>
|
||
喫茶室ルノアール品川高輪口店: <span class="synConstant">5</span>.<span class="synConstant">35139941874248</span>
|
||
喫茶室ルノアール千駄ヶ谷駅前店: <span class="synConstant">6</span>.<span class="synConstant">23538684551861</span>
|
||
喫茶室ルノアール新宿<span class="synConstant">3</span>丁目ビッグスビル店: <span class="synConstant">6</span>.<span class="synConstant">5453489357914</span>
|
||
喫茶室ルノアール大崎ニューシティ店: <span class="synConstant">6</span>.<span class="synConstant">63945918250293</span>
|
||
喫茶室ルノアール亀戸駅前店: <span class="synConstant">6</span>.<span class="synConstant">74062841206796</span>
|
||
喫茶室ルノアールニュー新宿<span class="synConstant">3</span>丁目店: <span class="synConstant">6</span>.<span class="synConstant">77697915649173</span>
|
||
喫茶室ルノアール新宿区役所横店: <span class="synConstant">7</span>.<span class="synConstant">05072429513845</span>
|
||
喫茶室ルノアール高田馬場早稲田通り店: <span class="synConstant">7</span>.<span class="synConstant">06968951136699</span>
|
||
喫茶室ルノアール渋谷シオノギビル店: <span class="synConstant">7</span>.<span class="synConstant">1240838306852</span>
|
||
喫茶室ルノアール代々木西口駅前店: <span class="synConstant">7</span>.<span class="synConstant">13909675554724</span>
|
||
喫茶室ルノアール新宿歌舞伎町店: <span class="synConstant">7</span>.<span class="synConstant">22403783727057</span>
|
||
喫茶室ルノアール池袋東口店: <span class="synConstant">7</span>.<span class="synConstant">23780226955619</span>
|
||
喫茶室ルノアール渋谷宮下公園店: <span class="synConstant">7</span>.<span class="synConstant">26931877899747</span>
|
||
喫茶室ルノアール池袋パルコ横店: <span class="synConstant">7</span>.<span class="synConstant">3270604674247</span>
|
||
喫茶室ルノアールニュー高田馬場店: <span class="synConstant">7</span>.<span class="synConstant">34290026009566</span>
|
||
喫茶室ルノアール高田馬場第一店: <span class="synConstant">7</span>.<span class="synConstant">36479141976654</span>
|
||
喫茶室ルノアール高田馬場ビッグボックス横店: <span class="synConstant">7</span>.<span class="synConstant">36904123056024</span>
|
||
喫茶室ルノアール西武新宿駅前店: <span class="synConstant">7</span>.<span class="synConstant">40005424996067</span>
|
||
喫茶室ルノアール渋谷南口店: <span class="synConstant">7</span>.<span class="synConstant">49746178714419</span>
|
||
喫茶室ルノアール新宿大ガード店: <span class="synConstant">7</span>.<span class="synConstant">51323188722339</span>
|
||
喫茶室ルノアール新宿西口駅前店: <span class="synConstant">7</span>.<span class="synConstant">58150054032627</span>
|
||
喫茶室ルノアール新宿ハルク横店: <span class="synConstant">7</span>.<span class="synConstant">62020272070804</span>
|
||
喫茶室ルノアール新宿小滝橋通り店: <span class="synConstant">7</span>.<span class="synConstant">64519920897494</span>
|
||
喫茶室ルノアール新大久保駅前店: <span class="synConstant">7</span>.<span class="synConstant">65229083944699</span>
|
||
喫茶室ルノアール渋谷東急ハンズ前店: <span class="synConstant">7</span>.<span class="synConstant">84131966635012</span>
|
||
喫茶室ルノアール新宿西口エステックビル店: <span class="synConstant">7</span>.<span class="synConstant">85758639750782</span>
|
||
喫茶室ルノアール大久保店: <span class="synConstant">8</span>.<span class="synConstant">04062475943237</span>
|
||
喫茶室ルノアール西新宿西鉄イン店: <span class="synConstant">8</span>.<span class="synConstant">05412323485957</span>
|
||
喫茶室ルノアール大森駅前店: <span class="synConstant">8</span>.<span class="synConstant">85907949468314</span>
|
||
喫茶室ルノアール中野北口店: <span class="synConstant">11</span>.<span class="synConstant">3137961270589</span>
|
||
喫茶室ルノアール中野サンプラザ前店: <span class="synConstant">11</span>.<span class="synConstant">4439040084503</span>
|
||
喫茶室ルノアール蒲田西口店: <span class="synConstant">11</span>.<span class="synConstant">6915802640973</span>
|
||
喫茶室ルノアール高円寺北口駅前店: <span class="synConstant">13</span>.<span class="synConstant">0266500378475</span>
|
||
喫茶室ルノアール金町店: <span class="synConstant">13</span>.<span class="synConstant">9275885380925</span>
|
||
喫茶室ルノアール京急川崎駅前店: <span class="synConstant">14</span>.<span class="synConstant">6570012552232</span>
|
||
喫茶室ルノアール川崎銀柳街店: <span class="synConstant">14</span>.<span class="synConstant">8850590342952</span>
|
||
喫茶室ルノアール鶴見駅前店: <span class="synConstant">17</span>.<span class="synConstant">7002234767128</span>
|
||
喫茶室ルノアール本八幡店: <span class="synConstant">18</span>.<span class="synConstant">3395170961463</span>
|
||
喫茶室ルノアール三鷹北口駅前店: <span class="synConstant">22</span>.<span class="synConstant">9806502621709</span>
|
||
喫茶室ルノアール横浜元町店: <span class="synConstant">24</span>.<span class="synConstant">1345490376862</span>
|
||
喫茶室ルノアール横浜関内駅前店: <span class="synConstant">24</span>.<span class="synConstant">7777407408182</span>
|
||
喫茶室ルノアール横浜伊勢佐木町店: <span class="synConstant">25</span>.<span class="synConstant">1164169878391</span>
|
||
喫茶室ルノアール川越店: <span class="synConstant">36</span>.<span class="synConstant">7869920377336</span>
|
||
喫茶室ルノアール大船店: <span class="synConstant">38</span>.<span class="synConstant">0985342051618</span>
|
||
喫茶室ルノアール鎌倉駅前店: <span class="synConstant">38</span>.<span class="synConstant">9676916856126</span>
|
||
喫茶室ルノアール立川店: <span class="synConstant">39</span>.<span class="synConstant">0582655451701</span>
|
||
喫茶室ルノアール立川駅前店: <span class="synConstant">39</span>.<span class="synConstant">0967111720432</span>
|
||
喫茶室ルノアール立川南口店: <span class="synConstant">39</span>.<span class="synConstant">1415652734928</span>
|
||
喫茶室ルノアール箱根湯本駅前店: <span class="synConstant">83</span>.<span class="synConstant">2994705463744</span>
|
||
喫茶室ルノアール阿佐ヶ谷駅前店: <span class="synConstant">15851</span>.<span class="synConstant">4253911619</span>
|
||
</pre>
|
||
|
||
<h4>
|
||
「ルノアール」に関連する最近のエントリ
|
||
</h4>
|
||
|
||
<ul>
|
||
<li>
|
||
<a href="http://d.hatena.ne.jp/sirocco634/20090804/1249395277" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/sirocco634/20090804/1249395277', ' 2地点間の緯度と経度から直線距離を計算する – 武蔵の日記');" target="_blank"> 2地点間の緯度と経度から直線距離を計算する – 武蔵の日記</a>
|
||
</li>
|
||
<li>
|
||
<a href="http://d.hatena.ne.jp/sirocco634/20090711/1247321788" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/sirocco634/20090711/1247321788', ' CSVファイルからDBにデータを登録する – 武蔵の日記');" target="_blank"> CSVファイルからDBにデータを登録する – 武蔵の日記</a>
|
||
</li>
|
||
<li>
|
||
<a href="http://d.hatena.ne.jp/sirocco634/20090708/1247061024" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/sirocco634/20090708/1247061024', ' このように書くときれいにスクレイピングできた – 武蔵の日記');" target="_blank"> このように書くときれいにスクレイピングできた – 武蔵の日記</a>
|
||
</li>
|
||
<li>
|
||
<a href="http://d.hatena.ne.jp/sirocco634/20090705/1246756265" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/sirocco634/20090705/1246756265', ' 住所から経度と緯度を取得する – 武蔵の日記');" target="_blank"> 住所から経度と緯度を取得する – 武蔵の日記</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|