miercuri, iunie 11, 2008

Descărcarea automată a datelor GPS de la o staţie fixă.

Tocmai ai venit de pe teren după o sesiune de măsurători GPS. Vrei să descarci cât mai repede datele de la o staţie fixă, dar ţi-e lene să cauţi manual fişierele. De asemenea, te afli într-un mediu Unix. Nu căuta mai departe! Scriptul pe care l-am scris şi ţi-l dau mai jos face exact asta.

Ca de obicei, există o serie de cerinţe:
  • GPS Toolkit - o excelentă suită de aplicaţii pentru manipularea datelor GPS.
  • teqc - un veritabil briceag pentru lucrul cu fişiere RINEX
  • sed - ştiu că se poate şi fară, dar mi-a fost lene
  • awk - la fel ca la sed
  • tail - probabil că tail, sed şi awk puteau fi scoase din buclă şi folosite chestii native în Python. Probabil.
  • wget - folosit doar pentru descărcarea efectivă a fişierelor
  • Python - limbajul de programare cu baterii incluse

Şi o serie de presupuneri:
  • Mediu de lucru Unix-like, care suportă redirectări şi pipe-uri
  • Datele sunt în format Trimble
  • Date sunt preluate de la staţia permanentă EUREF din Bucureşti
  • Utilizatorul nu este idiot. Deşi este destul de sigur să faceţi copy/paste codului de mai jos, în cele mai multe situaţii va trebui să adaptaţi diverşi parametri pentru problema specifică. Presupun că se poate scrie relativ uşor un script care să ia în calcul diverse variabile, aşa că dacă sunt voluntari...

#!/usr/bin/python

import commands
import re
import os
import sys

rinexdump = "RinexDump --num --format \"%d-%m-%Y,%H:%M:%S\" "
timeconvert = "timeconvert --input-format=\"%d-%m-%Y,%H:%M:%S\""
trimbleconvert = "teqc -tr d "
ftp_site = "ftp://igs.bkg.bund.de/IGS/nrt/"

if len(sys.argv) <= 1:
print "Mod de folosire:"
print "eurefd.py [fisier2] [fisier3]"

for fname in sys.argv[1:]:
fname_rinex = fname + ".obs"

print "Convertesc in RINEX...",

convert_cmd = trimbleconvert + fname + " > " + fname_rinex

r = commands.getoutput(convert_cmd)

if r.find("cannot fopen argument file") != -1:
print "eroare"
exit()
print "gata"


print "Extrag timpul de start din RINEX...",
get_up_limit_cmd = rinexdump+fname_rinex+"| sed q | awk '{print $1 $2}'"
get_down_limit_cmd = rinexdump+fname_rinex+"| tail -1 | awk '{print $1 $2}'"

up_limit = commands.getoutput(get_up_limit_cmd)

if up_limit.find("Error") != -1:
print "eroare"
exit()
print up_limit


print "Extrag timpul de stop din RINEX...",
down_limit = commands.getoutput(get_down_limit_cmd)

if down_limit.find("Error") != -1:
print "eroare"
exit()
print down_limit

print "Valorile de timp aflate:"
timeconvert_up_cmd = timeconvert+" --input-time=\""+up_limit+"\"" + " --format=\"%j\""
timeconvert_down_cmd = timeconvert+" --input-time=\""+down_limit+"\"" + " --format=\"%j\""

up_gps_day = commands.getoutput(timeconvert_up_cmd)
if len(up_gps_day) > 3:
print " Nu am putut extrage ziua GPS (",timeconvert_up_cmd
exit()

down_gps_day = commands.getoutput(timeconvert_down_cmd)
if len(down_gps_day) > 3:
print " Nu am putut extrage ziua GPS (",timeconvert_down_cmd
exit()
if up_gps_day != down_gps_day:
print " Observatiile nu sunt din aceeasi zi."
exit()

print " ziua GPS:", up_gps_day

m = re.search('(?<=,)\w+', up_limit)
if m == None:
print " Nu am putut extrage ora de inceput din (",up_limit,")"
exit()
up_hour = m.group(0)
print " ora de inceput:",up_hour

m = re.search('(?<=,)\w+', down_limit)
if m == None:
print " Nu am putut extrage ora de inceput din (",up_limit,")"
exit()
down_hour = m.group(0)
print " ora de final:",down_hour

print "Lista fisierelor ce trebuiesc descarcate:"
lista_fisiere = list()
for i in range(int(up_hour), int(down_hour)+1):
down_hour_letter = chr(int(i)+ord('a'))

bucuname = "bucu" + up_gps_day + down_hour_letter + ".08d.Z"
fullpath = ftp_site + up_gps_day +"/"
if len(str(i))<2:
fullpath = fullpath + "0" + str(i)
else:
fullpath = fullpath + str(i)
fullpath = fullpath + "/"+bucuname
lista_fisiere.append(fullpath)
print " *",bucuname," %d" % i

print lista_fisiere


print "Descarc fisierele..."
for i in lista_fisiere:
os.system("wget -nc " + i)

print "Sterg fisierul RINEX..."
commands.getoutput("rm " + fname_rinex)

Niciun comentariu:

Trimiteți un comentariu

Ţineţi minte, ne plac mai mult comentariile favorabile.