#!/usr/local/bin/perl -w # トラックデータ範囲のウェイポイントに限定するフィルタ # IN: トラックファイル # ウェイポイントファイル # OUT: ウェイポイントファイル(INファイルに"_"を付加) # @ トラックデータ(*.trk)で定義された座標群を抽出して、 # A トラックデータの有効範囲(長方形)を定義し、 # B *.wpt内で定義された座標群の内、上記有効範囲に含まれるもののみを抽出 { $debug = 0; @wptfile = (); @trkfile = (); $margin = 0.01; # 少しぐらいのずれを許す while ( $#ARGV != -1 ) { if ( $ARGV[0] eq "-debug" ) { $debug = 1; } elsif ( $ARGV[0] =~ /\.trk$/ ) { push ( @trkfile, $ARGV[0] ); } elsif ( $ARGV[0] =~ /\.wpt$/ ) { push ( @wptfile, $ARGV[0] ); } shift @ARGV; } if ( $debug != 0 ) { printf( "trkfile = <%s>\n", join( "><", @trkfile ) ); printf( "wptfile = <%s>\n", join( "><", @wptfile ) ); } my $lat_min = "90"; # 北緯/南緯, 東経/西経が入り乱れないことが前提の簡易処理 my $lat_max = "0"; my $lon_min = "180"; my $lon_max = "0"; foreach my $trk ( @trkfile ) { open ( IN, $trk ) || die "Cannot read open <$trkfile>"; while () { my $inp = $_; chomp $inp; my @line = split( / +/, $inp ); if ( ( defined $line[0] ) && ( $line[0] eq "T" ) ) { # 座標定義行 # T N33.7878648 E135.7409737 11-OCT-09 01:55:35 69 my $lat = substr( $line[1], 1 ); my $lon = substr( $line[2], 1 ); if ( $debug != 0 ) { printf( "col=(%s,%s) ...\n", $lat, $lon ); } if ( $lat_max < $lat ) { $lat_max = $lat; } if ( $lat_min > $lat ) { $lat_min = $lat; } if ( $lon_max < $lon ) { $lon_max = $lon; } if ( $lon_min > $lon ) { $lon_min = $lon; } } } } if ( $debug != 0 ) { printf( "LATITUDE = (%s, %s)\n", $lat_min, $lat_max ); printf( "LONGITUDE = (%s, %s)\n", $lon_min, $lon_max ); } foreach my $wpt ( @wptfile ) { open ( IN, $wpt ) || die "Cannot read open <$wptfile>"; my ( $wpthead ) = ( $wpt =~ /^(.+)\.wpt/ ); open ( OUT, ">" . $wpthead . "_.wpt" ) || die "Cannot write open <$wpthead>"; while () { my $inp = $_; chomp $inp; my @line = split( / +/, $inp ); if ( ( defined $line[0] ) && ( $line[0] eq "W" ) ) { # ウェイポイント定義行 # W Kushid N34.4277417 E136.3318472 18-NOV-06 23:23:44 144 michinoeki_iitaka my $lat = substr( $line[2], 1 ); my $lon = substr( $line[3], 1 ); if ( $debug != 0 ) { printf( "col=(%s,%s) ...\n", $lat, $lon ); } if ( ( $lat_min - $margin <= $lat ) && ( $lat <= $lat_max + $margin ) && ( $lon_min - $margin <= $lon ) && ( $lon <= $lon_max + $margin ) ) { printf( OUT "%s\n", $inp ); } } else { printf( OUT "%s\n", $inp ); } } close(IN); close(OUT); } } #============================================================ #H SOFTWARE NAME & VERSION #I PCX5 2.09 # #H COORDINATE SYSTEM #U LAT LON DEG # #H R DATUM IDX DA DF DX DY DZ #M G WGS 84 121 +0.000000e+00 +0.000000e+00 +0.000000e+00 +0.000000e+00 +0.000000e+00 # #H ALL.WPT # #H IDNT LATITUDE LONGITUDE DATE TIME ALT DESCRIPTION #W Kushid N34.4277417 E136.3318472 18-NOV-06 23:23:44 144 michinoeki_iitaka # #H ALL.WPT # #H IDNT LATITUDE LONGITUDE DATE TIME ALT DESCRIPTION #W Kushid N34.4338028 E136.3195722 26-NOV-06 09:46:52 -1 kyuuryuu_point # # #============================================================ #H SOFTWARE NAME & VERSION #I PCX5 2.09 # #H COORDINATE SYSTEM #U LAT LON DEG # #H R DATUM IDX DA DF DX DY DZ #M G WGS 84 121 +0.000000e+00 +0.000000e+00 +0.000000e+00 +0.000000e+00 +0.000000e+00 # #H ACTIVE LOG 018 # #H LATITUDE LONGITUDE DATE TIME ALT #T N33.7878648 E135.7409737 11-OCT-09 01:55:35 69 #T N33.7877566 E135.7410404 11-OCT-09 01:55:49 92 #T N33.7878084 E135.7410152 11-OCT-09 01:57:11 108 #T N33.7878172 E135.7411538 11-OCT-09 02:06:40 104 #T N33.7878360 E135.7413187 11-OCT-09 02:06:48 104 #T N33.7876199 E135.7421962 11-OCT-09 02:07:29 104 #T N33.7875301 E135.7424621 11-OCT-09 02:07:41 105 #T N33.7875577 E135.7433629 11-OCT-09 02:08:44 105 #T N33.7876082 E135.7434149 11-OCT-09 02:09:03 105 #T N33.7875866 E135.7434848 11-OCT-09 02:09:29 106 #============================================================