2017-04-23 1 views
1

J'essaie d'extraire des données de chaque cellule de la grille dans un domaine spécifié par l'utilisateur (non rectangulaire) défini par les limites lat/lon. Mon fichier d'entrée est sur une grille curviligne. J'ai essayé différentes méthodes python, cdo, ncks, mais je n'arrive toujours pas à le comprendre. Je veux juste une timeseries d'information pour chaque cellule de la grille dans mon sous-ensemble de domaine polygone du fichier ncfile d'entrée. Mon entrée ncfile information est donnée ici:extraire des données d'un domaine ncfile

$ ncdump -h 1979_sfc_out.nc 

netcdf \1979_sfc_out { 
dimensions: 
    x = 83 ; 
    y = 94 ; 
    time = UNLIMITED ; // (8736 currently) 
    nv4 = 4 ; 
variables: 
    float time(time) ; 
     time:axis = "T" ; 
     time:long_name = "time" ; 
     time:standard_name = "time" ; 
     time:units = "hours since 1979-1-2 00:00:00" ; 
     time:calendar = "standard" ; 
    float x(x) ; 
     x:axis = "x" ; 
     x:long_name = "X-coordinate in Cartesian system" ; 
     x:standard_name = "projection_x_coordinate" ; 
     x:units = "meters" ; 
    float y(y) ; 
     y:axis = "y" ; 
     y:long_name = "Y-coordinate in Cartesian system" ; 
     y:standard_name = "projection_y_coordinate" ; 
     y:units = "meters" ; 
    float lon(y, x) ; 
     lon:units = "degrees_east" ; 
     lon:valid_range = -180., 180. ; 
     lon:standard_name = "longitude" ; 
     lon:bounds = "lon_bnds" ; 
    float lat(y, x) ; 
     lat:units = "degrees_north" ; 
     lat:valid_range = -90., 90. ; 
     lat:standard_name = "latitude" ; 
     lat:bounds = "lat_bnds" ; 
    float lon_bnds(y, x, nv4) ; 
     lon_bnds:units = "degreesE" ; 
    float lat_bnds(y, x, nv4) ; 
     lat_bnds:units = "degreesN" ; 
    char mapping ; 
     mapping:false_easting = 0. ; 
     mapping:false_northing = 0. ; 
     mapping:grid_mapping_name = "polar_stereographic" ; 
     mapping:latitude_of_projection_origin = 90. ; 
     mapping:standard_parallel = 64. ; 
     mapping:straight_vertical_longitude_from_pole = -152. ; 
     mapping:semi_major_axis = 6370000. ; 
     mapping:semi_minor_axis = 6370000. ; 
    float SEAICE(time, y, x) ; 
     SEAICE:_FillValue = -9999.f ; 
     SEAICE:units = "fraction" ; 
     SEAICE:long_name = "Ice concentration (ice=1;no ice=0)" ; 
     SEAICE:grid_mapping = "mapping" ; 
     SEAICE:coordinates = "lon lat" ; 

Certaines des choses que j'ai essayé sont

lat1=71.2 
lat2=72.9 
lon1=-176.5 
lon2=-160 

cdo sellonlatbox,lon1,lon2,lat1,lat2 $ifile $box1_ofile 
cdo sellonlatbox (Abort): Float parameter >lon1< contains invalid character at position 1! 

Je pense que le problème est mon fichier d'entrée a x, dimension y en mètres (qui ne avoir un signe négatif et est probablement le 'caractère invalide en position 1'), et je demande à cdo d'extraire la dimension lat/lon en degrés. J'ai la variable 'mapping' dans mon fichier ncfile qui pourrait être utile pour convertir des mètres en lat/lon, mais je n'arrive pas à comprendre comment le faire.

Et ncks ne fonctionne pas pour moi ici, probablement en raison du même compteur < -> problème lon/lat je vois avec cdo.

ncks -v SEAICE,U10,V10 -d latitude,71.2,72.9 -d longitude,-176.5,-160. $ifile -O $box1_ofile 

ncks: ERROR dimension latitude is not in input file 

Bien que je veux un polygone extrait, ces exemples que j'ai essayé ne sont que des sous-ensembles rectangle, que je pensais pour obtenir le polygone que je peux faire plusieurs sous-ensembles de rectangle pour atteindre ma forme de polygone finale, mais s'il y a une meilleure façon de le faire tout conseil est apprécié.

Merci

Répondre

1

coordonnées auxiliaires de NCO feature sont conçus pour hyperslab coordonnées curvilignes sur un maillage non structuré avec une D-lat et lon. Essayez ceci:

ncks -X lon_min,lon_max,lat_min,lat_max in.nc out.nc 
ncks -X -176.5,-160.,71.2,72.9 in.nc out.nc 

Vous pouvez également connecter en chaîne plusieurs options -X pour obtenir des polygones bizarres. Malheureusement, cela ne fonctionnera probablement pas pour vous parce que, je viens de le remarquer, vous avez une grille curviligne avec lat lat et lon. Pour cela, essayez le ncap2 où feature. Les exemples dans le manuel montrent comment masquer le long des limites rectangulaires, et vous pouvez chaîner les conditions dans l'instruction where() pour obtenir un polygone. Cela ne changera pas la dimensionnalité du fichier de sortie, mais il vous permet de tout définir à l'extérieur du polygone à un _FillValue.