先日の記事「【WebAPI】住所の一部を検索キーワードとして緯度経度を得る【Perl】」[2016-01-13-1]の続きです。
「ジオコーダAPI」では住所の一部に対してのみ情報を返しますが、「コンテンツジオコーダAPI」はランドマーク名も返します。
しかし、その結果は微妙です。複数の結果が返ってくるときに、どんぴしゃのが1位じゃないことがあるのです。なので、ランドマーク等のキーワードから緯度経度を得るというタスクでは、返ってきた全結果をチェックする必要があります。たぶん。
メモ:
■コード (word2latlong.pl)
■実行例
ミッドタウンといえば東京ミッドタウン、これは納得。
タワーといえば東京タワー、ううむどうかなあ。
なんにせよアドホックなロジックなのでご了承ください。
あとは、この緯度経度を「スタティックマップAPI」で地図画像に変換したりします。
以上、気をつけながらご利用ください。
なお、アプリケーションID (appid) の取得は下記からどうぞ:
http://e.developer.yahoo.co.jp/webservices/register_application
「ジオコーダAPI」では住所の一部に対してのみ情報を返しますが、「コンテンツジオコーダAPI」はランドマーク名も返します。
- YOLP(地図):コンテンツジオコーダAPI - Yahoo!デベロッパーネットワーク
http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/contentsgeocoder.html
しかし、その結果は微妙です。複数の結果が返ってくるときに、どんぴしゃのが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」で地図画像に変換したりします。
- YOLP(地図):Yahoo!スタティックマップAPI - Yahoo!デベロッパーネットワーク
http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/static.html- 例:東京ミッドタウン
http://map.olp.yahooapis.jp/OpenLocalPlatform/V1/static?appid=(YOUR_APP_ID)&pin=35.6657215,139.7310060
- 例:東京ミッドタウン
以上、気をつけながらご利用ください。
なお、アプリケーションID (appid) の取得は下記からどうぞ:
http://e.developer.yahoo.co.jp/webservices/register_application