diff --git a/README.md b/README.md index e7ec72e..b124c1e 100644 --- a/README.md +++ b/README.md @@ -24,4 +24,5 @@ Download the following file for use in the tests. ```shell aws s3 cp s3://naip-visualization/ny/2022/60cm/rgb/40073/m_4007307_sw_18_060_20220803.tif ./ --request-payer +aws s3 cp s3://prd-tnm/StagedProducts/Elevation/13/TIFF/current/s14w171/USGS_13_s14w171.tif ./ --no-sign-request --region us-west-2 ``` diff --git a/python/DEVELOP.md b/python/DEVELOP.md index 3b97be2..30d0ddc 100644 --- a/python/DEVELOP.md +++ b/python/DEVELOP.md @@ -2,4 +2,5 @@ uv sync --no-install-package async-tiff uv run --no-project maturin develop uv run --no-project mkdocs serve +uv run --no-project pytest --verbose ``` diff --git a/src/ifd.rs b/src/ifd.rs index f0da9c1..265a2ae 100644 --- a/src/ifd.rs +++ b/src/ifd.rs @@ -295,8 +295,15 @@ impl ImageFileDirectory { .expect("There should be a chunk for each key."); let key_id = chunk[0]; - let tag_name = - GeoKeyTag::try_from_primitive(key_id).expect("Unknown GeoKeyTag id: {key_id}"); + let tag_name = if let Ok(tag_name) = GeoKeyTag::try_from_primitive(key_id) { + tag_name + } else { + // Skip unknown GeoKeyTag ids. Some GeoTIFFs include keys that were proposed + // but not included in the GeoTIFF spec. See + // https://github.com/developmentseed/async-tiff/pull/131 and + // https://github.com/virtual-zarr/virtual-tiff/issues/52 + continue; + }; let tag_location = chunk[1]; let count = chunk[2]; diff --git a/tests/geo.rs b/tests/geo.rs new file mode 100644 index 0000000..9647af4 --- /dev/null +++ b/tests/geo.rs @@ -0,0 +1,25 @@ +use std::env; +use std::sync::Arc; + +use async_tiff::metadata::{PrefetchBuffer, TiffMetadataReader}; +use async_tiff::reader::{AsyncFileReader, ObjectReader}; +use object_store::local::LocalFileSystem; + +#[tokio::test] +async fn test_parse_file_with_unknown_geokey() { + let folder = env::current_dir().unwrap(); + let path = object_store::path::Path::parse("tests/images/geogtowgs_subset_USGS_13_s14w171.tif") + .unwrap(); + let store = Arc::new(LocalFileSystem::new_with_prefix(folder).unwrap()); + let reader = Arc::new(ObjectReader::new(store, path)) as Arc; + let prefetch_reader = PrefetchBuffer::new(reader.clone(), 32 * 1024) + .await + .unwrap(); + let mut metadata_reader = TiffMetadataReader::try_open(&prefetch_reader) + .await + .unwrap(); + let _ = metadata_reader + .read_all_ifds(&prefetch_reader) + .await + .unwrap(); +} diff --git a/tests/images/geogtowgs_subset_USGS_13_s14w171.tif b/tests/images/geogtowgs_subset_USGS_13_s14w171.tif new file mode 100644 index 0000000..1f21e29 Binary files /dev/null and b/tests/images/geogtowgs_subset_USGS_13_s14w171.tif differ diff --git a/tests/images/readme.md b/tests/images/readme.md new file mode 100644 index 0000000..94efdd0 --- /dev/null +++ b/tests/images/readme.md @@ -0,0 +1,35 @@ +`geogtowgs_subset_USGS_13_s14w171.tif` was created from "s3://prd-tnm/StagedProducts/Elevation/13/TIFF/current/s14w171/USGS_13_s14w171.tif" using these commands: + +```bash +gdal_translate USGS_13_s14w171.tif tiny.tif -srcwin 0 0 1 1 -co COMPRESS=DEFLATE +listgeo USGS_13_s14w171.tif > metadata.txt # Then modify to remove information related to spatial extent +cp tiny.tif geogtowgs_subset_USGS_13_s14w171.tif +geotifcp -g metadata.txt tiny.tif geogtowgs_subset_USGS_13_s14w171.tif +listgeo geogtowgs_subset_USGS_13_s14w171.tif +``` + +and this workspace definition: + +```toml +[project] +name = "gdal-workspace" +version = "0.1.0" +description = "workspace for using gdal via pixi" +readme = "README.md" +requires-python = ">=3.12" +dependencies = [] + +[tool.pixi.workspace] +channels = ["conda-forge"] +platforms = ["osx-arm64"] + +[tool.pixi.pypi-dependencies] +gdal-workspace = { path = ".", editable = true } + +[tool.pixi.tasks] + +[tool.pixi.dependencies] +gdal = ">=3.11.5,<4" +libgdal = ">=3.11.5,<4" +geotiff = ">=1.7.4,<2" +``` \ No newline at end of file diff --git a/tests/mod.rs b/tests/mod.rs index 948c439..320e379 100644 --- a/tests/mod.rs +++ b/tests/mod.rs @@ -1 +1,3 @@ +mod geo; mod image_tiff; +mod ome_tiff; diff --git a/tests/ome_tiff.rs b/tests/ome_tiff.rs index 4e332ab..5e5920c 100644 --- a/tests/ome_tiff.rs +++ b/tests/ome_tiff.rs @@ -1,12 +1,35 @@ -/// Integration tests on OME-TIFF files. +//! Integration tests on OME-TIFF files. + +use std::sync::Arc; + +use async_tiff::metadata::{PrefetchBuffer, TiffMetadataReader}; +use async_tiff::reader::{AsyncFileReader, ObjectReader}; use async_tiff::tiff::tags::PhotometricInterpretation; +use async_tiff::TIFF; +use reqwest::Url; -mod util; +async fn open_remote_tiff(url: &str) -> TIFF { + let parsed_url = Url::parse(url).expect("failed parsing url"); + let (store, path) = object_store::parse_url(&parsed_url).unwrap(); + + let reader = Arc::new(ObjectReader::new(Arc::new(store), path)) as Arc; + let prefetch_reader = PrefetchBuffer::new(reader.clone(), 32 * 1024) + .await + .unwrap(); + let mut metadata_reader = TiffMetadataReader::try_open(&prefetch_reader) + .await + .unwrap(); + let ifds = metadata_reader + .read_all_ifds(&prefetch_reader) + .await + .unwrap(); + TIFF::new(ifds) +} #[tokio::test] async fn test_ome_tiff_single_channel() { let tiff = - util::open_remote_tiff("https://downloads.openmicroscopy.org/images/OME-TIFF/2016-06/bioformats-artificial/single-channel.ome.tif").await; + open_remote_tiff("https://downloads.openmicroscopy.org/images/OME-TIFF/2016-06/bioformats-artificial/single-channel.ome.tif").await; assert_eq!(tiff.ifds().len(), 1); let ifd = &tiff.ifds()[0]; diff --git a/tests/util/mod.rs b/tests/util/mod.rs deleted file mode 100644 index 8b3fa07..0000000 --- a/tests/util/mod.rs +++ /dev/null @@ -1,24 +0,0 @@ -use std::sync::Arc; - -use async_tiff::metadata::{PrefetchBuffer, TiffMetadataReader}; -use async_tiff::reader::{AsyncFileReader, ObjectReader}; -use async_tiff::TIFF; -use reqwest::Url; - -pub(crate) async fn open_remote_tiff(url: &str) -> TIFF { - let parsed_url = Url::parse(url).expect("failed parsing url"); - let (store, path) = object_store::parse_url(&parsed_url).unwrap(); - - let reader = Arc::new(ObjectReader::new(Arc::new(store), path)) as Arc; - let prefetch_reader = PrefetchBuffer::new(reader.clone(), 32 * 1024) - .await - .unwrap(); - let mut metadata_reader = TiffMetadataReader::try_open(&prefetch_reader) - .await - .unwrap(); - let ifds = metadata_reader - .read_all_ifds(&prefetch_reader) - .await - .unwrap(); - TIFF::new(ifds) -}