Guest User

GPXの標高を読み込む VSD for GPX

a guest
Oct 8th, 2013
751
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // GPX リーダ
  2.  
  3. LogReaderInfo.push({
  4.     Caption:    "GPX (*.gpx)",
  5.     Filter:     "*.gpx",
  6.     ReaderFunc: "Read_gpx"
  7. });
  8.  
  9. function Read_gpx( Files ){
  10.    
  11.     Log.Time        = [];
  12.     Log.Longitude   = [];
  13.     Log.Latitude    = [];
  14. Log.Altitude    = [];
  15.    
  16.     var Cnt = 0;
  17.     var bSpeed = false;
  18.    
  19.     for( var i = 0; i < Files.length; ++i ){
  20.         var file = new File();
  21.         if( file.Open( Files[ i ], "zr" )){
  22.             MessageBox( "ファイルが開けません: " + Files[ i ] );
  23.             return 0;
  24.         }
  25.        
  26.         var Line = '';
  27.        
  28.       NextFile:
  29.         while( 1 ){
  30.            
  31.             // <trkpt lat="35.12345" lon="135.12345">
  32.             // <speed>0.0</speed>
  33.             // <time>2012-04-28T21:27:50Z</time>
  34.             // </trkpt>
  35.            
  36.             // trkpt 先頭サーチ
  37.             while( !Line.match( /<trkpt/ )){
  38.                 Line = file.ReadLine();
  39.                 if( file.IsEOF()) break NextFile;
  40.             }
  41.            
  42.             // trkpt 先頭が見つかったので,それ以前を破棄
  43.             Line = RegExp.lastMatch + RegExp.rightContext;
  44.            
  45.             // trkpt 終了サーチ
  46.             while( !Line.match( /<\/trkpt>/ )){
  47.                 Line = Line + file.ReadLine();
  48.                 if( file.IsEOF()) break NextFile;
  49.             }
  50.            
  51.             // 1つの point に分解
  52.             var Point = RegExp.leftContext + RegExp.lastMatch;
  53.             Line = RegExp.rightContext;
  54.             Point = Point.replace( /[\x0D\x0A]/g, "" );
  55.            
  56.             // 時間
  57.             if( !Point.match( /<time>(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)/ )){
  58.                 continue;
  59.             }
  60.             Log.Time[ Cnt ] = Date.UTC(
  61.                 RegExp.$1, RegExp.$2 - 1, RegExp.$3,
  62.                 RegExp.$4, RegExp.$5, RegExp.$6, RegExp.$7 * 1000
  63.             );
  64.            
  65.             // long, lat
  66.             if( !Point.match( /lat="([\d\.]+)"/ )) continue;
  67.             Log.Latitude [ Cnt ] = +RegExp.$1;
  68.             if( !Point.match( /lon="([\d\.]+)"/ )) continue;
  69.             Log.Longitude[ Cnt ] = +RegExp.$1;
  70.             // 標高を取得
  71.             if( !Point.match( /<ele>([\d\.]+)/)) continue;
  72.             Log.Altitude[ Cnt ] = +RegExp.$1;
  73.            
  74.            
  75.             // Speed がある場合は Array 作成
  76.             if( Point.match( /<speed>([\d\.]+)/ )){
  77.                 if( !bSpeed ){
  78.                     Log.Speed = [];
  79.                     bSpeed = true;
  80.                 }
  81.                 Log.Speed[ Cnt ] = 3.6 * RegExp.$1;
  82.             }
  83.            
  84.             ++Cnt;
  85.         }
  86.         file.Close();
  87.     }
  88.    
  89.     return Cnt;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment