voxcity.utils.GridProjectorΒΆ

class voxcity.utils.GridProjector(geom: GridGeom)ΒΆ

Projects between lon_lat (WGS84) and uv_m (local grid metres).

The 2Γ—2 affine A maps (u_cell, v_cell) β†’ (dlon, dlat):

A = [[u_vec[0]*du_m, v_vec[0]*dv_m],
     [u_vec[1]*du_m, v_vec[1]*dv_m]]

where (du_m, dv_m) = adj_mesh. A⁻¹ is pre-computed for O(1) calls. Accepts both scalars and numpy arrays.

lon_lat_to_uv_m(lon: ArrayLike, lat: ArrayLike) tuple[ArrayLike, ArrayLike]ΒΆ

lon_lat β†’ uv_m. Accepts scalars or numpy arrays.

Returns (u_m, v_m) where u_m = metres along u_vec from grid origin, v_m = metres along v_vec from grid origin. Cell (i, j) occupies uv_m in [i*du_m, (i+1)*du_m) Γ— [j*dv_m, (j+1)*dv_m).

uv_m_to_lon_lat(u_m: ArrayLike, v_m: ArrayLike) tuple[ArrayLike, ArrayLike]ΒΆ

uv_m β†’ lon_lat. Exact inverse of lon_lat_to_uv_m.

lon_lat_to_cell(lon: ArrayLike, lat: ArrayLike) tupleΒΆ

lon_lat β†’ (i, j) integer cell index.

Uses floor division β€” safe for boundary points and negative coordinates. Scalar inputs return Python ints; array inputs return int ndarrays.

cell_to_lon_lat(i: ArrayLike, j: ArrayLike) tuple[ArrayLike, ArrayLike]ΒΆ

Cell centre (i+0.5, j+0.5) β†’ lon_lat.