今日の位置ログ地図

今日は車であちこち行かなきゃならなかったので、モバツイッターの試用をかねて所々でその時居る地名を送っていた。せっかくなので地図上に表示してみた。

方法は、

  1. Twitter API でステータス履歴取得
  2. モバツイッター経由のステータス(地名)抽出
  3. Google Maps API でジオコーディング
  4. Google Maps 地図画像取得 URL 生成

かな。

で、結果。予想以上にしょぼかった…。画像が汚いのは容量抑えるのに JPEG で生成しているため。

もうちょっと経路とかわかるかと思ったんだけどなー。敗因は、

  • 点(地名)が少ない
  • 範囲が広い
  • こんなことする予定じゃなかったので地名がてきとー → 緯度経度取得失敗
  • 送ったつもりの地名が登録できてない、室内かな
  • Twitter でやることじゃない

あたりかな。

一応、ソース。中心の位置とかズーム値とかあとから調整してるよ!

#!/usr/bin/perl
use strict;
use warnings;

use LWP::UserAgent;
use JSON 'jsonToObj';
use YAML 'Dump';
use Readonly;

Readonly my $APIKEY => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
Readonly my $ID => 'hetappi';

my $ua = LWP::UserAgent->new;
my $resp = $ua->get(sprintf 'http://twitter.com/statuses/user_timeline/%s.json', $ID);
my @places; 
foreach (reverse @{jsonToObj($resp->content)}) {
  push @places, $1
    if ($_->{text} =~ /^(.+)\[mb\]$/);
}
print Dump \@places;

my @latlongs;
foreach (do { my %tbl; grep { !$tbl{$_}++ } @places }) {
  my $resp = $ua->get(sprintf 'http://maps.google.com/maps/geo?q=%s&output=json&key=%s', $_, $APIKEY);
  my $obj = jsonToObj($resp->content);
  push @latlongs, {
      lat => $obj->{Placemark}[0]->{Point}->{coordinates}[1],
      long => $obj->{Placemark}[0]->{Point}->{coordinates}[0] }
    if ($obj->{Status}->{code} == 200);
}
print Dump \@latlongs;

my $url =
  'http://maps.google.com/mapdata?' .
  'latitude_e6=35658230&longitude_e6=139697702&zm=20000&w=500&h=500&cc=JP&min_priority=1&image_format=3';
my $no = 51;
$url .=
    sprintf '&Point=b&Point.latitude_e6=%d&Point.longitude_e6=%d&Point.iconid=%d&Point=e',
       $_->{lat} * 1000000, $_->{long} * 1000000, $no++
  foreach (@latlongs);
print $url, "\n";

なぜか駒沢公園が2つあるし、一番遠かった羽田空港ないし、明治公園が北海道だし。
見にくいので改行調整した。

[hetappi@lily work]$ perl ./mkmap.pl
---
- 中野坂上交差点
- 新宿大ガード西
- 四谷4丁目
- 明治公園
- 宮下公園
- 渋谷橋
- 駒沢公園
- 駒沢公園
- 玉川田園調布
- 大鳥居
- 品川シーサイド
- 中目黒
- 道玄坂
- 南青山
- 東京駅
- 国会前
- 新宿区役所
- 中野駅
---
- lat: 35.688699
  long: 139.716125
- lat: 43.334801
  long: 145.598708
- lat: 35.624597
  long: 139.660272
- lat: 35.600729
  long: 139.665848
- lat: 35.569082
  long: 138.554232
- lat: 35.608524
  long: 139.749549
- lat: 35.639115
  long: 139.701178
- lat: 35.65823
  long: 139.697702
- lat: 35.665656
  long: 139.717812
- lat: 35.681099
  long: 139.767084
- lat: 35.463821
  long: 135.400218
- lat: 35.69384
  long: 139.703549
- lat: 35.706032
  long: 139.665652
http://maps.google.com/mapdata?
latitude_e6=35658230&longitude_e6=139697702&zm=20000&w=500&h=500&cc=JP&min_priority=1&image_format=3&
Point=b&Point.latitude_e6=35688699&Point.longitude_e6=139716125&Point.iconid=51&Point=e&
Point=b&Point.latitude_e6=43334801&Point.longitude_e6=145598708&Point.iconid=52&Point=e&
Point=b&Point.latitude_e6=35624597&Point.longitude_e6=139660272&Point.iconid=53&Point=e&
Point=b&Point.latitude_e6=35600729&Point.longitude_e6=139665848&Point.iconid=54&Point=e&
Point=b&Point.latitude_e6=35569082&Point.longitude_e6=138554232&Point.iconid=55&Point=e&
Point=b&Point.latitude_e6=35608524&Point.longitude_e6=139749549&Point.iconid=56&Point=e&
Point=b&Point.latitude_e6=35639115&Point.longitude_e6=139701178&Point.iconid=57&Point=e&
Point=b&Point.latitude_e6=35658230&Point.longitude_e6=139697702&Point.iconid=58&Point=e&
Point=b&Point.latitude_e6=35665656&Point.longitude_e6=139717812&Point.iconid=59&Point=e&
Point=b&Point.latitude_e6=35681099&Point.longitude_e6=139767084&Point.iconid=60&Point=e&
Point=b&Point.latitude_e6=35463821&Point.longitude_e6=135400218&Point.iconid=61&Point=e&
Point=b&Point.latitude_e6=35693840&Point.longitude_e6=139703549&Point.iconid=62&Point=e&
Point=b&Point.latitude_e6=35706032&Point.longitude_e6=139665652&Point.iconid=63&Point=e
[hetappi@lily work]$ 

2007/10/07 追記
ちょっといじった。