+ ■ カシミール3DのGPSデータをGISで活用可能なMIF/MID形式のファイルに変換するperlスクリプト兼バッチファイル
POTファイルとLMLファイルをMIF/MID形式に変換する。
(2005/05/20 15:15:00)
+ ■ POT2MIF
GPSデータが吐き出すことができるPOTファイルをMIF/MID形式に変換するperlスクリプト兼バッチファイル。
- perlをパスの通ったディレクトリに入れておくこと。
- バッチファイルをおいたディレクトリにpotとmifというディレクトリを作成すること。
- potディレクトリに変換したい.potファイルを入れ、バッチファイルを起動する。
- うまくいけば、foo.potというファイルから、foo-pnt.mif(mid)、foo-pline.mif(mid)というファイルに変換される。
@rem = ' ;
@echo off
perl %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofbat
@rem ' ;
### Beginning of Perl Script
$GlobRE = './pot/*.pot';
$OutDir = './mif/';
@InFile = glob( $GlobRE );
foreach $rfname ( @InFile ) {
print "$rfname => ";
@body = &ReadFile( $rfname );
# Read POT File
$i = 0;
foreach ( @body ) {
if ( /^dat=(.*)$/i ) { $DAT = $1 }
if ( /^ord=poi/i ) {
$i++;
if ( m|¥/ido=([+-]*¥d+)'(¥d+)'(¥d+)'*(¥d*)¥/|i ) {
$IDO[ $i ] = $1 + $2/60 + $3/3600 + $4/36000 }
if ( m|¥/kei=([+-]*¥d+)'(¥d+)'(¥d+)'*(¥d*)¥/|i ) {
$KEI[ $i ] = $1 + $2/60 + $3/3600 + $4/36000 }
if ( m|¥/alt=([+-]*¥d+)¥/|i ) { $ALT[ $i ] = $1 }
if ( m|¥/pda=([^¥/¥n]*)|i ) { $PDA[ $i ] = $1}
if ( m|¥/pti=([^¥/¥n]*)|i ) { $PTI[ $i ] = $1}
}
}
#Print MIF File ( Point )
$MifFileName = $OutDir . &MainName( $rfname ) . '-pnt.mif';
print "$MifFileName ";
open( MIF , ">$MifFileName" );
&PrintMifPointHead;
for ( $k = 1 ; $k <= $i ; $k++ ) {
printf MIF ( "Point %.08f %.08f¥n" , $KEI[ $k ], $IDO[ $k ]);
}
close MIF;
#Print MID File ( Point )
#"PointID,ALT,DATE(UTC),TIME(UTC)¥n"
$MidFileName = $OutDir . &MainName( $rfname ) . '-pnt.mid';
print "$MidFileName¥n";
open( MID , ">$MidFileName" );
for ( $k = 1 ; $k <= $i ; $k++ ) {
print MID "$k,$ALT[ $k ],$PDA[ $k ],$PTI[ $k ]¥n";
}
close MID;
#Print MIF File ( Line )
$MifFileName = $OutDir . &MainName( $rfname ) . '-pline.mif';
print "$MifFileName ";
open( MIF , ">$MifFileName" );
&PrintMifPLineHead;
print MIF "PLine $i¥n";
for ( $k = 1 ; $k <= $i ; $k++ ) {
printf MIF ( "%.08f %.08f¥n" , $KEI[ $k ], $IDO[ $k ]);
}
close MIF;
#Print MID File ( Line )
#"PointID,ALT,DATE(UTC),TIME(UTC)¥n"
$MidFileName = $OutDir . &MainName( $rfname ) . '-pline.mid';
print "$MidFileName¥n";
open( MID , ">$MidFileName" );
print MID "1,MadeByPOT2MIF¥n";
close MID;
}
exit(0);
sub ReadFile {
my @file;
my( $filename ) = @_;
open( FILE , "$filename" );
@file = ;
close FILE;
return @file;
}
sub WriteFile {
my( $filename , @body ) = @_;
open( OUT , ">$filename" );
print OUT @body;
close OUT;
}
sub MainName {
my( $name ) = @_;
$name =‾ s|¥.([^.]*)$||;
$name =‾ s|.*[/¥¥]||g;
return $name;
}
sub PrintMifPointHead {
print MIF <<'EOC';
Version 300
Charset "WindowsJapanese"
Delimiter ","
CoordSys Earth Projection 1, 97
Columns 4
PointID CHAR(20)
ALT integer
DATE(UTC) CHAR(20)
TIME(UTC) CHAR(20)
Data
EOC
}
sub PrintMifPLineHead {
print MIF <<'EOL';
Version 300
Charset "WindowsJapanese"
Delimiter ","
CoordSys Earth Projection 1, 97
Columns 1
LineID integer
Data
EOL
}
### End of Perl Script
__END__
:endofbat
緯度経度の認識をもっと厳密にやった方がいいかもしんないと思う。
(2005/05/20 15:20:00)
+ ■ LML2MIF
カシミール3Dが作成するリンクファイル(LMLファイル)から地点を取り出して、MIF/MID形式に変換するperlスクリプト兼バッチファイル。カシミール3Dで推定したデジカメの撮影地点データなどを落とすにはこれが一番楽そうなので。
- perlをパスの通ったディレクトリに入れておくこと。
- バッチファイルをおいたディレクトリにlmlとmifというディレクトリを作成すること。
- lmlディレクトリに変換したい.lmlファイルを入れ、バッチファイルを起動する。
- うまくいけば、foo.lmlというファイルから、foo.mif(mid)というファイルに変換される。
@rem = ' ;
@echo off
perl %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofbat
@rem ' ;
### Beginning of Perl Script
$GlobRE = './lml/*.lml';
$OutDir = './mif/';
@InFile = glob( $GlobRE );
foreach $rfname ( @InFile ) {
print "$rfname => ";
@body = &ReadFile( $rfname );
# Read LML File
$i = 0;
foreach ( @body ) {
if ( /^]*>([^<]*)|i ) { $STR[ $i ] = $1 }
}
}
#Print MIF File ( Point )
$MifFileName = $OutDir . &MainName( $rfname ) . '.mif';
print "$MifFileName ";
open( MIF , ">$MifFileName" );
&PrintMifHead;
for ( $k = 1 ; $k <= $i ; $k++ ) {
printf MIF ( "Point %.08f %.08f¥n" , $KEI[ $k ], $IDO[ $k ]);
}
close MIF;
#Print MID File ( Point )
#"PointID,STR"
$MidFileName = $OutDir . &MainName( $rfname ) . '.mid';
print "$MidFileName¥n";
open( MID , ">$MidFileName" );
for ( $k = 1 ; $k <= $i ; $k++ ) {
print MID "$k,$STR[ $k ]¥n";
}
close MID;
}
exit(0);
sub ReadFile {
my @file;
my( $filename ) = @_;
open( FILE , "$filename" );
@file = ;
close FILE;
return @file;
}
sub WriteFile {
my( $filename , @body ) = @_;
open( OUT , ">$filename" );
print OUT @body;
close OUT;
}
sub MainName {
my( $name ) = @_;
$name =‾ s|¥.([^.]*)$||;
$name =‾ s|.*[/¥¥]||g;
return $name;
}
sub PrintMifHead {
print MIF <<'EOC';
Version 300
Charset "WindowsJapanese"
Delimiter ","
CoordSys Earth Projection 1, 97
Columns 4
PointID CHAR(20)
STR CHAR(20)
Data
EOC
}
### End of Perl Script
__END__
:endofbat
緯度経度の認識をもっと厳密にやった方がいいかもしんないと思う。
(2005/05/20 15:24:00)
2005/05/20 作成