Daha çox

GRIB sənədlərindən xüsusi məlumatlar necə çıxarılır?


Python və gribapi paketi ilə alınan GRIB məlumatları necə çıxarılır (link rəsmi ECMWF Wiki-yə gedir)? Onların "sənədlərindən" bir neçə nümunə götürməyə çalışdım və bunu özüm də etdim, ancaq yalnız müəyyən bir parametri (məsələn, səth temperaturu və ya külək) verilmiş enlik və boylam üçün necə alacağımı başa düşə bilmirəm. Verilənləri və görselləşdirmələri qurmağım lazım deyil, sadəcə faylı oxuyarkən bir neçə parametr ötürməli və nömrələri geri qaytarmalıyam.

İndiyə qədər orijinal GRIB2 faylını www.ftp.ncep.noaa.gov'dan yükləməyə və adı çəkilən ECMWF Wiki səhifəsindən az sayda Python API nümunə skriptini işləməyə çalışdım. Python API sənədləri olmadığı üçün hansı metodları istifadə etməli olduğumu anlamaqda çətinlik çəkirəm:

  • faylı oxuyun,
  • bir faylda daha çox "mesaj" varsa, yalnız xüsusi "mesaj" seçin (məsələn, yalnız səth temperaturu),
  • müəyyən bir yer üçün dəyəri çap edin (istifadə edərəkgrib_find_nestmetod).

İndiyə qədər sahib olduğum nümunə kodu, əsasən ECMWF nümunələrindən kopyaladım və bu cavabı GRIB sənədindən vaxt ölçüsü əldə etməkdən ?:

idxal traceback idxal sys # inşallah gribapi importdan lazım olan yeganə xarici paketi mümkün olan bütün 'mesajlar' olan INPUT = '2015121406_gfs.t06z.pgrb2.0p25.f000' VERBOSE = 1 # ətraflı səhv hesabat def misal (): f = open (INPUT) # bizimlə maraqlandığımız yer, lon = 64.1353, -21.8952 isə 1: # ADIM 1: # açıq yüklənmiş GRIB2 faylı gid = grib_new_from_file (f) əgər Gid yoxdursa: break # iteratoru təyin edin (olan proqram boyu eyni?) iterid = grib_iterator_new (gid, 0) # ən yaxın yer üçün nəticəni əldə edin = grib_find_nearest (gid, lat, lon) [0] 1: # ADIM 2: # ??? # # döngü bütün sənəddən keçir # bunun əvəzinə əvvəlcədən lazım olan mesajları seçmək ... # hamısını təkrarlamağa ehtiyac olmadan yalnız # səth mesajlarında # 'TMP' (temperatur) seçən xəyali funksiya: # # nəticə = grib_select_specific_message (gid, 'TMP', 'surface') result = grib_iterator_next (iterid) Əgər nəticə yoxdursa: break # ADIM 3: # mənfəət! # nəticə dəyişən, ehtiyac duyduğum hər hansı bir şəkildə işlədiyim nömrələri qaytarır, yay! # sənədsiz daha çox şey, # nümunələri eyni şəkildə etdiyinə görə buraya qoyun grib_iterator_delete (iterid) grib_release (gid) f.close () # main program function def main (): try: example () istisna olmaqla GribInternalError, səhv: əgər VERBOSE : traceback.print_exc (file = sys.stderr) else: print >> sys.stderr, err.msg return 1 # __name__ == "__main__" olduqda proqramı çalıştırın: sys.exit (main ())

Bu kodun problemi, bütün faylı, bütün mesajları və bütün mümkün koordinatları (bütün planet, 0,25 dərəcə dəqiqliklə) təkrarlamaqdır. Əgər fayl 300+ MB-dırsa, onu götürmək lazımdır bir müddət oxumaq. Burada "iterator" istifadə etməyi hiss edirəm (nə olursa olsun) bir az səhvdir, çünki yalnız xüsusi məlumatları "albalı seçmək" lazımdır (yalnız müəyyən bir yer üçün az hava parametrləri) vəgrib_find_nestest ()məlumatların yalnız bir hissəsini seçmək üçün funksiyaya ümumiyyətlə təkrarlayıcıya ehtiyac yoxdur.
Bu mənə lazım olan məlumatların süzülməsi ilə yarım həll edilə bilər əvvəl faylı yükləmək (daha kiçik bir faylla nəticələnir), amma hələ də necə edəcəyimdən əmin deyiləm (GRIB GFS fayllarını xüsusi filtrlərlə yükləməyin bir hissəsi?), Ancaq yenə də bunu başa düşmək istərdim, çünki ola bilər bəzən "tam" faylları yükləmək məcburiyyətində qalacaq.


Digər bir fikir pygrib modulundan istifadə etmək olar:

import pygrib grbs = pygrib.open ("my_file.grb") # maraqlandığınız ızgaraları seçmək üçün grbs.select istifadə edin (shortName, typeOfLevel, level = 500, marsParam, dataDate, dataTime,…) DATA = np.array ( grbs.select (marsParam = my_param, dataDate = my_date, dataTime = my_time)) # DATA 3 massivdən ibarət olacaq # dəyərlər üçün # DATA [0] dəyərlər üçün # DATA [1] uzunluqlar üçün # DATA [2] enlemler üçün # "dəyərlərdən" massiv, lon və lat dilində çıxarış DATA1 = DATA [0] .data (lat1 = my_y1, lat2 = my_y2, lon1 = my_x1, lon2 = my_x2))

Nəticədə gribapi qazmaqla və problemimi çox zərif bir şəkildə həll edən Met Office-in Iris Python paketinə keçməklə başa çatdım. Quraşdırmağın bir az ağrısı olsa da (asılılıqlar həqiqətən çətin ola bilər) heç olmasa sənədlər yaxşıdır və istifadəsi həqiqətən asandır.