I have a netcdf file showing elevation over Europe derived from GTopo30. Turns out that the extent of this raster file is too big to combine it with other layers, so I would like to crop it to a given extent specified in lat/lon coordinates. I have seen some examples here and here trying to make this operation I am describing, but it seems they are not working in this case.
The raster file description looks like this:
<xarray.DataArray (band: 14, y: 5520, x: 8400)>
[649152000 values with dtype=float64]
Coordinates:
* band (band) int64 1 2 3 4 5 6 7 8 9 10 11 12 13 14
* y (y) float64 71.0 70.99 70.98 70.97 70.96 ... 25.03 25.02 25.01 25.0
* x (x) float64 -25.0 -24.99 -24.98 -24.97 ... 44.97 44.98 44.99 45.0
Attributes:
transform: (0.0083333333, 0.0, -25.000139509, 0.0, -0.0083333333, 70....
crs: +init=epsg:4326
res: (0.0083333333, 0.0083333333)
is_tiled: 0
nodatavals: (-1.7e+308, -1.7e+308, -1.7e+308, -1.7e+308, -1.7e+308, -1...
scales: (1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1....
offsets: (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....
descriptions: ('tpi', 'slope', 'aspect', 'Pvec', 'Qvec', 'alt', 'dist2co...
So, as you can see, the longitude and longitudes are stored under the "x" and "y" coordinates and they come in WGS84 (EPSG:4326) format.
The extent is this:
min_lon = -24.995
min_lat = 25.05
max_lon = 45.50
max_lat = 71.55
I tried to use xarray's filters and subsetting, but it seems I am doing something wrong, since I can't get the required slice:
# Example 1
sel1 = band.sel(x=(band.x < max_lon) | (band.x > min_lon))
sel2 = sel1.sel(y=(sel1.y < max_lat) | (sel1.y > min_lat))
# Example 2
sel1 = band.where((band.x < max_lon) | (band.x > min_lon))
sel2 = sel1.where((sel1.x < max_lat) | (sel1.x > min_lat))
Both of them produce: KeyError: "not all values found in index 'x'"
What is the correct xarray
way of cropping a large raster to a given lat/lon window?
Thanks!