cogrs
Pure Rust COG (Cloud Optimized GeoTIFF) reader library.
Features
Quick Start
use cogrs::{CogReader, PointQuery, TileExtractor};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let reader = CogReader::open("path/to/file.tif")?;
let result = reader.sample_lonlat(-122.4, 37.8)?;
let tile = TileExtractor::new(&reader)
.xyz(10, 163, 395)
.extract()
.await?;
Ok(())
}
Sources
use cogrs::CogReader;
# fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let reader = CogReader::open("path/to/file.tif")?;
let reader = CogReader::open("https://example.com/file.tif")?;
let reader = CogReader::open("s3://bucket/path/to/file.tif")?;
# Ok(())
# }
Point Queries
use cogrs::{CogReader, PointQuery};
# fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let reader = CogReader::open("elevation.tif")?;
let result = reader.sample_lonlat(-122.4, 37.8)?;
for (band, value) in &result.values {
println!("Band {band}: {value}");
}
let result = reader.sample_crs(32610, 551000.0, 4185000.0)?;
# Ok(())
# }
Tile Extraction
use cogrs::{CogReader, TileExtractor, ResamplingMethod};
# #[tokio::main]
# async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let reader = CogReader::open("imagery.tif")?;
let tile = TileExtractor::new(&reader)
.xyz(10, 163, 395)
.extract()
.await?;
let tile = TileExtractor::new(&reader)
.xyz(10, 163, 395)
.output_size(512, 512)
.resampling(ResamplingMethod::Bilinear)
.bands(&[0, 1, 2])
.extract()
.await?;
# Ok(())
# }
Coordinate Transforms
use cogrs::{CoordTransformer, project_point};
let (x, y) = project_point(4326, 3857, -122.4, 37.8)?;
let transformer = CoordTransformer::new(4326, 32610)?;
let (utm_x, utm_y) = transformer.transform(-122.4, 37.8)?;
# Ok::<(), Box<dyn std::error::Error + Send + Sync>>(())
Compression
Supported formats are detected automatically:
- DEFLATE
- LZW (8/16-bit, predictors 1-3)
- ZSTD
- JPEG
- WebP
License
MIT