Skip to content

Commit 1cb0b92

Browse files
committed
Avoid loading the dataMin/Max from symbology min/max
These are different things! The data minimum and maximum are attributes of the data, and symbology min/max are user preference.
1 parent 5370f3e commit 1cb0b92

File tree

1 file changed

+33
-41
lines changed

1 file changed

+33
-41
lines changed

packages/base/src/dialogs/symbology/hooks/useGetSingleBandInfo.ts

Lines changed: 33 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -65,68 +65,60 @@ const useGetSingleBandInfo = (
6565
const image = await tiff.getImage();
6666
const numberOfBands = image.getSamplesPerPixel();
6767

68-
let min = layer.parameters?.symbologyState?.min;
69-
let max = layer.parameters?.symbologyState?.max;
70-
71-
if (min === undefined || max === undefined) {
72-
// 1. Try metadata first
73-
let dataMin = image.fileDirectory.STATISTICS_MINIMUM;
74-
let dataMax = image.fileDirectory.STATISTICS_MAXIMUM;
75-
76-
if (dataMin === undefined || dataMax === undefined) {
77-
// 2. Try smallest overview if available
78-
const overviewCount = await tiff.getImageCount();
79-
const targetImage =
80-
overviewCount > 1 ? await tiff.getImage(overviewCount - 1) : image;
81-
82-
// 3. Read downsampled raster (fast)
83-
const rasters = await targetImage.readRasters();
84-
dataMin = Infinity;
85-
dataMax = -Infinity;
86-
87-
const bandIndex = selectedBand - 1;
88-
const bandData = rasters[bandIndex] as
89-
| Float32Array
90-
| Uint16Array
91-
| Int16Array;
92-
if (bandData) {
93-
for (let j = 0; j < bandData.length; j++) {
94-
const val = bandData[j];
95-
if (val < dataMin) {
96-
dataMin = val;
97-
}
98-
if (val > dataMax) {
99-
dataMax = val;
100-
}
68+
// 1. Try metadata first
69+
let dataMin = image.fileDirectory.STATISTICS_MINIMUM;
70+
let dataMax = image.fileDirectory.STATISTICS_MAXIMUM;
71+
72+
if (dataMin === undefined || dataMax === undefined) {
73+
// 2. Try smallest overview if available
74+
const overviewCount = await tiff.getImageCount();
75+
const targetImage =
76+
overviewCount > 1 ? await tiff.getImage(overviewCount - 1) : image;
77+
78+
// 3. Read downsampled raster (fast)
79+
const rasters = await targetImage.readRasters();
80+
dataMin = Infinity;
81+
dataMax = -Infinity;
82+
83+
const bandIndex = selectedBand - 1;
84+
const bandData = rasters[bandIndex] as
85+
| Float32Array
86+
| Uint16Array
87+
| Int16Array;
88+
if (bandData) {
89+
for (let j = 0; j < bandData.length; j++) {
90+
const val = bandData[j];
91+
if (val < dataMin) {
92+
dataMin = val;
93+
}
94+
if (val > dataMax) {
95+
dataMax = val;
10196
}
10297
}
10398
}
10499

105-
min = dataMin;
106-
max = dataMax;
107-
108100
model.sharedModel.updateLayer(layerId, {
109101
...layer,
110102
parameters: {
111103
...layer.parameters,
112104
symbologyState: {
113105
...(layer.parameters?.symbologyState ?? {}),
114-
min,
115-
max,
106+
dataMin,
107+
dataMax,
116108
band: selectedBand,
117109
},
118110
},
119111
});
120112

121-
console.log(`[Symbology Init] Final Min=${min}, Max=${max}`);
113+
console.debug(`[Symbology Init] Final Min=${dataMin}, Max=${dataMax}`);
122114
}
123115

124116
for (let i = 0; i < numberOfBands; i++) {
125117
bandsArr.push({
126118
band: i,
127119
stats: {
128-
minimum: min ?? 0,
129-
maximum: max ?? 100,
120+
minimum: dataMin ?? 0,
121+
maximum: dataMax ?? 100,
130122
},
131123
});
132124
}

0 commit comments

Comments
 (0)