#ascii #esri #grid #raster #file-reader #cache #asc

esri_ascii_grid

用于读取ESRI Ascii Grid .asc文件的库

12个不稳定版本 (3个破坏性更新)

0.4.5 2024年8月23日
0.4.4 2024年8月10日
0.4.3 2024年5月6日
0.3.1 2024年5月1日
0.1.2 2023年1月8日

#62缓存

Download history 467/week @ 2024-04-29 258/week @ 2024-05-06 10/week @ 2024-05-20 97/week @ 2024-08-05 23/week @ 2024-08-12

每月120次下载

MIT/Apache

1.5MB
1K SLoC

esri-ascii-grid-rs

用于读取ESRI Ascii grid .asc文件的Rust库

示例ASCII网格

ncols         4
nrows         6
xllcorner     0.0
yllcorner     0.0
cellsize      50.0
NODATA_value  -9999
-9999 -9999 5 2
-9999 20 100 36
3 8 35 10
32 42 50 6
88 75 27 9
13 5 1 -9999

此库使用缓冲区以减少一次性将整个ASCII网格加载到内存中的需要。将加载标题,并允许您检查标题属性。然后您可以按索引、坐标获取特定值,或者遍历所有点。

此库将在使用任何'get'方法时构建每行的起始位置的缓存,而无需读取数据到内存。因此,对于大文件,前几次'get'调用可能较慢,但随着文件结构的映射和缓存,速度将提高。

用法

use std::fs::File;
use esri_ascii_grid::ascii_file::EsriASCIIReader;
let file = File::open("test_data/test.asc").unwrap();
let mut grid: EsriASCIIReader<File, f64, f64> = EsriASCIIReader::from_file(file).unwrap();
// Spot check a few values
assert_eq!(
    grid.get_index(5, 7).unwrap(),
    grid.header.no_data_value().unwrap()
);
assert_eq!(grid.get(390_000.0, 344_000.0).unwrap(), 141.270_004_272_460_937_5);
assert_eq!(grid.get(390_003.0, 344_003.0).unwrap(), 135.440_002_441_406_25);
assert_eq!(grid.get_index(996, 3).unwrap(), 135.440_002_441_406_25);
assert_eq!(grid.get_index(999, 0).unwrap(), 141.270_004_272_460_937_5);
//!
// Interpolate between cells
let val = grid.get_interpolate(grid.header.min_x() + grid.header.cell_size()/4., grid.header.min_y() + grid.header.cell_size()/4.).unwrap();
//!
// Iterate over every cell
let header = grid.header;
let grid_size = grid.header.num_rows() * grid.header.num_cols();
let iter = grid.into_iter();
let mut num_elements = 0;
for cell in iter {
    let Ok((row, col, value)) = cell else {
        panic!("your error handler")
    };
    num_elements += 1;
    if row == 996 && col == 3 {
        let (x, y) = header.index_pos(row, col).unwrap();
        assert_eq!(x, 390003.0);
        assert_eq!(y, 344003.0);
        assert_eq!(value, 135.44000244140625);
    }
    if row == header.nrows-1 && col == 0 {
        let (x, y) = header.index_pos(row, col).unwrap();
        assert_eq!(x, 390000.0);
        assert_eq!(y, 344000.0);
        assert_eq!(value, 141.2700042724609375);
    }
}
assert_eq!(grid_size, num_elements);

依赖项