use std::f64::consts::PI;
fn to_u32(n: f64) -> Option<u32>
{
if n >= 0.0 && n <= u32::MAX as f64
{
Some(n as u32)
}
else
{
None
}
}
pub(crate) fn lon_to_tile_x(lon: f64, z: u32) -> Option<u32>
{
let z = (1 << z) as f64;
to_u32(((lon + 180.0) / 360.0 * z).floor())
}
pub(crate) fn lat_to_tile_y(lat: f64, z: u32) -> Option<u32>
{
let latrad = lat * PI / 180.0;
let z = (1 << z) as f64;
to_u32(((1.0 - latrad.tan().asinh() / PI) / 2.0 * z).floor())
}
pub(crate) fn tile_x_to_lon(x: u32, z: u32) -> f64
{
let x = x as f64;
let z = (1 << z) as f64;
x / z * 360.0 - 180.0
}
pub(crate) fn tile_y_to_lat(y: u32, z: u32) -> f64
{
let z = (1 << z) as f64;
let n = PI - 2.0 * PI * (y as f64) / z;
180.0 / PI * (0.5 * (n.exp() - (-n).exp())).atan()
}