#raster #postgis #binary-format #postgresql #wkb #sql #binary-encoding

wkb-raster

将栅格数据序列化为PostGIS RASTER Well Known Binary格式的库

4个版本

0.2.1 2021年11月28日
0.2.0 2020年4月9日
0.1.1 2020年4月8日
0.1.0 2020年2月2日

#609数据库接口

MIT 许可证

86KB
1.5K SLoC

wkb-raster

PostGIS RASTER类型的WKB格式

RASTER的WKB格式旨在传输,考虑了字节序并避免了任何填充。然而,除了填充和字节序之外,它还与内部序列化格式(参见RFC1)匹配,以便快速输入/输出。

示例

将栅格转换为WKB字符串

use wkb_raster::{Raster, RasterBand, RasterDataSource, InMemoryRasterData, Endian};

// 2x2 image bytes, u8 format
let bytes = vec![
    vec![0, 1],
    vec![1, 0],
];

let raster = Raster {
    endian: Endian::Big,    // note: currently Endian::Little is not supported in PostGIS
    version: 0,             // always set to 0
    scale_x: 1.0,           // pixel width in degrees
    scale_y: 1.0,           // pixel height in degrees
    ip_x: 0.0,              // upper left corner longitude in degrees
    ip_y: 0.0,              // upper left corner latitude in degrees
    skew_x: 0.0,            // rotation in degrees (0 to 360)
    skew_y: 0.0,            // rotation in degrees (0 to 360)
    srid: 4326,             // SRID EPSG identifier
    width: 2,               // pixel columns
    height: 2,              // rows
    bands: vec![RasterBand {
        is_nodata_value: false           // true only if entire band is NODATA
        data: RasterDataSource::InMemory(
            InMemoryRasterData::UInt8 {
                data: bytes,
                nodata
            }
        ),
    }],
};

assert_eq!(
    raster.to_wkb_string(),
    String::from("00000000013FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000010E600020002040000010100")
);

将WKB字符串转换为栅格

use wkb_raster::{Raster, RasterBand, RasterDataSource, InMemoryRasterData, Endian};

let parsed_raster = Raster::from_wkb_string(b"00000000013FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000010E600020002040000010100").unwrap();

// 2x2 image bytes, u8 format
let bytes = vec![
    vec![0, 1],
    vec![1, 0],
];

assert_eq!(parsed_raster, Raster {
    endian: Endian::Big,
    version: 0,
    scale_x: 1.0,
    scale_y: 1.0,
    ip_x: 0.0,
    ip_y: 0.0,
    skew_x: 0.0,
    skew_y: 0.0,
    srid: 4326,
    width: 2,
    height: 2,
    bands: vec![RasterBand {
        is_nodata_value: false,
        data: RasterDataSource::InMemory(
            InMemoryRasterData::UInt8 {
                data: bytes,
                nodata
            }
        ),
    }],
});

许可证:MIT

无运行时依赖