#!/usr/local/bin/perl -w # Usage: src2kml [カメラ補正(s)] # 入力: memo.src(EUC), memo.trk(EUC), memo.wpt(EUC) # 出力: memo.kml.e(EUC), memo.kml(UTF8) # [kml ファイルは utf8 でなければならない] use strict; use Time::Local; use File::Basename; use Cwd; # ($#ARGV != 1) || ($#ARGV != 2) || die "Usage: src2kml [カメラ補正(s)] ファイル名\n"; ($#ARGV != 0) || ($#ARGV != 1) || die "Usage: src2kml [カメラ補正(s)]\n"; # my $file = $ARGV[0]; my $file = 'memo'; my $advan; #if (!defined($advan = $ARGV[1])) {$advan = 0;} if (!defined($advan = $ARGV[0])) {$advan = 0;} my $dir = &cwd(); $dir =~ s|.*/photos/||; my $sub = $dir; $sub =~ s|.*/||; my %mo_moS = ('JAN', 1, 'FEB', 2, 'MAR', 3, 'APR', 4, 'MAY', 5, 'JUN', 6, 'JUL', 7, 'AUG', 8, 'SEP', 9, 'OCT', 10, 'NOV', 11, 'DEC', 12); my $url = "http://www.moge.org/okabe/cgi-bin/album/photos"; ### # data on trk my ($lat, $lng, $alt, @memo, $dt, $head, $id, $dateS, $timeS, $dtS, $memoS); my ($dtS_b, $dtS_e); # datetime at beginning and end my ($p_lat, $p_lng, $p_alt, $p_dt); # previous data # data on photo my (%lat_ph, %lng_ph, %alt_ph, %memo_ph, $dt_ph, $dtS_p, %dtS_ph); # Header open(STDOUT, "> $file\.kml\.e"); open(TXT, "> $file\.txt") || die "can not open $file\.txt\n"; open(SRC, "$file\.src"); $_ = ; print TXT; &print_header_b; while () { last if ($_ =~ /^\./); print TXT; &print_header; } &print_header_e; # Track Log & Make Photo Data my $exist = 0; if (defined($_ = )) { $exist = 1; print TXT; &get_pht($_); } open(TRK, "$file\.trk"); my $mode = 'init'; while () { if ($_ =~ /^T/) { # TRKデータ中 $dt = &get_trk($_); # read time on trk if ($mode eq 'init') { # TRK最初回 &print_trk_b; $dtS_b = $dtS; $dtS_b =~ s/.*_(..)(..)(..)/$1:$2/; &print_lin_b; &print_lin($lat, $lng, $alt); $mode = 'T'; # TRKへ変更 } elsif ($mode eq 'noT') { # TRKへ戻ってから初回 &print_lin_b; # print with GPS &print_lin($p_lat, $p_lng, $p_alt); &print_lin($lat, $lng, $alt); $dtS_e = $dtS; $dtS_e =~ s/.*_(..)(..)(..)/$1:$2/; &print_lin_e('out'); $dtS_b = $dtS_e; &print_lin_b; # print with GPS &print_lin($lat, $lng, $alt); $mode = 'T'; } else { # $mode eq 'T' &print_lin($lat, $lng, $alt); } while ($exist && ($dt >= $dt_ph)) { &put_pht; if (defined($_ = )) { print TXT; &get_pht($_); } else { $exist = 0; } } $p_dt = $dt; $p_lat = $lat; $p_lng = $lng; $p_alt = $alt; } else { # noTRK中 if ($mode eq 'T') { # TRK直後 $dtS_e = $dtS; $dtS_e =~ s/.*_(..)(..)(..)/$1:$2/; &print_lin_e(''); $dtS_b = $dtS_e; $mode = 'noT'; } } } if ($mode eq 'T') { $dtS_e = $dtS; $dtS_e =~ s/.*_(..)(..)(..)/$1:$2/; &print_lin_e(''); } &print_trk_e; close(TRK); close(SRC); # Way Points &print_wpt_b; open(WPT, "$file\.wpt"); my $num = 0; while () { next if ($_ !~ /^W/); &get_wpt($_); &print_wpt($id, $lat, $lng, $dateS, $timeS, $alt, $memoS); ++$num; } &print_wpt_e; close(WPT); # Photos &print_pht_b; foreach $dt_ph (sort keys(%lat_ph)) { &print_pht($dt_ph); } &print_pht_e; close(TXT); # nkf により $file.kml.e より $file.kml を作る system "nkf -w $file\.kml\.e > $file\.kml"; exit; 1; ## Subroutines # Header sub print_header_b { chomp; print < $sub: $_ EOF print " "; } sub print_header { chomp; print "$_<br />\n"; } sub print_header_e { print TXT <地図が見えます。 (設定によっては、Active X のロードの危険性の警告が出ますが、安全なので許可してください。) Google Earth と連動した地図も見えます。 (Kashmir のように、鳥瞰図や横を見た図なども見れます。ただし、Google Earth をインストールする必要があります。) EOF #時間-高度, 時間-距離, 時間-速度 print < EOF } # Tracks sub get_trk { $_ = shift @_; #H LATITUDE LONGITUDE DATE DT ALT #T N35.7893917 E139.1534139 01-JUN-08 00:36:00 225 ($head, $lat, $lng, $dateS, $timeS, $alt) = split; $lat =~ s/N//; $lat =~ s/S/-/; $lng =~ s/E//; $lng =~ s/W/-/; # 経度 # my $lng = $ln - $la * 0.000046038 - $ln * 0.000083043 + 0.010040; # 緯度 # my $lat = $la - $la * 0.00010695 + $ln * 0.000017464 + 0.0046017; my $md = substr($dateS, 0, 2); my $mo = $mo_moS{substr($dateS, 3, 3)} - 1; my $yr = substr($dateS, 7, 2); my $hr = substr($timeS, 0, 2); my $mn = substr($timeS, 3, 2); my $sd = substr($timeS, 6, 2); $dt = timegm($sd, $mn, $hr, $md, $mo, $yr); ($sd, $mn, $hr, $md, $mo, $yr) = localtime($dt); $yr += 1900; $mo++; $dateS = sprintf("%04d%02d%02d", $yr, $mo, $md); $timeS = sprintf("%02d%02d%02d", $hr, $mn, $sd); $dtS = $dateS.'_'.$timeS; return $dt; } sub print_trk_b { print < EOF } sub print_lin_b { print < 1 clampedToGround EOF } sub print_lin { my ($lat, $lng, $alt) = @_; print "$lng, $lat, $alt\n"; } sub print_lin_e { my $out = shift @_; my $color; if ($out) { $color = '5f0000ff'; } else { $color = 'ff0000ff'; } print < $dtS_b-$dtS_e with$out GPS EOF } sub print_trk_e { print <Track Log Tracks EOF } # Photos sub get_pht { # 写真情報を得る $_ = shift @_; ($dtS_p, @memo) = split; my $yr = substr($dtS_p, 0, 4) - 1900; my $mo = substr($dtS_p, 4, 2) - 1; my $md = substr($dtS_p, 6, 2); my $hr = substr($dtS_p, 9, 2); my $mn = substr($dtS_p,11, 2); my $sd = substr($dtS_p,13, 2); $dt_ph = timelocal($sd, $mn, $hr, $md, $mo, $yr) + $advan; $memoS = join(" ", @memo); } sub put_pht { # 写真情報をハッシュに入れる if (defined($p_dt) && $dt >= $dt_ph) { $lat_ph{$dt_ph} = ($p_lat * ($dt - $dt_ph) + $lat * ($dt_ph - $p_dt)) / ($dt - $p_dt); $lng_ph{$dt_ph} = ($p_lng * ($dt - $dt_ph) + $lng * ($dt_ph - $p_dt)) / ($dt - $p_dt); $alt_ph{$dt_ph} = ($p_alt * ($dt - $dt_ph) + $alt * ($dt_ph - $p_dt)) / ($dt - $p_dt); } else { $lat_ph{$dt_ph} = $lat; $lng_ph{$dt_ph} = $lng; $alt_ph{$dt_ph} = $alt; } $dtS_ph{$dt_ph} = $dtS_p; $alt_ph{$dt_ph} = int($alt_ph{$dt_ph} + 0.5); $memo_ph{$dt_ph} = $memoS; } sub print_pht_b { print < EOF } sub print_pht { $dt_ph = shift @_; my $timeS = $dtS_ph{$dt_ph}; $timeS =~ s/.*_(..)(..)(..)/$1:$2/; print < $timeS $alt_ph{$dt_ph}m <a href="$url/$dir/$dtS_ph{$dt_ph}\.jpg" /><img src="$url/temp/$dtS_ph{$dt_ph}\.idx\.jpg" /></a /><br />$timeS $alt_ph{$dt_ph}m: $memo_ph{$dt_ph} 1 1 clampedToGround $lng_ph{$dt_ph}, $lat_ph{$dt_ph}, $alt_ph{$dt_ph} EOF } sub print_pht_e { my $num = keys(%lat_ph); print <Photos 写真枚数: $num EOF } # Way Points sub get_wpt { $_ = shift @_; chomp; #H IDNT LATITUDE LONGITUDE DATE DT ALT DESCRIPTION #W JR_mit N35.8012556 E139.1827972 01-JUN-08 00:36:00 225 09:36:00 JR御嶽 ($head, $id, $lat, $lng, $dateS, $timeS, $alt, $dtS, @memo) = split; $lat =~ s/N//; $lat =~ s/S/-/; $lng =~ s/E//; $lng =~ s/W/-/; $memoS = join(" ", @memo); } sub print_wpt_b { print < EOF } sub print_wpt { print < EOF print " $dtS $alt", "m\n"; print " $dtS $alt", "m: $memoS<br clear=\"all\" />\n"; print <1 1 clampedToGround $lng, $lat, $alt EOF } sub print_wpt_e { print <Way Points Way Point数: $num EOF }