@@ -74,7 +74,10 @@ def test_rgb_lowzoom(use_testdb, raster_file, raster_file_xyz_lowzoom):
74
74
75
75
76
76
@pytest .mark .parametrize (
77
- "stretch_range" , [[0 , 20000 ], [10000 , 20000 ], [- 50000 , 50000 ], [100 , 100 ]]
77
+ "stretch_range" , [
78
+ [0 , 20000 ], [10000 , 20000 ], [- 50000 , 50000 ], [100 , 100 ],
79
+ ["0" , "20000" ], ["10000" , "20000" ], ["-50000" , "50000" ], ["100" , "100" ],
80
+ ]
78
81
)
79
82
def test_rgb_stretch (stretch_range , use_testdb , testdb , raster_file_xyz ):
80
83
import terracotta
@@ -106,6 +109,7 @@ def test_rgb_stretch(stretch_range, use_testdb, testdb, raster_file_xyz):
106
109
valid_img = img_data [valid_mask ]
107
110
valid_data = tile_data .compressed ()
108
111
112
+ stretch_range = [float (stretch_range [0 ]), float (stretch_range [1 ])]
109
113
assert np .all (valid_img [valid_data < stretch_range [0 ]] == 1 )
110
114
stretch_range_mask = (valid_data > stretch_range [0 ]) & (
111
115
valid_data < stretch_range [1 ]
@@ -131,6 +135,50 @@ def test_rgb_invalid_stretch(use_testdb, raster_file_xyz):
131
135
)
132
136
133
137
138
+ def test_rgb_percentile_stretch (use_testdb , testdb , raster_file_xyz ):
139
+ import terracotta
140
+ from terracotta .xyz import get_tile_data
141
+ from terracotta .handlers import rgb
142
+
143
+ ds_keys = ["val21" , "x" , "val22" ]
144
+ bands = ["val22" , "val23" , "val24" ]
145
+ pct_stretch_range = ["p2" , "p98" ]
146
+
147
+ raw_img = rgb .rgb (
148
+ ds_keys [:2 ],
149
+ bands ,
150
+ raster_file_xyz ,
151
+ stretch_ranges = [pct_stretch_range ] * 3 ,
152
+ )
153
+ img_data = np .asarray (Image .open (raw_img ))[..., 0 ]
154
+
155
+ # get unstretched data to compare to
156
+ driver = terracotta .get_driver (testdb )
157
+
158
+ with driver .connect ():
159
+ tile_data = get_tile_data (
160
+ driver , ds_keys , tile_xyz = raster_file_xyz , tile_size = img_data .shape
161
+ )
162
+ band_metadata = driver .get_metadata (ds_keys )
163
+
164
+ stretch_range = [band_metadata ["percentiles" ][1 ], band_metadata ["percentiles" ][97 ]]
165
+
166
+ # filter transparent values
167
+ valid_mask = ~ tile_data .mask
168
+ assert np .all (img_data [~ valid_mask ] == 0 )
169
+
170
+ valid_img = img_data [valid_mask ]
171
+ valid_data = tile_data .compressed ()
172
+
173
+ assert np .all (valid_img [valid_data < stretch_range [0 ]] == 1 )
174
+ stretch_range_mask = (valid_data > stretch_range [0 ]) & (
175
+ valid_data < stretch_range [1 ]
176
+ )
177
+ assert np .all (valid_img [stretch_range_mask ] >= 1 )
178
+ assert np .all (valid_img [stretch_range_mask ] <= 255 )
179
+ assert np .all (valid_img [valid_data > stretch_range [1 ]] == 255 )
180
+
181
+
134
182
def test_rgb_preview (use_testdb ):
135
183
import terracotta
136
184
from terracotta .handlers import rgb
0 commit comments