2013-08-02 61 views
6

私は[RINEX-3.02](60ページ)のObservation Dataファイルを読んで、時間ベースの衛星IDフィルタリングを行い、最終的に後者を再構成します。これにより、RTKの後処理を経て時間の経過とともにポジションソリューションに貢献できるサテライトの選択をより詳細に制御できます。具体的には、この部分のPandasでGPS RINEXデータを読む

しかし、私は使用しています:

  • を[パイソン-3.3]
  • [パンダ]
  • [numpyの】ここ

を有するサンプルであります最初の3つのタイムスタンプの観測。
注:ヘッダーからデータを解析する必要はありません。私は、カスタムパーサーをしなければならない場合

 3.02   OBSERVATION DATA M: Mixed   RINEX VERSION/TYPE 
CONVBIN 2.4.2       20130731 223656 UTC PGM/RUN BY/DATE 
log: /home/ruffin/Documents/Data/in/FlagStaff_center/FlagStaCOMMENT    
format: u-blox            COMMENT    
                  MARKER NAME   
                  MARKER NUMBER  
                  MARKER TYPE   
                  OBSERVER/AGENCY 
                  REC#/TYPE/VERS 
                  ANT #/TYPE   
    808673.9171 -4086658.5368 4115497.9775     APPROX POSITION XYZ 
     0.0000  0.0000  0.0000     ANTENNA: DELTA H/E/N 
G 4 C1C L1C D1C S1C          SYS/#/OBS TYPES 
R 4 C1C L1C D1C S1C          SYS/#/OBS TYPES 
S 4 C1C L1C D1C S1C          SYS/#/OBS TYPES 
    2013  7 28  0 27 28.8000000  GPS   TIME OF FIRST OBS 
    2013  7 28  0 43 43.4010000  GPS   TIME OF LAST OBS  
G               SYS/PHASE SHIFT 
R               SYS/PHASE SHIFT 
S               SYS/PHASE SHIFT 
    0               GLONASS SLOT/FRQ # 
C1C 0.000 C1P 0.000 C2C 0.000 C2P 0.000  GLONASS COD/PHS/BIS 
                  END OF HEADER  
> 2013 7 28 0 27 28.8000000 0 10      
G10 20230413.601  76808.847  -1340.996   44.000 
G 4 20838211.591  171263.904  -2966.336   41.000 
G12 21468211.719  105537.443  -1832.417   43.000 
S38 38213212.070  69599.2942  -1212.899   45.000 
G 5 22123924.655  -106102.481  1822.942   46.000 
G25 23134484.916  -38928.221   656.698   40.000 
G17 23229864.981  232399.788  -4048.368   41.000 
G13 23968536.158  6424.1143  -123.907   28.000 
G23 24779333.279  103307.5703  -1805.165   29.000 
S35 39723655.125  69125.5242  -1209.970   44.000 
> 2013 7 28 0 27 29.0000000 0 10      
G10 20230464.937  77077.031  -1341.254   44.000 
G 2 20684692.905  35114.399  -598.536   44.000 
G12 21468280.880  105903.885  -1832.592   43.000 
S38 38213258.255  69841.8772  -1212.593   45.000 
G 5 22123855.354  -106467.087  1823.084   46.000 
G25 23134460.075  -39059.618   657.331   40.000 
G17 23230018.654  233209.408  -4048.572   41.000 
G13 23968535.044  6449.0633  -123.060   28.000 
G23 24779402.809  103668.5933  -1804.973   29.000 
S35 39723700.845  69367.3942  -1208.954   44.000 
> 2013 7 28 0 27 29.2000000 0 9      
G10 20230515.955  77345.295  -1341.436   44.000 
G12 21468350.548  106270.372  -1832.637   43.000 
S38 38213304.199  70084.4922  -1212.840   45.000 
G 5 22123786.091  -106831.642  1822.784   46.000 
G25 23134435.278  -39190.987   657.344   40.000 
G17 23230172.406  234019.092  -4048.079   41.000 
G13 23968534.775  6473.9923  -125.373   28.000 
G23 24779471.004  104029.6643  -1805.983   29.000 
S35 39723747.025  69609.2902  -1209.259   44.000 


他のトリッキーな事は衛星IDが来て、時間をかけて行くで

(衛星「G 2」及び「G 4」で示すように)
私はそれらを見つけると、新しい列ラベル(またはマルチインデックスの行ラベル)を作成する必要があります。

私は当初、これは、マルチインデックスの問題と考え
が、私はすべて
Jump to Reading DataFrame objects with MultiIndex

任意の提案を行うことができread_csvのでわからないんだけどパンダできることを考えていましたか?

関連するソース興味場合:

+0

ダミーデータを数行追加できます。 :) –

+0

申し訳ありませんが、フォーマットに何らかのエラーがあり、フォーマットをデバッグするために公開し続けなければなりませんでした。 – ruffsl

答えて

3

は、私はちょうどそれを構築した後、最後に新しいマルチインデックスを設定

df = readObs(indir, filename) 
df.set_index(['%_GPST', 'satID']) 

注意をやってしまったものです。ダミーデータフレームを使用して enter image description here

def readObs(dir, file): 
    df = pd.DataFrame() 
    #Grab header 
    header = '' 
    with open(dir + file) as handler: 
     for i, line in enumerate(handler): 
      header += line 
      if 'END OF HEADER' in line: 
       break 
    #Grab Data 
    with open(dir + file) as handler: 
     for i, line in enumerate(handler): 
      #Check for a Timestamp lable 
      if '> ' in line: 
       #Grab Timestamp 
       links = line.split() 
       index = datetime.strptime(' '.join(links[1:7]), '%Y %m %d %H %M %S.%f0') 
       #Identify number of satellites 
       satNum = int(links[8]) 
       #For every sat 
       for j in range(satNum): 
        #just save the data as a string for now 
        satData = handler.readline() 
        #Fix the names 
        satdId = satData.replace("G ", "G0").split()[0] 
        #Make a dummy dataframe 
        dff = pd.DataFrame([[index,satdId,satData]], columns=['%_GPST','satID','satData']) 
        #Tack it on the end 
        df = df.append(dff) 
    return df, header 

ちょうどかかわらず、最もエレガントに見えるしていません。

+0

これで、独自のPython GNSS処理プログラムを作成できましたか? – multigoodverse

+0

私はIPythonノートで多くのスクリプトを作成しましたが、実際にはプログラムではありません。あなたは私の騒ぎ[ここ](https://github.com/ruffsl/RTKLIB-Tools)を見つけることができますが、私はしばらくそれに触れていません。 私はあなたがPythonとGISに非常に慣れていることを願っています。昨年に有望なPython GNSSツールを手に入れていれば、貢献できるでしょう。@ArditS。私は[RTKLIB](https://github.com/tomojitakasu/RTKLIB/network)(Cプロジェクトだが)がかなり活発であると思う。 – ruffsl

1

私はラインでファイルの行を読んで、カスタムパーサーを書くことをお勧めします。

「G 5」内のスペースは、カスタムパーサーを作成するためのヒントです。
この場合、空白で単純に引数を分割することはできません。
3つの文字をすべて一度に読み込み、最初の文字を削除し、残りの2つ( "5")を衛星番号に変換する必要があります。ここで

+0

ファイルをループすると、新しいサテライトIDに遭遇したときに、データフレームに新しい列を追加する方法は何でしょうか?私はna値でうまくいく。 – ruffsl

+0

SATで昇順にソートされたリストを使用します。おそらくtreeMap(java)、キー(Sat Id、value =残りのatts)を使用します。たぶん、各GPS衛星システム(最初の文字 "G"と "S")は、独自のリストまたはツリーです。 – AlexWien

関連する問題