住所から緯度経度を取得する
2015年12月29日 (火) 12:52時点におけるimported>Webmasterによる版
目的
国土交通省の街区レベル位置参照情報とauホームページの「実効速度について」の情報から、住所をキーとして緯度経度を抽出して、速度の中央値を算したいとおもいます
考え方の注意
今回のプログラムは、簡単に説明すれば2つのファイルの共通事項(キー:ここでは測定場所・住所)を比較して、合致(ヒット)したら、出力するという簡単な動作ですが、作り方を失敗すると途方も無い時間がかかるプログラムになります。
今回のサンプルでは
- 緯度経度の入っている街区レベル位置参照情報で26万レコード
- auホームページの「実効速度についての測定ポイントが1500ヶ所
総当たりで、検索をした場合3.9億回ループを回すことになります。全最後までループが回るとは考えられませんが、それでも相当な時間がかかるプログラムになると予想できます
しかし総当たりしないと「ヒット」するか否か分かりません。従って時間短縮のためにどうするかを考えます
キーのメモリ読み込み
ディスクアクセスに相当な時間がかかるので、キーとなる情報をメモリ内に読み込ませてループを回します。そうすることでかなりの時間が短縮されます。
また、応用としてキーとなる情報を事前に出来るだけ減らしてメモリ内に読み込ませれば、さらに時間短縮なります。
プログラム
自分の勉強用に、いろいろ理解しながら書いてます
動作内容を丁寧にコメントアウトしていますので、ソースを見ながら理解してください。
文字列操作
宮崎県宮崎市佐土原町下田島 付近 (1)
の 付近 (1)
が邪魔なので、Perlによる指定文字列以降削除の確認プログラム
結果としては
入力文字:宮崎県宮崎市佐土原町下田島 付近 (1) 出力文字:宮崎県宮崎市佐土原町下田島
となる
#ソースファイルは UTF8形式で保存
use strict;
use warnings;
#内部処理はUTF-8で行う
use utf8;
use Encode;
my $moji1 = '宮崎県宮崎市佐土原町下田島 付近 (1)';
$moji1 =~ s/ 付近.*$//;
#Windows7への出力はShift-JISで(こうしないと文字化けする)
#最後の*はスペースが入っていない事を確認するための印
print Encode::encode('shiftjis',$moji1.'*' );