Arbeitsgruppe 1: Markéta Pokorná , Dennis Brüning
Ziel/Aufgabe: Es soll ein Programm entwickelt werden, dass die wöchentlichen Chlorophyll-a-Datafiles (Level 3 Daten) mit 9 km Auflösung aus dem Internet herunterlädt und in einem Verzeichnis speichert. Da dies komprimierte Datafiles sind, soll das Programm ausserdem diese entpacken.
Downloaden der Datafiles von der Internetseite http://oceancolor.gsfc.nasa.gov
In diesem Programmcode definieren wir eine Funktion, die die spezifischen Datafiles downloadet und im Verzeichnis: /users/ifmlinux30a/ifmrs/u242023/SATBILD/data speichert. Die Datafiles sollen nicht im Homedirectory gespeichert werden, da die Datenmenge sehr groß ist.
Erklärungen zum Programmcode:
Es wird eine Funktion get_data definiert, die Datafiles aus dem Internet herunterlädt und sie im Verzeichnis data_dir speichert. Die in der Funktion benutzte Kennung os ist ein Modul, dass Unixbefehle in python verwenden kann.
- Als nächstes wird im Programm die Internetseite spezifiziert, auf der die wöchentlichen Datafiles bereitgestellt werden, und das Verzeichnis angegeben, in dem die Datafiles gespeichert werden sollen.
- Da jeder Dateiname so gewählt ist, dass er das Anfangs- und das Enddatum des gemessenen Zeitraums (eine Woche) enthält, wird eine Schleife definiert, die am ersten Tag des Jahres beginnt und mit einem Schrittintervall von 8 Tagen das ganze Jahr durchläuft.
Ein Beispiel eines Dateinamens ist 20040172004024.L3m_8D_CHLO_9.bz2. Das Anfangsdatum ist hier der 17.Januar, oder der 17. Tag des Jahres, der Endpunkt der 24. (also 17+7=24) Tag des Jahres.
Beispiel der heruntergeladenen Dateinamen:
- A20041052004112.L3m_8D_CHLO_9.bz2
- A20041132004120.L3m_8D_CHLO_9.bz2
- A20041212004128.L3m_8D_CHLO_9.bz2
1 from scipy import *
2 import os
3 from pylab import *
4
5 def get_data(name1,data_dir):
6 os.system('wget -P'+data_dir+' '+name1) # Download of datafiles and save in datadirectory (-P)
7 return
8
9 url='http://oceancolor.gsfc.nasa.gov/cgi/getfile/'
10 data_directory='/users/ifmlinux30a/ifmrs/u242023/SATBILD/data' # Directory path
11
12 # Count from 1 to 365 in steps of 8 and download one file for every week (7 days)
13 for begin1 in range(1,365,8):
14 datum1='2004%03d'%begin1
15 end1=begin1+7
16 datum2='2004%03d'%end1
17 filename=url+'A'+datum1+datum2+'.L3m_8D_CHLO_9.bz2' # Zipped .hdf data
18 print filename
19 get_data(filename,data_directory)
Einlesen der unzipped Dateien
Die Dateien waren nach dem Downloaden sogenannte Zipped-Dateien (komprimierte Dateien), die vor der Weiterverarbeitung noch unzipped (ausgepackt) werden müssen.
Erklärung zum Programmcode:
Es werden 4 Funktionen definiert:
read_CHLO(filename) : Diese Funktion wurde von der Arbeitsgruppe 2 übernommen. Sie liest die Chlorophyll-a-Daten (HDF-Format) aus und skaliert sie.
hdf_set(filename,z) : Mit dieser Funktion können Daten als HDF-File gespeichert werden.
unzip_data(name1,data_dir) : Diese Funktion entpackt die komprimierten Daten.
zip_data(name1,data_dir) : Diese Funktion komprimiert die Daten.
Ab Zeile 43 finden diese Funktionen Anwendung in der bereits oben beschreibenen Schleife über das ganze Jahr:
Die Datafiles sind bereits heruntergeladen und liegen im data_directory. Sie werden nun entpackt und ihre Dateinamen werden in 3 Teile aufgespalten (Strings).
Die Funktion read_CHLO wird auf die HDF-Dateien angewandt. Der nachfolgende Programmabschnitt wurde von der Gruppe 2 zur Verfügung gestellt. Hier werden die Daten auf einfache Weise auf das ECOHAM-Modellgebiet (NECS) zugeschnitten und an das Modellgitter angepasst.
diese zugeschnittenen und angepassten Daten werden im HDF-Format unter dem alten Dateinamen mit dem Anhang _cut.hdf im data_directory-Verzeichnis gespeichert.
- Zur Veranschauung wird der bearbeitete Auschnitt graphisch dargestellt.
- Zum Schluss wurden die Daten zur Lagerung wieder komprimiert.
1 from scipy import *
2 from pyhdf.SD import *
3 import os,os.path,string
4 import struct#_hdfext
5 from pylab import *
6
7 def read_CHLO(filename):
8 # Oeffne HDF4-Datei
9 f=SD(filename)
10 # Hole die Attribute (Metadata)
11 attr = f.attributes()
12 # Hole die in der Datei verfuegbaren Datensaetze
13 dsets = f.datasets()
14 # Hole die Daten aus der Datei in ein scipy.array
15 data=array(f.select('l3m_data').get())
16 # Siehe attr:
17 #'Scaling Equation': ('Base**((Slope*l3m_data) + Intercept) = Parameter value\x00',
18 Base=attr['Base']
19 Slope=attr['Slope']
20 Intercept=attr['Intercept']
21 data[(data==65535).nonzero()]=nan
22 # Skaliere die Daten, um die urspruenglichen Einheiten zu berechnen
23 data=Base**((Slope*data) + Intercept)
24 return data,attr
25
26 def hdf_set(filename,z):
27 hdfFile=filename
28 f = SD(hdfFile,SDC.WRITE|SDC.CREATE)
29 f.author = 'Lars Kaleschke'
30 v2=f.create('z',SDC.FLOAT32,(z.shape[0],z.shape[1]))
31 v2[:]=z.astype(float32)
32 f.end()
33 return
34
35 def unzip_data(name1,data_dir):
36 os.system('bunzip2 '+data_dir+name1)
37 return
38
39 def zip_data(name1,data_dir):
40 os.system('bzip2 '+data_dir+name1)
41 return
42
43 for begin1 in range(1,365,8):
44 datum1='2004%03d'%begin1
45 end1=begin1+7
46 datum2='2004%03d'%end1
47 filename='A'+datum1+datum2+'.L3m_8D_CHLO_9.bz2'
48 data_directory='/users/ifmlinux30a/ifmrs/u242023/SATBILD/data/'
49 unzip_data(filename,data_directory)
50 a=string.split((os.path.basename(data_directory+filename)),'.') #Aufspaltung des Dateinamenstrings in drei Teile
51 b=a[0]+'.'+a[1]
52 print b
53
54 img,metadata=read_CHLO(data_directory+b) #Einlesen der Hdf-Daten
55
56 ##ECOHAM3/4-Gebiet ausschneiden
57 ##ECOHAM3/4 Latitude:47.5833 to 63.9833, Longitude:-15.25 to 14.0833
58
59 ecolat1=63.9833
60 ecolat2=47.5833
61 ecolon1=-15.25
62 ecolon2=14.0833
63 latstep=float(metadata['Latitude Step'])
64 lonstep=float(metadata['Longitude Step'])
65 Nlat=float(metadata['Northernmost Latitude'])
66 Wlon=float(metadata['Westernmost Longitude']) #Koordinaten des Bildausschnitts für die Nordsee
67
68 lat1=floor((Nlat-ecolat1)/latstep)
69 lat2=ceil((Nlat-ecolat2)/latstep)
70 lon1=floor((abs(Wlon-ecolon1))/lonstep)
71 lon2=ceil((abs(Wlon-ecolon2))/lonstep)
72 img_eco34=img[lat1:lat2,lon1:lon2] #Berechnung der Koordinaten der Satellitenbilder auf den Bildausschnitt
73
74 img_eco34_modgit=ndimage.zoom(img_eco34,(82./198.,88./353.)) #Anpassung des Satellitenbildausschnittes auf Modellgitter
75
76 e=a[0]+'.'+a[1]+'_cut.hdf'
77 hdf_set(data_directory+e,img_eco34_modgit) #Speichern des angepassten Satbildes als hdf-Datei
78 figure(1) #Plotten
79 imshow(nan_to_num(img_eco34_modgit),vmin=0,vmax=5)
80 show()
81
82 zip_data(b,data_directory) #komprimieren der gedownloadeten Dateien
83 c=b+'.bz2'
84 print c