tile_manager.cpp / .h
C++ file system manager for tile-based storage.
Location: sonar_3d_reconstruction/cpp/tile_manager.cpp
Overview
TileManager handles all file system operations for tile-based mapping. It manages tile paths, coordinate conversion, and global metadata.
Key Features:
World coordinate to tile index conversion
Tile directory path management
Metadata persistence (JSON format)
Tile enumeration and region queries
Design Principle: Single Responsibility - only file system operations, no IWLO logic.
Data Structures
MapMetadata
Global map metadata stored in metadata.json.
struct MapMetadata {
double resolution; // Voxel resolution in meters
double tile_size; // Tile size in meters
std::string version; // Format version ("1.0")
TileIndex min_tile; // Minimum tile index (bounding box)
TileIndex max_tile; // Maximum tile index (bounding box)
};
Class: TileManager
Constructor
TileManager(const std::string& base_path, double tile_size, double resolution);
Parameter |
Description |
|---|---|
|
Root directory for tile storage |
|
Tile size in meters (default: 10.0) |
|
Voxel resolution in meters (default: 0.05) |
initialize
bool initialize();
Initialize tile manager:
Create base directory if needed
Load existing metadata or save initial metadata
Coordinate Conversion
world_to_tile_index
TileIndex world_to_tile_index(double x, double y, double z) const;
TileIndex world_to_tile_index(const octomap::point3d& point) const;
Convert world coordinates to tile index using floor division.
int ix = static_cast<int>(std::floor(x / tile_size_));
int iy = static_cast<int>(std::floor(y / tile_size_));
int iz = static_cast<int>(std::floor(z / tile_size_));
Example (tile_size = 10.0):
(5.0, 15.0, -3.0) → TileIndex(0, 1, -1)
(-5.0, 0.0, 25.0) → TileIndex(-1, 0, 2)
Path Management
get_tile_directory
std::string get_tile_directory(const TileIndex& idx) const;
Generate tile directory path.
// Returns: "{base_path}/tile_{x}_{y}_{z}"
// Example: "/map_tiles/tile_0_1_-1"
tile_exists
bool tile_exists(const TileIndex& idx) const;
Check if tile directory exists on disk.
Tile Enumeration
list_all_tiles
std::vector<TileIndex> list_all_tiles() const;
Enumerate all tile directories.
Implementation:
Iterate
base_path_directoryParse each subdirectory name using regex:
tile_(-?[0-9]+)_(-?[0-9]+)_(-?[0-9]+)Return valid tile indices
get_tiles_in_region
std::vector<TileIndex> get_tiles_in_region(
const Eigen::Vector3d& min_bound,
const Eigen::Vector3d& max_bound) const;
Get all tiles intersecting a bounding box.
TileIndex min_idx = world_to_tile_index(min_bound);
TileIndex max_idx = world_to_tile_index(max_bound);
for (int ix = min_idx.x; ix <= max_idx.x; ++ix)
for (int iy = min_idx.y; iy <= max_idx.y; ++iy)
for (int iz = min_idx.z; iz <= max_idx.z; ++iz)
tiles.emplace_back(ix, iy, iz);
Metadata Management
save_metadata / load_metadata
bool save_metadata();
bool load_metadata();
Persist/load global metadata to/from metadata.json.
JSON Format:
{
"version": "1.0",
"resolution": 0.05,
"tile_size": 10.0,
"bounds": {
"min": [0, -1, 0],
"max": [5, 3, 2]
}
}
Implementation: Simple regex-based JSON parsing (no external library).
update_bounds
void update_bounds(const TileIndex& idx);
Expand bounding box to include new tile.
metadata_.min_tile.x = std::min(metadata_.min_tile.x, idx.x);
metadata_.max_tile.x = std::max(metadata_.max_tile.x, idx.x);
// ... y, z
Tile Operations
delete_tile
bool delete_tile(const TileIndex& idx);
Delete tile directory and all contents.
get_disk_usage
size_t get_disk_usage() const;
Calculate total disk usage (bytes) using recursive directory iteration.
Getters
const std::string& get_base_path() const;
double get_tile_size() const;
double get_resolution() const;
const MapMetadata& get_metadata() const;
Directory Structure
/map_tiles/ ← base_path_
├── metadata.json ← Global metadata
├── tile_0_0_0/
│ ├── octree.bt
│ └── iwlo_meta.bin
├── tile_1_0_0/
│ ├── octree.bt
│ └── iwlo_meta.bin
├── tile_0_1_-1/
│ ├── octree.bt
│ └── iwlo_meta.bin
└── ...
Usage Example
#include "tile_manager.h"
TileManager manager("/workspace/data/map_tiles", 10.0, 0.05);
manager.initialize();
// Convert world point to tile
TileIndex idx = manager.world_to_tile_index(15.5, -3.2, 7.8);
// Result: TileIndex(1, -1, 0)
// Get tile path
std::string path = manager.get_tile_directory(idx);
// Result: "/workspace/data/map_tiles/tile_1_-1_0"
// List all tiles
auto tiles = manager.list_all_tiles();
// Get tiles in region
auto region_tiles = manager.get_tiles_in_region(
Eigen::Vector3d(0, 0, 0),
Eigen::Vector3d(50, 50, 10)
);