id,node_id,number,title,user,state,locked,assignee,milestone,comments,created_at,updated_at,closed_at,author_association,active_lock_reason,draft,pull_request,body,reactions,performed_via_github_app,state_reason,repo,type 2132500634,I_kwDOAMm_X85_G2Ca,8742,Y-axis is reversed when using to_zarr(),7837535,closed,0,,,3,2024-02-13T14:48:30Z,2024-04-28T20:08:13Z,2024-04-28T20:08:13Z,NONE,,,,"### What happened? When I export a dataset to NetCDF and Zarr, the y axis appears to have been reversed with gdalinfo. I also cannot build a vrt file with the Zarr file since it complains about positive NS axis, but this works fine with the NetCDF file. Example NetCDF file as input: [in.nc.zip](https://github.com/pydata/xarray/files/14266922/in.nc.zip) gdalinfo on output NetCDF file: ``` $ gdalinfo NETCDF:out.nc:air_temperature_2m Driver: netCDF/Network Common Data Format Files: out.nc out.nc.aux.xml Size is 949, 1069 Coordinate System is: PROJCRS[""unnamed"", BASEGEOGCRS[""unknown"", DATUM[""unnamed"", ELLIPSOID[""Sphere"",6371000,0, LENGTHUNIT[""metre"",1, ID[""EPSG"",9001]]]], PRIMEM[""Greenwich"",0, ANGLEUNIT[""degree"",0.0174532925199433, ID[""EPSG"",9122]]]], CONVERSION[""unnamed"", METHOD[""Lambert Conic Conformal (2SP)"", ID[""EPSG"",9802]], PARAMETER[""Latitude of false origin"",63.3, ANGLEUNIT[""degree"",0.0174532925199433], ID[""EPSG"",8821]], PARAMETER[""Longitude of false origin"",15, ANGLEUNIT[""degree"",0.0174532925199433], ID[""EPSG"",8822]], PARAMETER[""Latitude of 1st standard parallel"",63.3, ANGLEUNIT[""degree"",0.0174532925199433], ID[""EPSG"",8823]], PARAMETER[""Latitude of 2nd standard parallel"",63.3, ANGLEUNIT[""degree"",0.0174532925199433], ID[""EPSG"",8824]], PARAMETER[""Easting at false origin"",0, LENGTHUNIT[""metre"",1], ID[""EPSG"",8826]], PARAMETER[""Northing at false origin"",0, LENGTHUNIT[""metre"",1], ID[""EPSG"",8827]]], CS[Cartesian,2], AXIS[""easting"",east, ORDER[1], LENGTHUNIT[""metre"",1, ID[""EPSG"",9001]]], AXIS[""northing"",north, ORDER[2], LENGTHUNIT[""metre"",1, ID[""EPSG"",9001]]]] Data axis to CRS axis mapping: 1,2 Origin = (-1061334.000000000000000,1338732.125000000000000) Pixel Size = (2500.000000000000000,-2500.000000000000000) Metadata: air_temperature_2m#coordinates=longitude latitude air_temperature_2m#grid_mapping=projection_lambert air_temperature_2m#long_name=Screen level temperature (T2M) air_temperature_2m#standard_name=air_temperature air_temperature_2m#units=K air_temperature_2m#_FillValue=9.96921e+36 height1#description=height above ground height1#long_name=height height1#positive=up height1#units=m height1#_FillValue=nan NC_GLOBAL#coordinates=projection_lambert time NETCDF_DIM_EXTRA={height1} NETCDF_DIM_height1_DEF={1,5} NETCDF_DIM_height1_VALUES=2 projection_lambert#earth_radius=6371000 projection_lambert#grid_mapping_name=lambert_conformal_conic projection_lambert#latitude_of_projection_origin=63.3 projection_lambert#longitude_of_central_meridian=15 projection_lambert#standard_parallel={63.3,63.3} x#long_name=x-coordinate in Cartesian system x#standard_name=projection_x_coordinate x#units=m x#_FillValue=nan y#long_name=y-coordinate in Cartesian system y#standard_name=projection_y_coordinate y#units=m y#_FillValue=nan Geolocation: LINE_OFFSET=0 LINE_STEP=1 PIXEL_OFFSET=0 PIXEL_STEP=1 SRS=GEOGCS[""WGS 84"",DATUM[""WGS_1984"",SPHEROID[""WGS 84"",6378137,298.257223563,AUTHORITY[""EPSG"",""7030""]],AUTHORITY[""EPSG"",""6326""]],PRIMEM[""Greenwich"",0,AUTHORITY[""EPSG"",""8901""]],UNIT[""degree"",0.0174532925199433,AUTHORITY[""EPSG"",""9122""]],AXIS[""Latitude"",NORTH],AXIS[""Longitude"",EAST],AUTHORITY[""EPSG"",""4326""]] X_BAND=1 X_DATASET=NETCDF:""out.nc"":longitude Y_BAND=1 Y_DATASET=NETCDF:""out.nc"":latitude Corner Coordinates: Upper Left (-1061334.000, 1338732.125) ( 18d10'24.02""W, 72d45'59.56""N) Lower Left (-1061334.000,-1333767.875) ( 0d15'55.60""E, 50d18'23.10""N) Upper Right ( 1311166.000, 1338732.125) ( 54d17'24.85""E, 71d34'43.38""N) Lower Right ( 1311166.000,-1333767.875) ( 33d 2'20.10""E, 49d45' 6.51""N) Center ( 124916.000, 2482.125) ( 17d30' 3.21""E, 63d18' 1.50""N) Band 1 Block=949x1069 Type=Float32, ColorInterp=Undefined Min=236.480 Max=284.937 Minimum=236.480, Maximum=284.937, Mean=269.816, StdDev=9.033 NoData Value=9.96920996838686905e+36 Unit Type: K Metadata: coordinates=longitude latitude grid_mapping=projection_lambert long_name=Screen level temperature (T2M) NETCDF_DIM_height1=2 NETCDF_VARNAME=air_temperature_2m standard_name=air_temperature STATISTICS_MAXIMUM=284.93682861328 STATISTICS_MEAN=269.81614967971 STATISTICS_MINIMUM=236.47978210449 STATISTICS_STDDEV=9.0332172122638 units=K _FillValue=9.96921e+36 ``` gdalinfo on output Zarr file: ``` $ gdalinfo ZARR:out.zarr:/air_temperature_2m:0 Driver: Zarr/Zarr Files: none associated Size is 949, 1069 Origin = (-1061334.000000000000000,-1333767.875000000000000) Pixel Size = (2500.000000000000000,2500.000000000000000) Metadata: coordinates=longitude latitude grid_mapping=projection_lambert long_name=Screen level temperature (T2M) standard_name=air_temperature Corner Coordinates: Upper Left (-1061334.000,-1333767.875) Lower Left (-1061334.000, 1338732.125) Upper Right ( 1311166.000,-1333767.875) Lower Right ( 1311166.000, 1338732.125) Center ( 124916.000, 2482.125) Band 1 Block=475x268 Type=Float32, ColorInterp=Undefined NoData Value=9.96920996838686905e+36 Unit Type: K ``` The main issue is that the origin and y-axis direction is reversed, as you can see from the origin and pixel size. I have tried taking the CRS from the netcdf and adding it to the Zarr file as a `_CRS` attribute manually, but this doesn't make any difference to the origin or pixel size. ### What did you expect to happen? Origin, pixel size and corner coords should match those in the netcdf file. ``` $ gdalinfo ZARR:out.zarr:/air_temperature_2m:0 Driver: Zarr/Zarr Files: none associated Size is 949, 1069 Origin = (-1061334.000000000000000,1338732.125000000000000) Pixel Size = (2500.000000000000000,-2500.000000000000000) Metadata: coordinates=longitude latitude grid_mapping=projection_lambert long_name=Screen level temperature (T2M) standard_name=air_temperature Corner Coordinates: Corner Coordinates: Upper Left (-1061334.000, 1338732.125) ( 18d10'24.02""W, 72d45'59.56""N) Lower Left (-1061334.000,-1333767.875) ( 0d15'55.60""E, 50d18'23.10""N) Upper Right ( 1311166.000, 1338732.125) ( 54d17'24.85""E, 71d34'43.38""N) Lower Right ( 1311166.000,-1333767.875) ( 33d 2'20.10""E, 49d45' 6.51""N) Center ( 124916.000, 2482.125) ( 17d30' 3.21""E, 63d18' 1.50""N) Band 1 Block=475x268 Type=Float32, ColorInterp=Undefined NoData Value=9.96920996838686905e+36 Unit Type: K ``` ### Minimal Complete Verifiable Example ```Python import xarray as xr from pyproj import CRS ds = xr.open_dataset(""in.nc"") # Optionally take copy CRS to Zarr (produces and error, but does work) crs_wkt = CRS.from_cf(ds[""projection_lambert""].attrs).to_wkt() ds[""air_temperature_2m""] = ds[""air_temperature_2m""].assign_attrs(_CRS={""wkt"": crs_wkt}) ds.to_zarr(""out.zarr"") ds.to_netcdf(""out.nc"") ``` ### MVCE confirmation - [X] Minimal example — the example is as focused as reasonably possible to demonstrate the underlying issue in xarray. - [X] Complete example — the example is self-contained, including all data and the text of any traceback. - [X] Verifiable example — the example copy & pastes into an IPython prompt or [Binder notebook](https://mybinder.org/v2/gh/pydata/xarray/main?urlpath=lab/tree/doc/examples/blank_template.ipynb), returning the result. - [X] New issue — a search of GitHub Issues suggests this is not a duplicate. - [X] Recent environment — the issue occurs with the latest version of xarray and its dependencies. ### Relevant log output _No response_ ### Anything else we need to know? _No response_ ### Environment
INSTALLED VERSIONS ------------------ commit: None python: 3.11.7 (main, Dec 15 2023, 18:12:31) [GCC 11.2.0] python-bits: 64 OS: Linux OS-release: 6.5.0-15-generic machine: x86_64 processor: x86_64 byteorder: little LC_ALL: None LANG: en_US.UTF-8 LOCALE: ('en_US', 'UTF-8') libhdf5: 1.12.2 libnetcdf: 4.9.3-development xarray: 2024.1.1 pandas: 2.2.0 numpy: 1.26.4 scipy: None netCDF4: 1.6.5 pydap: None h5netcdf: None h5py: None Nio: None zarr: 2.16.1 cftime: 1.6.3 nc_time_axis: None iris: None bottleneck: None dask: None distributed: None matplotlib: None cartopy: None seaborn: None numbagg: None fsspec: None cupy: None pint: None sparse: None flox: None numpy_groupies: None setuptools: 68.2.2 pip: 23.3.1 conda: None pytest: None mypy: None IPython: None sphinx: None
","{""url"": ""https://api.github.com/repos/pydata/xarray/issues/8742/reactions"", ""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,completed,13221727,issue