use jismeshcode::prelude::*;
fn main() {
println!("=== メッシュの階層操作 ===\n");
let third_mesh = MeshCode::from_str("53394611").unwrap();
println!(
"開始メッシュ: {} (レベル: {})",
third_mesh,
third_mesh.level() as u8
);
println!("\n1. 階層を上る(子 → 親へ遡る):");
let mut current = third_mesh;
let mut level = 3;
while let Some(parent_mesh) = parent(current) {
level -= 1;
println!(
" {}次 → {}次: {} → {}",
level + 1,
level,
current,
parent_mesh
);
current = parent_mesh;
}
println!(" 1次メッシュには親がありません");
println!("\n2. 階層を下る(親 → 子へ展開):");
let first = MeshCode::from_str("5339").unwrap();
println!(" 1次メッシュ: {}", first);
let second_children = children(first);
println!(" → 2次メッシュの子供: {} 個", second_children.len());
println!(
" 最初の3個: {:?}",
&second_children[0..3.min(second_children.len())]
.iter()
.map(|m| m.to_string())
.collect::<Vec<_>>()
);
let second = MeshCode::from_str("533946").unwrap();
let third_children = children(second);
println!("\n 2次メッシュ {} の子供:", second);
println!(" → 3次メッシュの子供: {} 個", third_children.len());
println!(
" 最初の5個: {:?}",
&third_children[0..5.min(third_children.len())]
.iter()
.map(|m| m.to_string())
.collect::<Vec<_>>()
);
println!("\n3. レベル変換(一気に親レベルへ変換):");
let mesh = MeshCode::from_str("53394611").unwrap();
println!(" 元のメッシュ: {} (レベル {})", mesh, mesh.level() as u8);
if let Ok(second) = to_level(mesh, MeshLevel::Second) {
println!(" → 2次メッシュへ変換: {}", second);
}
if let Ok(first) = to_level(mesh, MeshLevel::First) {
println!(" → 1次メッシュへ変換: {}", first);
}
println!("\n 注意: 粗いメッシュから細かいメッシュへの変換はできません");
println!(" (どの子メッシュか特定できないため)");
println!("\n4. 各メッシュレベルのサイズ比較:");
for level in [
MeshLevel::First,
MeshLevel::Second,
MeshLevel::Third,
MeshLevel::FourthHalf,
MeshLevel::Fifth,
] {
println!(
" {:?}メッシュ: 緯度{:.6}度 × 経度{:.6}度 (約{}m四方)",
level,
level.lat_size_degrees(),
level.lon_size_degrees(),
level.approximate_size_meters() as i32
);
}
println!("\n5. 実用例: 各レベルの子メッシュ数");
let first_mesh = MeshCode::from_str("5339").unwrap();
let first_children = children(first_mesh);
println!(" 1次メッシュの子供: {} 個(8×8)", first_children.len());
let second_mesh = MeshCode::from_str("533946").unwrap();
let second_children = children(second_mesh);
println!(
" 2次メッシュの子供: {} 個(10×10)",
second_children.len()
);
let third_mesh = MeshCode::from_str("53394611").unwrap();
let third_children = children(third_mesh);
println!(" 3次メッシュの子供: {} 個(4分割)", third_children.len());
}