* Scene zarr file specification and validate_scene() (#88)
Adds a spec document defining the on-disk zarr format for explore()
scenes and a validate_scene() function to check conformance.
* Add LOD sections to scene zarr spec (#88)
Covers terrain tile roughness, terrain LOD tiling parameters,
and pre-simplified mesh LOD arrays. Adds validation and tests
for roughness metadata and partial mesh LOD detection.
* Add point cloud attributes to scene zarr spec (#88)
Sphere geometries now spec classification, intensity, rgb,
return_number, and number_of_returns arrays for LiDAR data.
Validation checks attribute length consistency against point count.
* Add CRS section to scene zarr spec (#88)
spatial_ref is the single source of truth for the scene CRS.
New "Coordinate reference system" section explains how CRS applies
across all groups. Wind/weather grid_bounds explicitly noted as
scene CRS. Optional epsg attribute on spatial_ref for quick lookup.
Point cloud source_crs is provenance only.
* Add build_scene() and explore_scene() for offline scene preparation (#88)
build_scene(bounds, output_path) fetches 30m Copernicus DEM, Overture
buildings/water, Open-Meteo wind/weather, and writes everything into
a single spec-conforming scene zarr. explore_scene() opens it.
Available as:
- rtxpy.build_scene(bounds, "scene.zarr")
- rtxpy.explore_scene("scene.zarr")
- rtxpy-build-scene -112.2 36.0 -112.0 36.2 scene.zarr
- python -m rtxpy.scene -112.2 36.0 -112.0 36.2 scene.zarr
* Use blosc+bitshuffle compression for all scene zarr arrays (#88)
Mesh arrays and wind/weather/hydro data were using plain zstd.
Switching to BloscCodec(zstd, bitshuffle, clevel=6) cuts scene
file size nearly in half (448 KB → 229 KB on test scene).
* Add scene file section to README (#88)
* Add 119 preset location bounds for scene building (#88)
36 countries, 36 cities, 47 landscapes — all (west, south, east, north)
in WGS 84. Includes find() for substring search and list_locations()
for browsing. Wired into __init__.py as COUNTRIES, CITIES, LANDSCAPES.
* Add recommended CRS to all preset locations (#88)
Location is now a tuple subclass with a .crs attribute — unpacking
as (west, south, east, north) still works, so build_scene(loc, ...)
is backwards compatible. Countries use well-known national grids
(EPSG:27700 for UK, EPSG:5070 for US, EPSG:2056 for Switzerland,
etc). Cities and landscapes get UTM computed from the bbox center.
* Add units to Location, explain CRS choices in README (#88)
Location now carries a .units attribute ('meters' for all current CRS).
_CRS_UNITS lookup table makes it easy to add feet-based CRS later.
README explains why UTM for cities/landscapes and national grids for
countries — the viewer needs metric coordinates for terrain, buildings,
and particle simulations.
* Improve build_scene: roads, fires, parallel fetches, resume, roughness (#88)
1. Fix wind/weather 414 URI Too Large — adaptive grid_size scales to
bbox extent, capped at 12 (144 points, ~3600 chars in URL)
2. Auto-detect CRS from Location objects — build_scene(loc, ...) uses
loc.crs when crs=None
3. Add roads (Overture, on by default) and fires (FIRMS, opt-in)
4. progress= callback for structured logging (replaces print())
5. Parallel network fetches — buildings, roads, water, fires run
concurrently via ThreadPoolExecutor; wind + weather also parallel
6. resume=True skips groups already present in the zarr
7. Precompute per-tile elevation roughness for LOD (bilinear corner
fit residual std, written to elevation_roughness/ group)
8. CLI: --no-roads, --fires, --resume flags
8 new tests covering adaptive grid, roughness, Location, new CLI flags.