Debuginfo

思考とアウトプット

Perlでタイムゾーンや国名を緯度経度から取得する方法

Instagram APIが緯度経度しか返さなくて、エポックタイムじゃ現地時間がわからない。。 ということで、タイムゾーン(他の情報も)を取得してみようと思います。

調べたら、Geonames.orgという団体がフリーで提供しているようです。

これを使います。

1. ユーザ登録

http://www.geonames.org/loginに行き、ユーザを作ります。

2. Freeで使うためにアクティベート

少し分かりにくいですが、http://www.geonames.org/manageaccount の一番したのリンクをクリックしてアクティベートします。

3. Geo::Geonamesをインストールして使う

Perldocそのままですが、下記のように使います。ポイントはstyle='FULL'で全情報をとってくることですね。

use Geo::Geonames;

my $geo = new Geo::GeoNames(username => 'my_username');
my $place = $geo->find_nearby_placename(
    lat => $lat,
    lng => $lng,
    style => 'FULL'
);
print Dumper $place;
### output 
$VAR1 = [                                                                                                                                                                           
          {
            'toponymName' => 'Hiyoshi',
            'lat' => '35.55601',
            'adminCode2' => '1859635',
            'fcode' => 'PPL',
            'adminName1' => 'Kanagawa',
            'fcodeName' => 'populated place',
            'adminName2' => 'Kawasaki Shi',
            'continentCode' => 'AS',
            'countryName' => 'Japan',
            'fclName' => 'city, village,...',
            'fcl' => 'P',
            'elevation' => '0',
            'adminCode1' => {
                            'content' => '19',
                            'ISO3166-2' => '14'
                          },
            'population' => {},
            'distance' => '1.04355',
            'adminName3' => 'Nakahara Ku',
            'alternateName' => {
                               'content' => "\x{65e5}\x{5409}",
                               'lang' => 'ja'
                             },
            'timezone' => {
                          'gmtOffset' => '9.0',
                          'content' => 'Asia/Tokyo',
                          'dstOffset' => '9.0'
                        },
            'countryCode' => 'JP',
            'adminCode3' => '7470874',
            'geonameId' => '1862322',
            'name' => 'Hiyoshi',
            'alternateNames' => "Hiyoshi,Hiyoshicho,Hiyoshich\x{14d},ri ji,\x{65e5}\x{5409}",
            'lng' => '139.64289'
          }
        ];

Google API は制限あるし、返り値が好きじゃないので、こちらを使ってみることにします。