Mer

Hvordan henter ut spesifikk informasjon fra GRIB-filer?

Hvordan henter ut spesifikk informasjon fra GRIB-filer?


Hvordan trekker jeg ut hentede GRIB-data med Python og gribapi-pakken (lenke går til offisiell ECMWF Wiki)? Jeg prøvde å følge noen eksempler fra "dokumentasjonen" deres og gjøre det selv, men jeg kan bare ikke finne ut hvordan jeg bare kan hente spesifikk parameter (f.eks. Overflatetemperatur eller vind) for gitt breddegrad og lengdegrad. Jeg trenger ikke å plotte dataene eller visualiseringene, jeg trenger bare å gi noen parametere når jeg leser filen og får tilbake tall.

Så langt prøvde jeg å laste ned original GRIB2-fil fra www.ftp.ncep.noaa.gov og kjøre noen eksempler på Python API-skript fra nevnte ECMWF Wiki-side. Siden Python API-dokumentasjon ikke eksisterer, har jeg vanskelig for å forstå hvilke metoder jeg skal bruke for å:

  • les filen,
  • velg bare spesifikk "melding" (f.eks. bare overflatetemperatur) hvis det er flere "meldinger" i en fil,
  • skriv ut verdien for et bestemt sted (ved hjelp avgrib_find_nearestmetode).

Eksempelkode som jeg har så langt, mest kopiert fra ECMWF-eksempler og dette svaret fra Få tidsdimensjon fra GRIB-fil ?:

import traceback import sys # forhåpentligvis den eneste eksterne pakken jeg trenger fra gribapi import * # fil med alle mulige 'meldinger' INNGANG = '2015121406_gfs.t06z.pgrb2.0p25.f000' VERBOSE = 1 # detaljert feilrapportering def eksempel (): f = åpen (INNGANG) # sted vi er interessert i lat, lon = 64.1353, -21.8952 mens 1: # TRINN 1: # åpen nedlastet GRIB2-fil gid = grib_new_from_file (f) hvis gid er Ingen: break # definer iteratoren (som er gjennom hele programmet det samme?) iterid = grib_iterator_new (gid, 0) # få resultatet for nærmeste sted nærmest = grib_find_nearest (gid, lat, lon) [0] mens 1: # TRINN 2: # ??? # # sløyfen går gjennom hele filen # i stedet for bare å velge meldinger vi trenger på forhånd ... # fiktiv funksjon som velger # 'TMP' (temperatur) på 'overflatemeldinger' bare # uten å måtte gjenta dem alle: # # resultat = grib_select_specific_message (gid, 'TMP', 'overflate') resultat = grib_iterator_next (iterid) hvis ikke resultat: bryt # TRINN 3: # fortjeneste! # result variable returnerer tall som jeg behandler på noen måte jeg trenger, yay! # mer udokumenterte ting, # sett her bare fordi eksempler gjør det på samme måte grib_iterator_delete (iterid) grib_release (gid) f.close () # hovedprogramfunksjon def main (): prøv: eksempel () unntatt GribInternalError, feil: hvis VERBOSE : traceback.print_exc (file = sys.stderr) annet: skriv ut >> sys.stderr, err.msg return 1 # kjør programmet hvis __name__ == "__main__": sys.exit (main ())

Problemet med denne koden er at den itererer gjennom hele filen, alle meldingene og alle mulige koordinater (hele planeten, 0,25 graders presisjon). Hvis filen er 300+ MB tar den en stund å lese den. Jeg har lyst til å bruke "iterator" her (uansett hva det er) er litt galt siden jeg trenger å "kirsebærplukke" bare spesifikk informasjon (få værparametere bare for et bestemt sted) oggrib_find_nearest ()funksjonen trenger ikke en iterator i det hele tatt for å bare velge en del av dataene.
Dette kan løses halvt ved å filtrere dataene jeg trenger før laste ned filen (resulterer i mye mindre fil), men jeg er fortsatt ikke sikker på hvordan jeg skal gjøre det (en del av nedlasting av GRIB GFS-filer med spesifikke filtre?), men jeg vil likevel finne ut av dette siden det kan skje at jeg vil av og til måtte laste ned "fulle" filer.


En annen idé ville være å bruke pygrib-modulen:

importer pygrib grbs = pygrib.open ("my_file.grb") # bruk grbs.select for å velge nettene du er interessert i (shortName, typeOfLevel, level = 500, marsParam, dataDate, dataTime, ...) DATA = np.array ( grbs.select (marsParam = my_param, dataDate = my_date, dataTime = my_time)) # DATA vil inneholde 3 matriser # DATA [0] for verdier # DATA [1] for lengdegrader # DATA [2] for breddegrader # fra "verdiene" matrise, trekke ut i lon og lat DATA1 = DATA [0] .data (lat1 = my_y1, lat2 = my_y2, lon1 = my_x1, lon2 = my_x2))

Jeg endte til slutt med å slippe gribapi og bytte til Met Office's Iris Python-pakke som løser problemet mitt på en veldig elegant måte. Selv om det var litt vondt å installere den (avhengigheter kan være veldig vanskelig), er dokumentasjonen i det minste god, og den er veldig enkel å bruke.