LehreWiki

SiaChlorophyllProjekt

Die einzelnen Teilergebnisse der Gruppen sind hier zusammen gefügt:

Erklärungen zu den einzelnen Programmteilen sind unter ChlorophyllArbeitsGruppe1 und ChlorophyllArbeitsGruppe2 zu finden. Die Funktionen und Programmteile, die die gmt-Darstellung ermöglichen wurden von Lars Kaleschke erarbeitet (siehe auch ChlorophyllProgrammcodes ).

   1 from scipy import *
   2 from pyhdf.SD import *
   3 import os,os.path,string,pipes
   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 def hdf_get(filename):
  44     f = SD(filename)
  45     dsets = f.datasets()
  46     d={}
  47     for dset in dsets.keys():
  48         ds=f.select(dset)
  49         d[dset]=array(ds.get(),float)
  50     return d
  51 
  52 
  53 def write_grd(data,lat,lon,filename,I,R):
  54 
  55     # Write to GMT/NetCDF .grd
  56 
  57     grdtable,grdfile=filename+'.tab',filename
  58     pipe=pipes.Template()
  59     cmd='xyz2grd -V  -bis '+I+' '+R+' -G'+grdfile
  60     print cmd
  61     pipe.append(cmd,'-.')
  62     f=pipe.open(grdtable, 'w')
  63     sy,sx=data.shape[0],data.shape[1]
  64     for yi in range(0,sy):
  65         for xi in range(0,sx):
  66             f.write(struct.pack("f",lon[yi,xi])+struct.pack("f",lat[yi,xi])+struct.pack("f",data[yi,xi]))
  67     f.close()
  68 
  69     return
  70 
  71 
  72 def gmt_map(data,outfile,title):
  73     Dlon=1.0/3
  74     Dlat=0.2
  75 
  76     X=88
  77     Y=82
  78 
  79     upper_lat=63.983
  80     lower_lat=upper_lat-Dlat*Y+Dlat
  81     western_lon=-15.25
  82     eastern_lon=western_lon+Dlon*X
  83 
  84     R=' -R%f'%western_lon+'/%f'%eastern_lon+'/%f'%lower_lat+'/%f'%upper_lat
  85     I=' -I0.3333333/0.2'
  86     J=' -Jm0.2 '
  87     A=' -Ba5g5/a5g5NESW '
  88     C='color.tab'
  89 
  90     lats=(upper_lat-indices((Y,X))[0,:,:].astype(float)*Dlat)
  91     lons=(indices((Y,X))[1,:,:].astype(float)*Dlon+western_lon)
  92 
  93     filename='data.grd'
  94     write_grd(data,lats,lons,filename,I,R)
  95 
  96 
  97     os.system('gmtset PAPER_MEDIA A4 PLOT_DEGREE_FORMAT ddd:mm:ss')
  98     os.system('makecpt -Cjet -T0/5/1  -Z -D  > '+C)
  99     os.system('grdimage '+filename+R+J+A+' -C'+C+'   -K > '+outfile)
 100     os.system('pscoast '+R+J+A+' -N1 -W1/0/0/0 -G200/200/200 -Di -K -O >> '+outfile)
 101 
 102     #Scale bar
 103     scl_tick='1/:mg/m\032:'
 104     print 'Add scale bar'
 105     os.system('psscale -D3.5/-0.6/2.0/0.1h -E -C'+C+' -B'+scl_tick+' -K -O >> '+outfile)
 106     os.system('echo "0.0 -0.03 14 0.0 0 0  '+title+'" | pstext -N -R0/1/0/1 -JX21/29  -O >> '+outfile)
 107     return
 108 
 109 
 110 for begin1 in range(1,365,8):
 111         datum1='2004%03d'%begin1
 112         end1=begin1+7
 113         datum2='2004%03d'%end1
 114         filename='A'+datum1+datum2+'.L3m_8D_CHLO_9.bz2'
 115         data_directory='/users/ifmlinux30a/ifmrs/u242023/SATBILD/data/'
 116         unzip_data(filename,data_directory)
 117         a=string.split((os.path.basename(data_directory+filename)),'.') #Aufspaltung des Dateinamenstrings in drei Teile
 118         b=a[0]+'.'+a[1]
 119         print b
 120 
 121         img,metadata=read_CHLO(data_directory+b) #Einlesen der Hdf-Daten
 122 
 123         ##ECOHAM3/4-Gebiet ausschneiden
 124         ##ECOHAM3/4 Latitude:47.5833 to 63.9833, Longitude:-15.25 to 14.0833
 125         ecolatstep=0.2
 126         ecolonstep=1./3.
 127         ecolat1=63.9833
 128         ecolat2=47.5833
 129         ecolon1=-15.25
 130         ecolon2=14.0833
 131 
 132         #Geographische Koordinaten des Satbildes:
 133         latstep=float(metadata['Latitude Step'])
 134         lonstep=float(metadata['Longitude Step'])
 135         Nlat=float(metadata['Northernmost Latitude'])
 136         Wlon=float(metadata['Westernmost Longitude'])
 137         Slat=float(metadata['Southernmost Latitude'])
 138         Olon=float(metadata['Easternmost Longitude'])
 139 
 140         #Berechnung der gedachten Modellraender bei Erweiterung auf (fast) gesamte Erde:
 141         modrand_N=ecolat1+floor((Nlat-ecolat1)/ecolatstep)*ecolatstep
 142         modrand_W=ecolon1+ceil((Wlon-ecolon1)/ecolonstep)*ecolonstep
 143         modrand_S=ecolat1+ceil((Slat-ecolat1)/ecolatstep)*ecolatstep
 144         modrand_O=ecolon1+floor((Olon-ecolon1)/ecolonstep)*ecolonstep
 145 
 146         #Berechnung der neuen Unterteilung des Satbildgitters fuer optimales Abschneiden zur Anpassung an Modellraender:
 147 
 148         zoom11=abs(latstep/(Nlat-modrand_N))   #Berechnung des zoom-Faktors, so dass am Nord- und Ostrand genau eine Pixelweite
 149         zoom12=abs(lonstep/(Wlon-modrand_W))   #abgeschnittten wird
 150         Sfaktor=int(round(abs(Slat-modrand_S)/(Nlat-modrand_N)))
 151         Ofaktor=int(round((Olon-modrand_O)/abs(Wlon-modrand_W)))
 152 
 153         img_zoom1=ndimage.zoom(img,(zoom11,zoom12),order=1)
 154 
 155         #Abschneiden der ueberstehenden Pixel im Satbild:
 156         s=img_zoom1.shape
 157         s1=s[0]-Sfaktor-1
 158         s2=s[1]-Ofaktor-1
 159         img_cut1=img_zoom1[1:s1,1:s2]
 160 
 161         #Anpassung des Satellitenbildes an Modellgitter:
 162         zoom21=(180./s[0])/0.2
 163         zoom22=(360./s[1])/(1./3.)
 164         img_zoom2=ndimage.zoom(img_cut1,(zoom21,zoom22),order=1)
 165 
 166         #Ausschneiden des Modellausschnitts aus Satbild:
 167         lat1=int(round((modrand_N-ecolat1)/ecolatstep))
 168         lat2=int(round((modrand_N-ecolat2)/ecolatstep))
 169         lon1=int(round(abs(modrand_W-ecolon1)/ecolonstep))
 170         lon2=int(round(abs(modrand_W-ecolon2)/ecolonstep))
 171         img_cut2_ord1=img_zoom2[lat1:lat2,lon1:lon2]
 172 
 173          
 174         #
 175         e=a[0]+'.'+a[1]+'_cut.hdf'
 176         hdf_set(data_directory+e,img_cut2_ord1) #Speichern des angepassten Satbildes als hdf-Datei
 177         #figure(1)  #Plotten
 178         #imshow(nan_to_num(img_cut2_ord1),vmin=0,vmax=5)
 179         #show()
 180         title='Chlorophyll '+a[0]
 181         outfile=a[0]+'.'+a[1]+'_cut.ps'
 182         gmt_map(img_cut2_ord1,data_directory+outfile,title)
 183 
 184         zip_data(b,data_directory) #komprimieren der gedownloadeten Dateien
 185         c=b+'.bz2'
 186         print c

LehreWiki: ChlorophyllGruppenEndergebnis (last edited 2008-04-28 10:21:01 by BenteTiedje)