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 在 缓存
每月120次下载
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);