NetCDF: How to mask/filter out non-land values in global dataset, preferably using Python and/or NCO?

*爱你&永不变心* 提交于 2019-12-07 22:56:41

问题


I have a global data at 0.25 degree resolution that I'd like to mask so that it only contains data values over land.

The data covers full 360 degrees in the lon dimension and from -60 to 60 degrees in the lat dimension.

The file header, as well as summary lat and lon coordinate values, are listed below:

netcdf cmorph_global_daily {
dimensions:
    lat = UNLIMITED ; // (480 currently)
    lon = 1440 ;
    time = 7305 ;
variables:
    float lat(lat) ;
        lat:units = "degrees_north" ;
        lat:long_name = "Latitude" ;
    float lon(lon) ;
        lon:units = "degrees_east" ;
        lon:long_name = "Longitude" ;
    float prcp(lat, lon, time) ;
        prcp:_FillValue = NaNf ;
        prcp:units = "mm" ;
        prcp:standard_name = "precipitation" ;
        prcp:long_name = "Precipitation" ;
        prcp:description = "CMORPH Version 1.0BETA Version, daily precip from 00Z-24Z" ;
    int time(time) ;
        time:units = "days since 1900-01-01" ;
        time:long_name = "Time" ;
        time:calendar = "gregorian" ;

// global attributes:
        :history = "Mon Mar 26 10:44:42 2018: ncpdq -a lat,lon,time cmorph_adjusted_daily.nc latlontime/cmorph_adjusted_daily.nc\nThu Mar 15 10:21:10 2018: ncks -4 cmorph_adjusted_daily.nc cmorph_adjusted_daily.nc" ;
        :nco_openmp_thread_number = 1 ;
        :title = "CMORPH Version 1.0BETA Version, daily precip from 00Z-24Z" ;
        :NCO = "4.7.2" ;
data:

 lat = -59.875, -59.625, -59.375, -59.125, ..., 59.125, 59.375, 59.625, 59.875 ;
 lon = 0.125, 0.375, 0.625, 0.875, 1.125, ..., 359.125, 359.375, 359.625, 359.875 ;

I would prefer to do this using Python/numpy and/or NCO since that's my typical toolset. Thanks in advance for any suggestions.


回答1:


Once you have a variable on the same grid to mask with, you can use ncap2 where, e.g.,

ncap2 -s 'where(LANDMASK != 1) prcp=prcp@_FillValue' in.nc out.nc

If your mask is on a different grid than your data, you can use (on Linux/Mac) the masking features of ncremap, e.g., to remap your data to your mask (or visa versa) with something like

ncremap --msk_dst=LANDMASK -d mask.nc prcp_in.nc prcp_out.nc



回答2:


A solution with CDO

# make landseamask on 0.25 grid with 1 for land and missing for sea
cdo -P 8 -f nc2 setctomiss,0 -gtc,0 -remapcon,r1440x720 -topo seamask.nc

# not sure if you need to do this but lets put your data on same grid
cdo remapcon,r1440x720 yourdata.nc yourdataremap.nc

# now mask the data
cdo mul yourdataremap.nc seamask.nc yourdatamasked.nc

hope that works...



来源:https://stackoverflow.com/questions/49548372/netcdf-how-to-mask-filter-out-non-land-values-in-global-dataset-preferably-usi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!