Linux アプリ開発 未分類

【小技】GoogleのGeocodingに住所から緯度経度を検索

天下のグーグルさんには、こんな便利なサービスまでやっている。
Geocoding - 住所から緯度経度を検索
ある特定の住所の緯度経度を知るには、これで十分なのではないだろうか?
必要に迫られ、ある住所たちの緯度経度がほしかったため、以下のようなぜんぜん何も考えていないコードをPerlで記述。常套句とか基本とか綺麗に書くとかそういうものは無視してますので、万が一お使いになる際には、そのまま使わないでじっくりコードを眺めて直すところ直してお使いください。
既出で、他にも良いコードがたくさんあると思いますので、参考までに、ということで。
以下の項目を持ったCSVがあるとする。
名前は「Adress.csv」で内容は、以下のようになっている場合。
[名前] [郵便番号] [住所] [電話番号]
このCSVファイルから、住所をキーにしてgeocodingから緯度経度を得たい。
結果ファイルは、
[緯度] [経度] [名前] [郵便番号] [住所] [電話番号]
というファイルにし、後でエクセルなどで編集することにする。
なんで緯度経度を前に持ってきたかというと、項目のズレを気にしてのことで深い意味はありません。
以下がコード。仮に「geocoding.pl」としておきましょう。

#!/usr/bin/perl
use strict;
use warnings;
# 引数の処理
my $file = "Adress.csv";
my $url = "http://www.geocoding.jp/api/?q=";
unless( $file ){
    # 引数が無い場合は終了。
    die "Usage: $0 file";
}
# csv形式のデータを配列の配列にする。
my @records = parse_file( $file );
# 2次元配列だから、foreach
foreach my $items ( @records ){
    my $request = $url . @{$items}[2];
    # いろいろ面倒だったので、XML保存して上と同じように、
    # グルグル回して緯度と経度の部分を取り出す。
    # エラーや、結果がない場合は項目がない場合、空になる。
    `wget -q "$request" -O temp.txt`;
    my @temp_recs = parse_file( "temp.txt" );
    my $coordinate = ",";
    foreach my $temp_items ( @temp_recs ){
        my $text = @{$temp_items}[0];
        if ( $text =~ // ){
            $text =~ s/|<
            $coordinate = $text;
        }
        elsif ( $text =~ // ){
            $text =~ s/|<
            $coordinate .= ",".$text;
        }
    }
    my $source = join( ',', @{ $items } );
    print $coordinate.",".$source."n";
    # 5秒待機
    sleep 5;
}

結果は、普通に「print」で表示されるので、コマンドラインで以下のようにファイルに突っ込めばいい。

perl geocoding.pl > res.csv

※あ、上のコマンドの記号、大文字になってます。
やる気のないコードでお粗末さまでした。

-Linux, アプリ開発, 未分類
-, ,

Copyright© LAPTURE , 2020 All Rights Reserved.