2
2
3
3
import numpy as np
4
4
import xarray as xr
5
+ import pytest
5
6
6
7
import xarray_subset_grid .accessor # noqa: F401
7
8
from tests .test_utils import get_test_file_dir
8
9
from xarray_subset_grid .grids .sgrid import _get_location_info_from_topology
9
10
10
11
# open dataset as zarr object using fsspec reference file system and xarray
12
+ try :
13
+ import fsspec
14
+ except ImportError :
15
+ fsspec = None
11
16
12
17
13
18
test_dir = get_test_file_dir ()
@@ -33,56 +38,58 @@ def test_grid_topology_location_parse():
33
38
'coords' : ['lon_rho' , 'lat_rho' ],
34
39
'padding' : {'xi_rho' : 'both' , 'eta_rho' : 'both' }}
35
40
41
+ @pytest .mark .online
42
+ def test_polygon_subset ():
43
+ '''
44
+ This is a basic integration test for the subsetting of a ROMS sgrid dataset using a polygon.
45
+ '''
46
+ if fsspec is None :
47
+ raise ImportError ("Must have fsspec installed to run --online tests" )
48
+ fs = fsspec .filesystem (
49
+ "reference" ,
50
+ fo = "s3://nextgen-dmac-cloud-ingest/nos/wcofs/nos.wcofs.2ds.best.nc.zarr" ,
51
+ remote_protocol = "s3" ,
52
+ remote_options = {"anon" : True },
53
+ target_protocol = "s3" ,
54
+ target_options = {"anon" : True },
55
+ )
56
+ m = fs .get_mapper ("" )
57
+
58
+ ds = xr .open_dataset (
59
+ m , engine = "zarr" , backend_kwargs = dict (consolidated = False ), chunks = {}
60
+ )
61
+
62
+ polygon = np .array (
63
+ [
64
+ [- 122.38488806417945 , 34.98888604471138 ],
65
+ [- 122.02425311530737 , 33.300351211467074 ],
66
+ [- 120.60402628930146 , 32.723214427630836 ],
67
+ [- 116.63789131284673 , 32.54346959375448 ],
68
+ [- 116.39346090873218 , 33.8541384965596 ],
69
+ [- 118.83845767505964 , 35.257586401855164 ],
70
+ [- 121.34541503969862 , 35.50073821008141 ],
71
+ [- 122.38488806417945 , 34.98888604471138 ],
72
+ ]
73
+ )
74
+ ds_temp = ds .xsg .subset_vars (['temp_sur' ])
75
+ ds_subset = ds_temp .xsg .subset_polygon (polygon )
36
76
37
- # def test_polygon_subset():
38
- # '''
39
- # This is a basic integration test for the subsetting of a ROMS sgrid dataset using a polygon.
40
- # '''
41
- # fs = fsspec.filesystem(
42
- # "reference",
43
- # fo="s3://nextgen-dmac-cloud-ingest/nos/wcofs/nos.wcofs.2ds.best.nc.zarr",
44
- # remote_protocol="s3",
45
- # remote_options={"anon": True},
46
- # target_protocol="s3",
47
- # target_options={"anon": True},
48
- # )
49
- # m = fs.get_mapper("")
50
-
51
- # ds = xr.open_dataset(
52
- # m, engine="zarr", backend_kwargs=dict(consolidated=False), chunks={}
53
- # )
54
-
55
- # polygon = np.array(
56
- # [
57
- # [-122.38488806417945, 34.98888604471138],
58
- # [-122.02425311530737, 33.300351211467074],
59
- # [-120.60402628930146, 32.723214427630836],
60
- # [-116.63789131284673, 32.54346959375448],
61
- # [-116.39346090873218, 33.8541384965596],
62
- # [-118.83845767505964, 35.257586401855164],
63
- # [-121.34541503969862, 35.50073821008141],
64
- # [-122.38488806417945, 34.98888604471138],
65
- # ]
66
- # )
67
- # ds_temp = ds.xsg.subset_vars(['temp_sur'])
68
- # ds_subset = ds_temp.xsg.subset_polygon(polygon)
69
-
70
- # #Check that the subset dataset has the correct dimensions given the original padding
71
- # assert ds_subset.sizes['eta_rho'] == ds_subset.sizes['eta_psi'] + 1
72
- # assert ds_subset.sizes['eta_u'] == ds_subset.sizes['eta_psi'] + 1
73
- # assert ds_subset.sizes['eta_v'] == ds_subset.sizes['eta_psi']
74
- # assert ds_subset.sizes['xi_rho'] == ds_subset.sizes['xi_psi'] + 1
75
- # assert ds_subset.sizes['xi_u'] == ds_subset.sizes['xi_psi']
76
- # assert ds_subset.sizes['xi_v'] == ds_subset.sizes['xi_psi'] + 1
77
-
78
- # #Check that the subset rho/psi/u/v positional relationsip makes sense aka psi point is
79
- # #'between' it's neighbor rho points
80
- # #Note that this needs to be better generalized; it's not trivial to write a test that
81
- # #works in all potential cases.
82
- # assert (ds_subset['lon_rho'][0,0] < ds_subset['lon_psi'][0,0]
83
- # and ds_subset['lon_rho'][0,1] > ds_subset['lon_psi'][0,0])
84
-
85
- # #ds_subset.temp_sur.isel(ocean_time=0).plot(x="lon_rho", y="lat_rho")
77
+ #Check that the subset dataset has the correct dimensions given the original padding
78
+ assert ds_subset .sizes ['eta_rho' ] == ds_subset .sizes ['eta_psi' ] + 1
79
+ assert ds_subset .sizes ['eta_u' ] == ds_subset .sizes ['eta_psi' ] + 1
80
+ assert ds_subset .sizes ['eta_v' ] == ds_subset .sizes ['eta_psi' ]
81
+ assert ds_subset .sizes ['xi_rho' ] == ds_subset .sizes ['xi_psi' ] + 1
82
+ assert ds_subset .sizes ['xi_u' ] == ds_subset .sizes ['xi_psi' ]
83
+ assert ds_subset .sizes ['xi_v' ] == ds_subset .sizes ['xi_psi' ] + 1
84
+
85
+ #Check that the subset rho/psi/u/v positional relationsip makes sense aka psi point is
86
+ #'between' it's neighbor rho points
87
+ #Note that this needs to be better generalized; it's not trivial to write a test that
88
+ #works in all potential cases.
89
+ assert (ds_subset ['lon_rho' ][0 ,0 ] < ds_subset ['lon_psi' ][0 ,0 ]
90
+ and ds_subset ['lon_rho' ][0 ,1 ] > ds_subset ['lon_psi' ][0 ,0 ])
91
+
92
+ #ds_subset.temp_sur.isel(ocean_time=0).plot(x="lon_rho", y="lat_rho")
86
93
87
94
def test_polygon_subset_2 ():
88
95
ds = xr .open_dataset (sample_sgrid_file , decode_times = False )
0 commit comments