古い記事
ランダムジャンプ
新しい記事
先日の記事「【WebAPI】住所の一部を検索キーワードとして緯度経度を得る【Perl】」[2016-01-13-1]の続きです。

「ジオコーダAPI」では住所の一部に対してのみ情報を返しますが、「コンテンツジオコーダAPI」はランドマーク名も返します。


しかし、その結果は微妙です。複数の結果が返ってくるときに、どんぴしゃのが1位じゃないことがあるのです。なので、ランドマーク等のキーワードから緯度経度を得るというタスクでは、返ってきた全結果をチェックする必要があります。たぶん。

メモ:
  • パラメータ category を "landmark,address" にすると住所の一部とランドマーク名のどちらにもマッチする。
  • 複数のマッチ結果が返ってきますが順番が謎。
    • なので、全結果をスキャンする。
  • Genre フィールドが 80 だと住所の一部。
    • これを最優先とする。
  • それ以外は、Name フィールドと検索キーが完全にマッチするかどちらか一方が完全に含まれるかチェックして判断。

■コード (word2latlong.pl)
#!/usr/bin/env perl
use strict;
use warnings;
use LWP::Simple;
use URI::Escape;
use utf8;
use open ':utf8';
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
my $appid = "THISISAPEN";
while (<>) {
    chomp;
    my @r = word_to_latlong({key => $_, appid => $appid});
    print join("\t", @r, $_)."\n";
}
sub word_to_latlong {
    my ($args_ref) = @_;
    my $key = $args_ref->{key};
    my $ek = URI::Escape::uri_escape_utf8($key);
    my $murl =
        "http://contents.search.olp.yahooapis.jp/OpenLocalPlatform/V1/contentsGeoCoder"
        ."?appid=$args_ref->{appid}&query=$ek&category=landmark,address";
    my $r = get($murl);
    my ($lat, $long, $name) = ("", "", "");
    while ($r =~ m{<Feature>(.+?)</Feature>}gsm) {
        my $i = $1;
        my ($genre) = $i =~ m{<Genre>(.+?)</Genre>};
        my ($name_tmp) = $i =~ m{<Name>(.+?)</Name>};
        if ($genre == 80 # 住所の一部
            or $key =~ /\Q$name_tmp\E/
            or $name_tmp =~ /\Q$key\E/
            ) {
            $name = $name_tmp;
            ($lat, $long) = $i =~ m{<Coordinates>(.+?),(.+?)</Coordinates>};
            last;
        }
    }
    return ($lat, $long, $name);
}

■実行例
% cat word2latlong-test.txt
東京都渋谷区
東京都港区
神奈川県横浜市中区
神奈川県足柄上郡山北町
こんにちは
東京タワー
東京ミッドタウン
タワー
ミッドタウン
% ./word2latlong.pl word2latlong-test.txt
139.69822020	35.66403830	東京都渋谷区	東京都渋谷区
139.75160740	35.65807070	東京都港区	東京都港区
139.64218630	35.44470240	神奈川県横浜市中区	神奈川県横浜市中区
139.08383880	35.36060800	神奈川県足柄上郡山北町	神奈川県足柄上郡山北町
			こんにちは
139.7454106	35.6586309	東京タワー	東京タワー
139.7310060	35.6657215	東京ミッドタウン	東京ミッドタウン
139.7454106	35.6586309	東京タワー	タワー
139.7310060	35.6657215	東京ミッドタウン	ミッドタウン

ミッドタウンといえば東京ミッドタウン、これは納得。
タワーといえば東京タワー、ううむどうかなあ。

なんにせよアドホックなロジックなのでご了承ください。

あとは、この緯度経度を「スタティックマップAPI」で地図画像に変換したりします。


以上、気をつけながらご利用ください。

なお、アプリケーションID (appid) の取得は下記からどうぞ:
http://e.developer.yahoo.co.jp/webservices/register_application
Amazonタイムセール祭り