« "Bubble" generation and "Post-bubble" generation | メイン | GPS is accurate, but map info is not? »

GPSは正確だが、地図情報は?

渋谷・西武百貨店から東急東横店を望むとある方にレクチャーを受け、GPS機能付きケータイA5401CAを入手。思えば2001年夏から考えていた、携帯と位置情報サービスを組み合わせる、という構想が、ようやく実現したことになる。

そこで、さっそく位置情報を組み合わせたmobloggingをテストしてみたのだが、意外にも地図情報に発見(落とし穴?)があったので、さっそくレポートしておく。

ほぼ正確な場所まずはGPS情報を基に取得した地図情報。撮影した場所でのGPS精度は3段階の1番上(Aランク)だったので、かなり正確な位置を取得できているのが分かる(誤差は10メートル未満)。
ただ、私自身はオンライン地図として、通常Mapionを使っているため、こちらの地図の方によりなじみが深い。そこで、取得した緯度・経度情報を基に、Mapionで地図を表示させてみた。

mapion.jpgところが、これが全然違う場所で、400メートルほど離れた神南小学校辺りと出た。もしかしたら、緯度・経度情報の与え方が間違っているのかもしれないが、どちらにしても今後、mobloggingにGPS情報が多用されていくことを考えると、地図中にカバーされている他の情報(飲食店情報など)の価値が、今後高まっていくのは間違いない。そのとき、この問題が利用を阻害しないようになっていて欲しいものである。

トラックバック

このエントリーのトラックバックURL:
http://www.syncworld.net/cgi-bin/mt/mt-tb.cgi/897

この一覧は、次のエントリーを参照しています: GPSは正確だが、地図情報は?:

» GPSと地図サービスのズレ 送信元 tarosite.net™
 Sync A World You Want To Exploreより。GPSケータイで取得したGPS情報を元に、@NAVI.com(auのGPSケータイが標準で参照する地図サービス)とMapionとで表示される地図を比較したところ、400mも誤差が出た、という指摘。  本来GPS情報は絶対座標であるはず。@NAVI.com... [詳しくはこちら]

» GPSテ洋oblog 送信元 s0s_bl0g
GPSテ洋oblog縺九=縲 [詳しくはこちら]

» 暑いんで moblog mail gateway を立ててみた 送信元 JuNya KOBORI's Miscellaneous Impressions Page
梅雨があけたそうで。自分には梅雨の次に鬱陶しい夏本番の始まりっすよ。さっさと夏は終わって涼しい秋、そして寒さが身にしみる冬になればいいなー。と、いきなり画像と関係のないコメントをしてみました。 画像は何も映っていないテレビ画面を延々と凝視しているにゃん... [詳しくはこちら]

» GPS 位置情報を利用したBlogサービス 送信元 Goodpic
GPS対応携帯が普通に売られている国に住んでいるわけなので、 ちょっとBLOGと位置情報に関して調べてみました。 BLOG同士を位置情報ベースに結びつけるサービスを調べてみたら、 こんなものがあるようです。 〓 GeoURL ICBM Address Server http://geourl.org/    サ... [詳しくはこちら]

» moblogとGPS 送信元 Gaia's blog
今日は今自分が使っている携帯をいじくり回していた。 「写真を貼付してメール送信するだけじゃなくて、 なんかもっと面白い使い方ができないものかなぁ?」 と思ったのだ。 そしたらありました!それはGPS機能! この機能、今の端末を購入した日以来使ってませんよ。 ん... [詳しくはこちら]

» 現在の状況 送信元 Okusa NOW
rdiary.rbをmovabletypeに移植しようとするが失敗。 日本語が含まれているとエラーが出る。 しょうがないので人様が作成したものを使用。 参考にしたもの http://minken.net/mt/archives/000064.html http://www.syncworld.net/blog/nob/archives/000961.html... [詳しくはこちら]

» GPS情報 送信元 はいぱぁあくてぃぶ・沈没日誌
auの携帯はGPS機能がついてるモノが多いのですが、写真にGPS情報を付加することが出来ます。 GPS情報はJPEGファイルにExif情報というかたちで埋め込まれています。 実は数ヶ月間ずっと、GPS情報がJPEGファイルに埋め込まれているとは思わず、文字列のテキストとしてJPEGフ... [詳しくはこちら]

» AddMaps プラグイン 送信元 foo
アップロードされた画像ファイルに位置情報が含まれていたら、地図へのリンクを付加するプラグイン。Movable Type のプラグイン自体初めて書くので、なにか変なことをしているかも。 いままで自作のmoblogスクリプトで位置を取り出していたのだが、エントリー前に本文を書... [詳しくはこちら]

» 携帯電話のGPSを活用しているサイト2 送信元 携帯GPSミックス
昨日紹介したスクリプトが拡張されています。 Sync A World You Want To Explore 詳しくはGPSは正確だが、地図情報は?という、エントリーをどうぞ。... [詳しくはこちら]

» GPS MOBLOG GATEWAYインストール 送信元 soanblog 創庵
これまで、平田さんのmoblog gatewayサービスを活用させてもらっていたのですが、申し訳ないので、自前にしました。 foo: moblogシステム概要さんのスクリプトを参考にインストール。 これ、実は、GPS情報をパースしてくれるすぐれものですが、まだGPS携帯もってま... [詳しくはこちら]

» GPS情報付きMoblog 送信元 FLAT*PLANET
★<Mapion>が<i-mode>以外の携帯にも対応しましたね。とりあえず閲覧だけですが、EZweb、Vodafone live!でも見ることが可能です。左の大きい画像がPC用、右の小さいのが携帯用(QVGA/240×256) [詳しくはこちら]

コメント (15)

genesis:

これは、世界測地系移行で起きた問題だと思います。
どちらかが日本測地系でずれてしまったのでは?

とある方@赤坂です。

おー、もう購入してしまわれましたか。早い。さすがだ。レクチャー(?)の甲斐がありました。

GPS Moblogging人口、au の使い勝手の良い端末の普及とともに、広がりそうですね。

Docomo も負けじ(?)と、富士山周辺のゴミの位置を GPS で確認する NPO のサービスを始めましたね。

http://fujisan1.docomo-sys.com/MtFuji_a/

GPS と Mobile Data service を組み合わせると、いろいろなことが出来そうです。各キャリアから競合するサービスが提供されて、サービスの質が切磋琢磨される環境に早くなって欲しいものですね。

もっとも本当に西武百貨店前が、この緯度・経度で正しいのか、という問題は残ります。

つまり、auのGPSサービスによる位置情報が、Navi.comの持っている情報から作成されているなら、一見Navi.comが正しく見えているだけ、という可能性もあり得ます。

だれか、独立したGPS機器で、渋谷ハチ公前交差点の緯度・経度を測定して、レポートしてくれませんか〜。

genesis:

どちらも同じ、北緯35度39分34.72、東経139度42分2.51
と言う座標軸である以上、
地図を表示するシステムで偽りの座標を表示するというのはありえないでしょう。

ちょっと、この問題について簡単に述べたサイトを探したんですが、
http://www.wakam.com/kokishin/ido.html
に有るので読んでみてください。
ちょうど、測地系分の誤差が出ていますから。

genesis:

世界測地系から、日本測地系に変換した地図を出してみました。
http://www.mapion.co.jp/c/f?el=139/42/14.129&scl=10000&pnf=1&sfn=all_maps_00&uc=1&grp=all&nl=35/39/23.056&size=500,500&

確かに変換したら、同じ場所になっていますね!

それにご紹介いただいたサイト、いろいろ有用な情報が載っていて大変参考になります。

mobloggingのソフトを開発する上でも参考になるでしょうね。

元のpost2blogをちょっと拡張してみました。

・MovableTypeのカテゴリーに対応
・Mapion、@NAVI.comの両方の地図に対応
・Mapion用に座標軸を日本測地系へ変換
・最新の写真を参照できるlatest.category.jpgファイルを作成

とりあえず元ソースからのdiffを以下に。最後の方、日本語のコメントが化けていますが、大勢に影響がないので、とりあえずこのままで。

元ソースのご本人の了解が出たら、ちょっと化粧直しさせます。

2c2,5
<
---
>
> ### NOTE: umask 0022 is needed if you want to create a refferable "latest" file in some directories. umask 0000 if want to make it overwritten
> umask 0022;
>
9a13,22
> my $category = 'photos'; # so far, only for latest file
> my %cat_id = ($category => '1'); # put the categoryId of the category
> my $publish = '1'; # 0 to Draft
>
> # create "$latest.category-name.jpg" in $latest_file_path;
> my $latest_file_path = '/var/www/html/blog/moblog/';
> my $latest = 'latest'; # latest filename is $latest.$category.jpg
>
> my $mapion = 1; # 1 or 0
> my $navi_com = 1; # 1 or 0
81a95
> my $excerpt;
96,107c110,125
< my $ret = $rpc->call('metaWeblog.newMediaObject',
< $blog_id,
< $username,
< $password,
< {
< 'bits' => $bindata,
< 'name' => $filename.$suffix
< },
< 1
< );
< #print Dumper $ret->result;
< #print Dumper $ret->fault;
---
> my $ret;
> while (1) {
> $ret = $rpc->call('metaWeblog.newMediaObject',
> $blog_id,
> $username,
> $password,
> {
> 'bits' => $bindata,
> 'name' => $filename.$suffix
> },
> 1
> );
> last if ($ret->result); # if suceeds, go to next level
> $filename = $filename . "\.new"; # change filename and try again # note this RPC overwrites the existing file
> }
>
126,127c144,157
< if (@lat) {
< #my $map = "http://www.mapion.co.jp/c/f?el=$long[3]/$long[4]/$long[5]&scl=250000&uc=1&grp=all&nl=$lat[3]/$lat[4]/$lat[5]";
---
>
> if (@lat && $mapion) {
> my (@mlat, @mlong, $malt);
> ($mlat[0], $mlat[1], $mlat[2], $mlong[0], $mlong[1], $mlong[2], $malt) = &wgs2tky($lat[3],$lat[4],$lat[5],$long[3],$long[4],$long[5],$alt[3]);
> $mlat[2] = sprintf("%.3f", $mlat[2]); # tailoring for mapion
> $mlong[2] = sprintf("%.3f", $mlong[2]);
> my $mapion = "http://www.mapion.co.jp/c/f?el=$mlong[0]/$mlong[1]/$mlong[2]&scl=10000&uc=1&grp=all&nl=$mlat[0]/$mlat[1]/$mlat[2]&size=400,400&";
> $mapion = "<a href=\"$mapion\" target=\"_blank\">Location</a>";
> $mapion = $mapion."(Altitude: $malt meters)" if (@alt);
> $mapion = $mapion."Map powered by <a href=\"http://www.mapion.co.jp/\">Mapion</a><br/>";
> $mapion = $j->set($mapion)->$code;
> $description = $mapion.$description;
> }
> if (@lat && $navi_com) {
129,130c159,161
< $map = "<a href=\"$map\" target=\"_blank\">セ・・/a>";
< $map = "$map (ウ、ネエ$alt[3]m)" if (@alt);
---
> $map = "<a href=\"$map\" target=\"_blank\">Location</a>";
> $map = $map."(Altitude: $alt[3] meters)" if (@alt);
> $map = $map."Map powered by <a href=\"http://www.at-navi.com/\">\@NAVI.com</a><br/>";
132,133c163
< $description = "$map<br />$description";
< #print "$map\n";
---
> $description = $map.$description;
142c172
< $description = "<img src=\"$returl\" width=\"$imgx\" height=\"$imgy\" alt=\"$orgfilename\"><br />$description";
---
> $description = "<a href=\"$returl\"><img src=\"$returl\" width=\"$imgx\" height=\"$imgy\" alt=\"$orgfilename\" /></a><br/>$description";
144c174
< $description = "<a href=\"$returl\">$orgfilename</a><br />$description";
---
> $description = "<a href=\"$returl\">$orgfilename</a><br/>$description";
155c185,186
< 'mt_text_more' => $text_more
---
> 'mt_text_more' => $text_more,
> 'mt_excerpt' => $excerpt,
157c188,204
< 1
---
> $publish
> ) or die "posting failure: cannot post a new entry";
>
>
> my $post_id = $ret->result();
>
> my @categories;
> $categories[0] = [{
> 'categoryId' => $cat_id{$category},
> 'isPrimary' => 1,
> }];
>
> my $ret = $rpc->call('mt.setPostCategories',
> $post_id,
> $username,
> $password,
> @categories,
159a207,221
> # rebuilding to reflect category change
> my $ret = $rpc->call('metaWeblog.editPost',
> $post_id,
> $username,
> $password,
> {
> 'title' => $title,
> 'description' => $description,
> 'mt_text_more' => $text_more,
> 'mt_excerpt' => $excerpt,
> },
> $publish
> );
>
>
164a227,228
> exit;
>
179a244,245
>
> system("cp", $cntpath, "$latest_file_path$latest.$category$orgsuffix");
202a269,369
>
>
> # The copyright of the code below is claimed by Nowral, the author written in the code
> # http://member.nifty.ne.jp/Nowral/02_DATUM/02_DATUM.html for more info
> #
> # modified by Nob Seki on July 21, 2003
>
> sub wgs2tky {
> my (@lat,@long,$alt);
> $lat[0] = shift; $lat[1] = shift, $lat[2] = shift;
> $long[0] = shift; $long[1] = shift, $long[2] = shift;
> $alt = shift;
>
> #
> #!/usr/bin/perl -w
> #
> # Standard Molodensky Datum Transformation
> # Nowral [email protected]
> # 99/11/24
> #
>
> # Original Data in Tokyo97
>
> my $b = $lat[0] + $lat[1]/60 + $lat[2]/3600;
> my $l = $long[0] + $long[1]/60 + $long[2]/3600;
> my $h = $alt;
>
>
> # Datum of Tokyo97
> my $a = 6377397.155;
> my $f = 1 / 299.152813;
>
> # Datum of WGS 84
> my $a_ = 6378137; #
> my $f_ = 1 / 298.257223; #
>
>
> # 繝上Β繧ィ繧ア
> ($b, $l, $h) = &molodensky($b, $l, $h, $a_, $f_, $a, $f);
>
> # 繝上Β繧ィ繧ア縲√が縲√・繧ス繧ウ繝・ヮ繧ッ
> # print "繝上Β繧ィ繧ア繧ッ阯ケn繝シ繧帙リ繝ォ縲ゅぃ ",°2dms($b),"\n繧ュ繝溘リ繝ォ縲ゅぃ ",°2dms($l),"\n繧ア遲・が縲ゅぃ $h\n\n";
>
> # 繝偵Ρ繝・ 繝帙リ 繧」
> # (WGS 84)
> # 繝シ繧帙リ繝ォ 35縲ゅ・0縲ゅ・1.685555縲ゅ・# 繧ュ繝溘リ繝ォ 138縲ゅ・4縲ゅ・6.838916縲ゅ・# 繧ア遲・が 737.895217 [m]
>
> return (°2dms($b),°2dms($l),$h);
> }
>
> sub molodensky {
> # Constants
> my $pi = 4 * atan2(1,1); # Pi
> my $rd = $pi / 180; # Radian
> # Change in meter
> # e.g. $x_ = $x + $dx etc.
> my $dx = +148;
> my $dy = -507;
> my $dz = -681;
>
> my($b, $l, $h, $a, $f, $a_, $f_) = @_;
> my($bda, $e2, $da, $df, $db, $dl, $dh);
> my($sb, $cb, $sl, $cl, $rn, $rm);
> $b *= $rd;
> $l *= $rd;
>
> $e2 = 2*$f - $f*$f; # 繝帙・繧ス繧ィ繝帙ぅ e^2
> $bda = 1- $f; # 繧ォ繝偵ロ繧サ繧ュ繝・/ 繧ソ繝ィ繝九し繝阪そ繧ュ繝・b/a
> ($da, $df) = ($a_-$a, $f_-$f);
> ($sb, $cb, $sl, $cl) = (sin($b), cos($b), sin($l), cos($l));
>
> $rn = 1 / sqrt(1 - $e2*$sb*$sb);
> $rm = $a * (1 - $e2) * $rn * $rn * $rn;
> $rn *= $a;
>
> #縲√さ縲√・繝帙く繝ゥ繧オ繧オ
> $db = -$dx*$sb*$cl - $dy*$sb*$sl + $dz*$cb
> + $da*$rn*$e2*$sb*$cb/$a + $df*($rm/$bda+$rn*$bda)*$sb*$cb;
> $db /= $rm + $h;
> $dl = -$dx*$sl + $dy*$cl;
> $dl /= ($rn+$h) * $cb;
> $dh = $dx*$cb*$cl + $dy*$cb*$sl + $dz*$sb
> - $da*$a/$rn + $df*$bda*$rn*$sb*$sb;
>
> (($b+$db)/$rd, ($l+$dl)/$rd, $h+$dh);
> }
>
> sub deg2dms {
> my($d) = @_;
> my($m, $s, $sf);
> $sf = int($d*360000 + 0.5);
> $s = $sf / 100 % 60;
> $m = $sf / 6000 % 60;
> $d = int($sf/360000);
> $sf %= 100;
> # modified by Nob, returning an array, not formatted string
> return ($d, $m, sprintf("%02d\.%02d", $s, $sf));
> }
>
>
>


お、いいですね。
metaWeblog.newPostの際はboolean publishを0で決め打ちして、mt.setPostCategories後に、$publishが1の時だけmt.publishPostすれば、$publishが1のときもリビルドが2回掛からなくてすみそうです。

上で指摘された余計なリビルドの削減や、2つ以上カテゴリーを設定する部分のバグなどを修正しました。

#!/usr/bin/perl
# Perl version originally written by motonaga
# modified by Nob Seki

my $url = 'http://www.syncworld.net/mt/mt-xmlrpc.cgi'; # CGIPath + 'mt-xmlrpc.cgi'
my $blog_id = 1;
my $username = 'username';
my $password = 'password';
my $code = euc; # utf8, euc, jis, sjis
my $MT_DIR = '/usr/share/movabletype/';
my $parse_path = '/tmp';
my $category = 'primary_cat'; # so far, only for latest file
my %cat_id = ($category => '1'); # put the categoryId of the category
my $secondary_category = 'secondary_cat';
my %secondary_cat_id = ($secondary_category => '2');

my $publish = '1'; # set 0 to not rebuild

# create "$latest.category-name.jpg" in $latest_file_path;
my $build_latest_file = 1; # set 1 to create the latest file; 0 to create no files
my $latest_file_path = '/var/www/html/blog/moblog/';
my $latest = 'latest'; # latest filename is $latest.$category.jpg
my $umask = '0000'; # depending on the permission of the file/directory

# map for the location information
my $mapion = 1; # 1 or 0
my $navi_com = 1; # 1 or 0

my ($maxx, $maxy) = (320, 320);

unshift @INC, $MT_DIR . 'extlib';

use strict;
use MIME::Parser;
#use Data::Dumper;
use File::Basename;
#use Net::Blogger;
use Jcode;
use XMLRPC::Lite;

#my $mt = Net::Blogger->new(engine=>"movabletype");
#$mt->Proxy($url);
#$mt->Username($username);
#$mt->Password($password);
#$mt->BlogId($blog_id);
#my $rpc = XMLRPC::Lite->new;

my $j = new Jcode;

open(OUT, ">$parse_path/mtmail");
my $str='';
while(<STDIN>) {
$str = $str.$_;
print OUT $_;
}
close(OUT);

my $parser = new MIME::Parser;
$parser->output_under($parse_path);
my $entity = $parser->parse_data($str);
my $head = $entity->head;
my $sub = $head->get('Subject');
my $message_id = $head->get('Message-ID');
# my $cnttype = $entity->mime_type;
$sub = $j->set($sub)->mime_decode->$code;
$sub =~ s/[\r\n]//g;
$sub =~ s/ +$//g;
$message_id =~ s/[<>]//g;
$message_id =~ s/\@.*//g;
$message_id =~ s/[\r\n]//g;

my $partnum = $entity->parts;
my (@texts, @attachs, $cnttype, $cntpath, $cntname);
if ($entity->is_multipart) {
# multi parts
for (my $pn = 0; $pn < $partnum; $pn++) {
$cnttype = $entity->parts($pn)->mime_type;
$cntpath = $entity->parts($pn)->bodyhandle->path;
$cntname = $entity->parts($pn)->head->mime_attr('content-type.name') || $entity->parts($pn)->head->mime_attr('content-disposition.filename');
$cntname = $j->set($cntname)->mime_decode->$code;
arrange_parts($pn, $cnttype, $cntpath, $cntname);
}
} else {
# single part
$cnttype = $entity->mime_type;
$cntpath = $entity->bodyhandle->path;
$cntname = $entity->head->mime_attr('content-type.name') || $entity->head->mime_attr('content-disposition.filename');
$cntname = $j->set($cntname)->mime_decode->$code;
arrange_parts(1, $cnttype, $cntpath, $cntname);
}

my $cont;
foreach (@texts) {
open(CONT, $_);
while (<CONT>) {
s/\r\n/\n/g;
s/\r/\n/g;
$cont = $cont.$_;
}
close(CONT);
}
$cont = $j->set($cont)->$code;

my @conts = split(/\n\n\n/, $cont);
my $description = shift(@conts);
my $text_more = join("\n\n\n", @conts);
my $title = $sub;
my $excerpt;

my $rpc = XMLRPC::Lite->new;
$rpc->proxy($url);

foreach my $fileref (@attachs) {
my ($file, $orgfilename) = @$fileref;
my ($filename, $filepath, $suffix) = fileparse($file, '\.(jpe?g|gif|png)');
#print "$filename\n$filepath\n$suffix\n";
open(BIN, $file);
my $bindata;
while (<BIN>) {
$bindata = $bindata.$_;
}
close(BIN);
my $ret;
while (1) {
$ret = $rpc->call('metaWeblog.newMediaObject',
$blog_id,
$username,
$password,
{
'bits' => $bindata,
'name' => $filename.$suffix
},
1
);
last if ($ret->result); # if suceeds, go to next level
$filename = $filename . "\.new"; # change filename and try again # note this RPC overwrites the existing file
}

my $returl = $ret->result->{url};
if ($returl =~ /\.jpe?g$/i) {
my @exif = split(/\n/, `/usr/local/bin/exiflist -o e -u $file`);
my (@lat, @long, @alt);
foreach (@exif) {
@lat = split(/ +/) if (/^ Latitude /);
@long = split(/ +/) if (/^ Longitude /);
@alt = split(/ +/) if (/^ Altitude /);
}
for (my $n = 0; $n < @lat; $n++) {
eval("\$lat[$n] = $lat[$n]");
}
for (my $n = 0; $n < @long; $n++) {
eval("\$long[$n] = $long[$n]");
}
for (my $n = 0; $n < @alt; $n++) {
eval("\$alt[$n] = $alt[$n]");
}

if (@lat && $mapion) {
my (@mlat, @mlong, $malt);
($mlat[0], $mlat[1], $mlat[2], $mlong[0], $mlong[1], $mlong[2], $malt) = &wgs2tky($lat[3],$lat[4],$lat[5],$long[3],$long[4],$long[5],$alt[3]);
$mlat[2] = sprintf("%.3f", $mlat[2]); # tailoring for mapion
$mlong[2] = sprintf("%.3f", $mlong[2]);
my $mapion = "http://www.mapion.co.jp/c/f?el=$mlong[0]/$mlong[1]/$mlong[2]&scl=10000&uc=1&grp=all&nl=$mlat[0]/$mlat[1]/$mlat[2]&size=400,400&";
$mapion = "<a href=\"$mapion\" target=\"_blank\">Location</a>";
$mapion = $mapion."(Altitude: $malt meters)" if (@alt);
$mapion = $mapion."Map powered by <a href=\"http://www.mapion.co.jp/\">Mapion</a><br/>";
$mapion = $j->set($mapion)->$code;
$description = $mapion.$description;
}
if (@lat && $navi_com) {
my $map = "http://www.at-navi.com/map/dispMapPcDmy.jsp?lat=$lat[3].$lat[4].$lat[5]&lon=$long[3].$long[4].$long[5]&unit=0&datum=0";
$map = "<a href=\"$map\" target=\"_blank\">Location</a>";
$map = $map."(Altitude: $alt[3] meters)" if (@alt);
$map = $map."Map powered by <a href=\"http://www.at-navi.com/\">\@NAVI.com</a><br/>";
$map = $j->set($map)->$code;
$description = $map.$description;
}
}
if ($returl =~ /\.(jpe?g|gif|png)$/i) {
use Image::Size;
my ($imgx, $imgy) = imgsize($file);
if ($imgx > $maxx) {
$imgy = sprintf("%d", $imgy * ($maxx / $imgx)); $imgx = $maxx;
}
$description = "<a href=\"$returl\"><img src=\"$returl\" width=\"$imgx\" height=\"$imgy\" alt=\"$orgfilename\" /></a><br/>$description";
} else {
$description = "<a href=\"$returl\">$orgfilename</a><br/>$description";
}
}

# new post without rebuilding
my $ret = $rpc->call('metaWeblog.newPost',
$blog_id,
$username,
$password,
{
'title' => $title,
'description' => $description,
'mt_text_more' => $text_more,
'mt_excerpt' => $excerpt,
},
0,
) or die "posting failure: cannot post a new entry";


my $post_id = $ret->result();

my $categories = [
{
'categoryId' => $cat_id{$category},
'isPrimary' => 1,
}, {
'categoryId' => $secondary_cat_id{$secondary_category},
'isPrimary' => 0,
}
];

$ret = $rpc->call('mt.setPostCategories',
$post_id,
$username,
$password,
$categories,
);

# rebuilding to reflect category change
$ret = $rpc->call('metaWeblog.editPost',
$post_id,
$username,
$password,
{
'title' => $title,
'description' => $description,
'mt_text_more' => $text_more,
'mt_excerpt' => $excerpt,
},
$publish
);


#print Dumper $ret->result;
#print Dumper $ret->fault;

#$parser->filer->purge;

exit;

sub arrange_parts {
my ($pn, $cnttype, $cntpath, $cntname) = @_;
if ($cnttype =~ /^text\/plain$/i) {
# plain text
push(@texts, $cntpath);
} else {
# attachment
my ($filename, $filepath, $suffix) = fileparse($cntpath, '\..+');
my $orgsuffix;
$orgsuffix = $1 if ($cntname =~ /.+(\..+)/);
#print "$filename\n$suffix\n$cntname\n";
if ("$filename$suffix" ne $cntname) {
rename($cntpath, "$filepath${message_id}_$pn$orgsuffix");
$cntpath = "$filepath${message_id}_$pn$orgsuffix";
}

if ($build_latest_file) {
my $old_umask = umask($umask);
system("cp", $cntpath, "$latest_file_path$latest.$category$orgsuffix");
umask($old_umask);
}
unshift(@attachs, [ $cntpath, $cntname ]);
if ($orgsuffix eq '.amc') {
#my ($mpgcntpath, $mpgcntname) = amc2mpg($cntpath);
amc2mpg($cntpath);
#unshift(@attachs, [ $mpgcntpath, $mpgcntname ]);
}
}

}

sub amc2mpg {
my $amc = shift;
my ($filename, $filepath, $suffix) = fileparse($amc, '\.amc');
my $mpg = "$filepath$filename.mpg";
my $jpg = "$filepath${filename}_mpg\%d.jpg";
my $jpg1 = "$filepath${filename}_mpg1.jpg";
system("/usr/local/bin/mencoder -nosound -ovc lavc -lavcopts vcodec=mpeg1video $amc -o $mpg");
system("/usr/local/bin/ffmpeg -i $mpg -f jpeg -t 0.1 $jpg");
#return ($mpg, "( --> MPEG1 )");
unshift(@attachs, [ $jpg1, "$filename (MPEG1)" ]);
unshift(@attachs, [ $mpg, "( --> MPEG1 )" ]);
1;
}


# The copyright of the code below is claimed by Nowral, the author written in the code
# http://member.nifty.ne.jp/Nowral/02_DATUM/02_DATUM.html for more info
#
# modified by Nob Seki on July 21, 2003

sub wgs2tky {
my (@lat,@long,$alt);
$lat[0] = shift; $lat[1] = shift, $lat[2] = shift;
$long[0] = shift; $long[1] = shift, $long[2] = shift;
$alt = shift;

#
#!/usr/bin/perl -w
#
# Standard Molodensky Datum Transformation
# Nowral [email protected]
# 99/11/24
#

# Original Data in Tokyo97

my $b = $lat[0] + $lat[1]/60 + $lat[2]/3600;
my $l = $long[0] + $long[1]/60 + $long[2]/3600;
my $h = $alt;


# Datum of Tokyo97
my $a = 6377397.155;
my $f = 1 / 299.152813;

# Datum of WGS 84
my $a_ = 6378137; #
my $f_ = 1 / 298.257223; #

($b, $l, $h) = &molodensky($b, $l, $h, $a_, $f_, $a, $f);

return (°2dms($b),°2dms($l),$h);
}

sub molodensky {
# Constants
my $pi = 4 * atan2(1,1); # Pi
my $rd = $pi / 180; # Radian
# Change in meter
# e.g. $x_ = $x + $dx etc.
my $dx = +148;
my $dy = -507;
my $dz = -681;

my($b, $l, $h, $a, $f, $a_, $f_) = @_;
my($bda, $e2, $da, $df, $db, $dl, $dh);
my($sb, $cb, $sl, $cl, $rn, $rm);
$b *= $rd;
$l *= $rd;

$e2 = 2*$f - $f*$f; #
$bda = 1- $f; #
($da, $df) = ($a_-$a, $f_-$f);
($sb, $cb, $sl, $cl) = (sin($b), cos($b), sin($l), cos($l));

$rn = 1 / sqrt(1 - $e2*$sb*$sb);
$rm = $a * (1 - $e2) * $rn * $rn * $rn;
$rn *= $a;

$db = -$dx*$sb*$cl - $dy*$sb*$sl + $dz*$cb
+ $da*$rn*$e2*$sb*$cb/$a + $df*($rm/$bda+$rn*$bda)*$sb*$cb;
$db /= $rm + $h;
$dl = -$dx*$sl + $dy*$cl;
$dl /= ($rn+$h) * $cb;
$dh = $dx*$cb*$cl + $dy*$cb*$sl + $dz*$sb
- $da*$a/$rn + $df*$bda*$rn*$sb*$sb;

(($b+$db)/$rd, ($l+$dl)/$rd, $h+$dh);
}

sub deg2dms {
my($d) = @_;
my($m, $s, $sf);
$sf = int($d*360000 + 0.5);
$s = $sf / 100 % 60;
$m = $sf / 6000 % 60;
$d = int($sf/360000);
$sf %= 100;
# modified by Nob, returning an array, not formatted string
return ($d, $m, sprintf("%02d\.%02d", $s, $sf));
}

はじめまして。
こちらで配布しているメール投稿スクリプトを戴きました。

何度か行った投稿の実験をしていたときに、$urlを配布設定のままにしていることに気が付きました。
妙なアカウントへのメール送信のログが残っていると思いますが、それはおそらく自分のせいです....ごめんなさい。

そろそろ、誰でも使えるようにして配布するのがよさそうですね…

スクリプト、使わせて頂いております。
私はauの日立製の機種なのですが、下記の
@lat = split(/ +/) if (/^ Latitude /);
@long = split(/ +/) if (/^ Longitude /);
@alt = split(/ +/) if (/^ Altitude /);

@lat = split(/ +/) if (/^ Latitude /);
@long = split(/ +/) if (/^ Longitude /);
@alt = split(/ +/) if (/^ Altitude /);
としないと、GPS情報が取り出せませんでした。
exiflistのバージョンの違いかもしれませんが。

あ、修正前後で同じになってしまった。
半角スペース2文字が1文字になってしまうのですね。
ということで、元スクリプトでも同じように
Latitude
などの前後には半角スペース2文字入っているみたいですね。
お騒がせしました。

はじめまして。
AUのGPSについて検索してきました。
一年も前の記事にコメントしていいものかどうか迷いましたが、書くだけ書いてみます。

福岡に住む、あるフリーでAU好きなWEB製作者なんですが、AU携帯で面白い事ができないかと、半年ぐらい前にこんなものを作りました。

「Map Blog(試作版):天神界隈」
GPS携帯で投稿できるFlash上のMAPです。
最近はいろんな所で似たようなものがあるので、今更ですけど。
いろいろやっていこうとしてるところで放置しています。

失礼しました。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

July 14, 2003 2:52 AMに投稿されたエントリのページです。

ひとつ前の投稿は「"Bubble" generation and "Post-bubble" generation」です。

次の投稿は「GPS is accurate, but map info is not?」です。

他にも多くのエントリがあります。メインページアーカイブページも見てください。

Powered by
Movable Type