LaurenΘiu Nicola
S2B_MSIL2A_20241024T091939_N0511_R093_T35TMK_20241024T105557.SAFE
βββ GRANULE
βΒ Β βββ L2A_T35TMK_A039873_20241024T091939
βΒ Β βββ IMG_DATA
βΒ Β βββ R10m
βΒ Β βΒ Β βββ T35TMK_20241024T091939_B02_10m.jp2
βΒ Β βΒ Β βββ T35TMK_20241024T091939_B03_10m.jp2
βΒ Β βΒ Β βββ T35TMK_20241024T091939_B04_10m.jp2
βΒ Β βΒ Β βββ T35TMK_20241024T091939_B08_10m.jp2
βΒ Β βββ R20m
βΒ Β βββ T35TMK_20241024T091939_B05_20m.jp2
βΒ Β βββ T35TMK_20241024T091939_B06_20m.jp2
βΒ Β βββ T35TMK_20241024T091939_B07_20m.jp2
βΒ Β βββ T35TMK_20241024T091939_B11_20m.jp2
βΒ Β βββ T35TMK_20241024T091939_B12_20m.jp2
βΒ Β βββ T35TMK_20241024T091939_B8A_20m.jp2
βΒ Β βββ T35TMK_20241024T091939_SCL_20m.jp2
βββ MTD_MSIL2A.xml
R10m and R20m
MTD_MSIL2A.xml file to get
the -1000 offsets
SCL is a mask (clouds, cloud shadows,
snow, water &c.)
NameError after
running for half a day
SIGSEGVs, no data races
use gdal::{Dataset, GdalOpenFlags::*};
let open_flags = GDAL_OF_RASTER | GDAL_OF_THREAD_SAFE;
let ds = Dataset::open_ex(
path,
DatasetOptions {
open_flags,
..Default::default()
},
)?;
let mut data = ds
.rasterband(1)?
.read_as(window, window_size, window_size, None)?
.to_array()?;
data.mapv_inplace(|x| x + offset);
fn ndvi(b4: i16, b8: i16, scl: u8) -> f32 {
if matches!(scl, 0 | 1 | 6 | 8 | 9 | 10 | 11) {
return f32::NAN;
}
let (b4, b8) = (b4 as f32, b8 as f32);
if b8 + b4 == 0.0 {
f32::NAN
} else {
(b8 - b4) / (b8 + b4).clamp(-1.0, 1.0)
}
}
geo, geos*, robust
rstar
proj*, geodesyβ
gdal*,
netcdf*, gpx,
geojson, wkt,
wkb, kml,
osm, transit,
shapefile, STACβ‘,
PgSTACβ‘, GeoTIFFβ‘
geozero,
geocoding, geohash,
polyline
rinexChoose your own adventure: