jismeshcode
日本標準地域メッシュコード(JIS X 0410)を扱う包括的なRustライブラリです。
概要
jismeshcodeは、地理座標と日本標準地域メッシュコード(JIS X 0410)を相互変換するライブラリです。1次メッシュ(約80km)から5次メッシュ(約100m)まで、すべてのメッシュレベルに対応しています。
ユースケース
このライブラリは以下のような用途で活用できます:
- 統計データの集計・分析: 政府統計データ(国勢調査、経済センサスなど)のメッシュ単位での集計
- 位置情報サービス: GPS座標をメッシュコードに変換して空間インデックスを構築
- GISアプリケーション: 地図上での地域分析やヒートマップ生成
- エリアマーケティング: 商圏分析、人口動態分析、店舗配置最適化
- 環境データ分析: 気象データや地質データのメッシュ単位での管理
- 都市計画: 土地利用計画や交通量分析
特徴
🚀 高性能
- ゼロコスト抽象化:
Copyトレイトによる効率的なメモリ管理 - 遅延評価: イテレータを活用した大規模データの効率的処理
- 最適化されたアルゴリズム: JIS X 0410に準拠した高速変換
📦 完全なJIS X 0410対応
- 全メッシュレベルサポート: 1次(80km)〜5次(100m)まで完全対応
- 仕様準拠: 総務省統計局の地域メッシュ仕様に完全準拠
- 実証済み: 実際の統計データでの検証済み
🛠️ 使いやすいAPI
- 型安全: Rustの型システムを活用した安全な設計
- 豊富なドキュメント: 日本語と英語の両方で完全なドキュメント
- 実用的なサンプル: 4つの詳細なサンプルコード付属
🌐 柔軟な環境対応
no_std対応: 組み込み環境でも使用可能- オプショナルな依存関係: 必要な機能だけを選択可能
- Serdeサポート: JSON/YAML等へのシリアライズに対応
📊 実用的な機能
- 座標とメッシュコードの相互変換
- 階層操作(親子メッシュの取得)
- 隣接メッシュの計算(8方向)
- 空間範囲検索(境界ボックス)
- メッシュの境界・中心座標計算
メッシュレベル
- 1次メッシュ: 約80km(4桁)
- 2次メッシュ: 約10km(6桁)
- 3次メッシュ: 約1km(8桁)
- 4次メッシュ(2分の1): 約500m(9桁)
- 4次メッシュ(4分の1): 約250m(10桁)
- 4次メッシュ(8分の1): 約125m(11桁)
- 5次メッシュ: 約100m(10桁)
主要な型
MeshCode
メッシュコードを表す型です。内部的にu64で表現され、Copyトレイトを実装しているため効率的に扱えます。
// 文字列からメッシュコードを作成
let mesh = from_str.unwrap;
// メッシュコードのレベルを取得
let level = mesh.level; // MeshLevel::Third
// 文字列表現を取得
let code_str = mesh.as_string; // "53394611"
Coordinate
緯度経度座標を表す型です。日本の範囲内(北緯20-46度、東経122-154度)の座標のみを受け付けます。
// 座標を作成(範囲チェックあり)
let coord = new.unwrap;
// 緯度・経度を取得
let lat = coord.lat; // 35.6812
let lon = coord.lon; // 139.7671
MeshLevel
メッシュのレベル(次数)を表す列挙型です。
// 各メッシュレベル
First // 1次メッシュ(約80km)
Second // 2次メッシュ(約10km)
Third // 3次メッシュ(約1km)
FourthHalf // 4次メッシュ(2分の1、約500m)
FourthQuarter // 4次メッシュ(4分の1、約250m)
FourthEighth // 4次メッシュ(8分の1、約125m)
Fifth // 5次メッシュ(約100m)
// サイズ情報を取得
let lat_size = Third.lat_size_degrees; // 緯度方向のサイズ(度)
let lon_size = Third.lon_size_degrees; // 経度方向のサイズ(度)
let approx_size = Third.approximate_size_meters; // おおよそのサイズ(m)
BoundingBox
矩形範囲(境界ボックス)を表す型です。空間範囲検索で使用します。
// 南西端と北東端の座標から境界ボックスを作成
let sw = new.unwrap;
let ne = new.unwrap;
let bbox = new;
// 境界を取得
let min_lat = bbox.min_lat;
let max_lat = bbox.max_lat;
let min_lon = bbox.min_lon;
let max_lon = bbox.max_lon;
// 座標が範囲内にあるかチェック
let is_inside = bbox.contains;
// 中心座標を取得
let center = bbox.center;
Direction
隣接メッシュの方向を表す列挙型です。8方向に対応しています。
North // 北
NorthEast // 北東
East // 東
SouthEast // 南東
South // 南
SouthWest // 南西
West // 西
NorthWest // 北西
// すべての方向を取得
for dir in ALL
主要な関数
変換関数
// 座標からメッシュコードへ変換
let mesh = coord_to_mesh.unwrap;
// メッシュコードから境界ボックスへ変換
let bounds = mesh_to_bounds;
// メッシュコードから中心座標へ変換
let center = mesh_to_center;
階層操作
// 親メッシュを取得(3次 → 2次 → 1次)
let parent_mesh = parent.unwrap;
// 子メッシュをすべて取得(1次 → 64個の2次、2次 → 100個の3次)
let children_list = children;
// 指定レベルへ変換(細かいメッシュから粗いメッシュへのみ可能)
let first_mesh = to_level.unwrap;
隣接メッシュ
// 指定方向の隣接メッシュを取得
let north_mesh = neighbor;
// すべての方向の隣接メッシュを取得(最大8個)
let all_neighbors = neighbors;
空間検索
// 境界ボックス内のメッシュコードをイテレータで取得
let bbox = new;
for mesh in mesh_codes_in_bbox
境界・包含判定
// メッシュの境界を取得
let bounds = bounds;
// メッシュの中心座標を取得
let center = center;
// 座標がメッシュ内に含まれるか判定
let is_contained = contains;
使用例
use *;
// 座標からメッシュコードへ変換
let coord = new.unwrap;
let mesh = coord_to_mesh.unwrap;
println!;
// メッシュの境界を取得
let bounds = mesh_to_bounds;
println!;
// メッシュの中心座標を取得
let center = mesh_to_center;
println!;
// 隣接メッシュを取得
let all_neighbors = neighbors;
for neighbor in all_neighbors
// 親メッシュと子メッシュ
let parent_mesh = parent.unwrap;
let children_list = children;
インストール
Cargo.tomlに以下を追加してください:
[]
= "0.1"
no_std環境の場合:
[]
= { = "0.1", = false }
serde対応が必要な場合:
[]
= { = "0.1", = ["serde"] }
サンプルコード
より詳細な使用例はexamples/ディレクトリを参照してください。
ライセンス
以下のいずれかのライセンスを選択できます:
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT license (LICENSE-MIT)