use geopackage::{GeoPackage, SpatialIndexStatus};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let Some(path) = std::env::args().nth(1) else {
eprintln!("usage: inspect <file.gpkg>");
std::process::exit(2);
};
let gpkg = GeoPackage::open_lenient(&path)?;
println!("{path}");
println!(" version: {:?}", gpkg.version());
for warning in gpkg.open_warnings() {
println!(" warning: {warning:?}");
}
let layers = gpkg.layers()?;
if layers.is_empty() {
println!(" no feature layers");
}
for layer in &layers {
let count = layer.features()?.len();
println!("\nlayer {:?} ({:?})", layer.table_name(), layer.kind());
println!(" features: {count}");
if let Some(geom) = layer.geometry_column() {
println!(
" geometry: {} ({:?}, srs_id {})",
geom.column_name, geom.geometry_type, geom.srs_id
);
if let Some(srs) = gpkg.srs(geom.srs_id)? {
println!(
" srs: {} ({}:{})",
srs.name, srs.organization, srs.organization_coordsys_id
);
}
let status = layer.spatial_index_status()?;
print!(" index: {status:?}");
match status {
SpatialIndexStatus::Legacy | SpatialIndexStatus::Stale => {
println!(" (run repair_spatial_index)");
}
_ => println!(),
}
}
println!(" columns:");
for column in &layer.schema().columns {
let pk = if column.is_primary_key() {
" PRIMARY KEY"
} else {
""
};
let not_null = if column.not_null { " NOT NULL" } else { "" };
let declared = if column.declared_type.is_empty() {
"(untyped)"
} else {
&column.declared_type
};
println!(" {:<20} {declared}{pk}{not_null}", column.name);
}
}
Ok(())
}