#!/usr/local/bin/perl # #なんでこうしないんだろう?、というようなところは、ただ単に #知らないからだけです。いい方法があれば教えてください。 # #glc.pl -- GPS log compress require 'glc-sub.pl'; # #更新履歴 #2005/10/05 作成開始 #2005/10/14 いちおう完成 #2005/10/15 微修正。加速度での異常値をはねるのは保留。 #2005/10/19 trkファイルに変換 #2005/10/20 微修正。高度情報が抜けてた #2006/06/11 位置推定で微妙なのはスキップする #2006/06/25 サブルーチンを別ファイルに #2007/09/08 trkファイルに変換機能を省略。その機能はtrkdate.plに。 #2007/09/22 回転角度の判断を累積に # #カシミール3Dのpotファイル専用 #書式は以下 #DAT=WGS84/WGS84/0.000/0.00000000/0/0/0 #ORD=POI/tex=/ido=034'41'24'5/kei=135'33'05'7/adr=1/alt=-5/col=12/pda=22-SEP-05/pti=21:44:54 #ORD=POI/tex=/ido=034'41'26'3/kei=135'33'05'4/adr=1/alt=+9/col=12/pda=22-SEP-05/pti=21:45:23 #ORD=POI/tex=/ido=034'41'25'8/kei=135'33'05'3/adr=2/alt=+9/col=12/pda=22-SEP-05/pti=21:47:20 #ORD=POI/tex=/ido=034'41'25'8/kei=135'33'05'3/adr=2/alt=+11/col=12/pda=22-SEP-05/pti=21:47:24 # 緯度 経度 軌跡番号 高度 表示色 日付 時刻 #日付・時刻はUTC #ORD=POI と tex= は固定にしておく $PI = 3.14159265358979; ############################################################ #最大の加速度。これを超えたら異常値として捨てる #とりあえず、重力加速度としておく。単位はm/s/s #$MAX_ACC = 9.8; #TO DO #加速度での異常値の判定は前回書いたポイントではなく、一つ前のポイントで。 #最小回転角度。単位は°(度)。 #$MIN_TURN = 30; #$MIN_TURN = 15; #最大回転角度:これ以上は残す。単位は°(度)。 $MAX_TURN = 15; #元の線からどれだけ離れたら残すか $MAX_DEP = 100; #$MAX_DEP = 30; #ポイント間の距離が近いと捨てる $MIN_DIST = 43.6; #赤道での1秒×1秒の斜辺 #ポイント間の距離が長いと残す $MAX_DIST = 10000; #スレッドを切ったりつないだり #$ADR_MAX_SECOND_DIFFERENCE この秒(時間)数を超えたら元々つながってない別スレッドにする $ADR_MAX_SECOND_DIFFERENCE = 7200; #$MAX_DISTANCE この距離(m)を超えたら元々つながってない限り別スレッドにする $ADR_MAX_DISTANCE = 500; $rewrite_adr = 1; $adr_plus = 0; ################################################# #ヘッダー $head = <>; print $head; #1行目 $first = <>; chop $first; ($ido0 ,$kei0 ,$address0 ,$altitude0 ,$col0 ,$pda0 ,$pti0) = &get_variables($first); $lat0 = &dmspot2deg($ido0); $long0 = &dmspot2deg($kei0); $time0 = &pdapti2time($pda0 ,$pti0); $turn = 0; $dep = 0; #最初の行は必ず書く(ことにする) print_pot($ido0,$kei0,$rewrite_adr,$altitude0,$col0,$pda0,$pti0); #2行目 $second = <>; chop $second; ($ido1 ,$kei1 ,$address1 ,$altitude1 ,$col1 ,$pda1 ,$pti1) = &get_variables($second); $lat1 = &dmspot2deg($ido1); $long1 = &dmspot2deg($kei1); $time1 = &pdapti2time($pda1 ,$pti1); #3行目以降 while (<>){ chop ; ($ido2 ,$kei2 ,$address2 ,$altitude2 ,$col2 ,$pda2 ,$pti2) = &get_variables($_); $lat2 = &dmspot2deg($ido2); $long2 = &dmspot2deg($kei2); $time2 = &pdapti2time($pda2 ,$pti2); ($acc,$rot,$dist) = &get_acc_rot($lat0,$long0,$time0, $lat1,$long1,$time1, $lat2,$long2,$time2); $turn += abs($rot / $PI * 180); $dep += abs($rot) * $dist; #1,3番目のデータから2番目の位置を推定 $lat_g = $lat0 + ($lat2 - $lat0) / ($time2 - $time0) * ($time1 - $time0); $long_g = $long0 + ($long2 - $long0) / ($time2 - $time0) * ($time1 - $time0); ($dist_g ,$dir_g ,$dx_g , $dy_g) = &hubeny($lat_g/180 * $PI, $long_g/180 * $PI, $lat1/180 * $PI, $long1/180 * $PI); $d_dist += $dist_g; #print "$lat_g $long_g $lat1 $long1 $dist_g\n"; #$past=$time1-$time0; #if($past !=0){$velocity = $dist / $past;} #print "$pda1,$pti1,$past,$acc,$turn,$dist,$dep,$velocity,$address1 \n"; ### #ポイントをスキップする条件 #下のほうほど無条件 $skip = 0; $reason = "0NO_REASON"; ## if($dist_g < $MIN_DIST){ ## $skip = 1; ## $reason = "1guessable"; ## } # if($turn< $MIN_TURN){ # $skip = 1; # $reason = "1MIN_TURN"; # } if($dep > $MAX_DEP){ $skip = 0; $reason = "0MAX_DEP"; } if($turn < $MAX_TURN){ $skip = 1; $reason = "1MAX_TURN"; } if($dist < $MIN_DIST){ $skip = 1; $reason = "1MIN_DIST"; } if ($last_add != $address1 || $address1 != $address2){ $skip = 0; $reason = "0ADD_EQUA"; } # if($acc > $MAX_ACC){ # $skip = 1; # $reason = "1MAX_ACC"; # } @date0 = localtime($time0); $day0 = $date0[3]; @date1 = localtime($time1); $day1 = $date1[3]; if ($day0 != $day1){ $next_day = 1; }else{ $next_day = 0; } if ($next_day){ $skip = 0; $reason = "0NEXT_DAY"; } if(!$skip){ # if(1){ ### #スレッドを切る条件 #下のほうほど無条件 $adr_plus = 0; $sec_dif = $time1 - $time0; #距離が遠い(切る) if ($dist > $ADR_MAX_DISTANCE){ $adr_plus = 1; } #時間が開きすぎ(切る) if ($sec_dif > $ADR_MAX_SECOND_DIFFERENCE){ $adr_plus = 1; } #もともとつながっていた(つなぐ) if ($address0 == $address1){ $adr_plus = 0; } #時間がさかのぼっている(切る) if ($sec_dif < 0){ $adr_plus = 1; } #日付が変わる(切る) if ($next_day){ $adr_plus = 1; } $rewrite_adr += $adr_plus; #1行書き出し #$altitude1 = $acc*10; #$altitude1 = $turn; $altitude1 = $rot / $PI * 180; print_pot($ido1,$kei1,$rewrite_adr,$altitude1,$col1,$pda1,$pti1); # if ($adr_plus){ # trk_head($time1); # } ## trk_write($lat1,$long1,$pda1,$pti1,$altitude1,$reason); # trk_write($lat1,$long1,$pda1,$pti1,$altitude1); #if(!$skip){ $last_add = $address1; #データの移動(0←1) ($ido0 ,$kei0 ,$address0 ,$altitude0 ,$col0 ,$pda0 ,$pti0) = ($ido1 ,$kei1 ,$address1 ,$altitude1 ,$col1 ,$pda1 ,$pti1); ($lat0 ,$long0 ,$time0 ,$alt0) = ($lat1 ,$long1 ,$time1 ,$alt1); $turn = 0; $dep = 0; #} } #データの移動(1←2) ($ido1 ,$kei1 ,$address1 ,$altitude1 ,$col1 ,$pda1 ,$pti1) = ($ido2 ,$kei2 ,$address2 ,$altitude2 ,$col2 ,$pda2 ,$pti2); ($lat1 ,$long1 ,$time1 ,$alt1) = ($lat2 ,$long2 ,$time2 ,$alt2); } #最後の行は必ず書く(ことにする) print_pot($ido2,$kei2,$rewrite_adr,$altitude2,$col2,$pda2,$pti2); #trk_write($lat2,$long2,$pda2,$pti2,$altitude2); exit;