use std::f64::consts::PI;
use log::debug;
use crate::coordinate::Point;
pub const EARTH_RADIUS: f64 = 6378137.0;
pub fn wgs84_to_web_mercator(lon: f64, lat: f64) -> Point {
use std::f64::consts::PI;
let lat_constrained = lat.max(-85.06).min(85.06);
let x = lon * PI * 6378137.0 / 180.0;
let lat_rad = lat_constrained * PI / 180.0;
let y = 6378137.0 * f64::ln(f64::tan(PI/4.0 + lat_rad/2.0));
debug!("Transformed WGS84 ({}, {}) to Web Mercator ({}, {})",
lon, lat, x, y);
Point::new(x, y)
}
pub fn web_mercator_to_wgs84(x: f64, y: f64) -> Point {
let lon = (x * 180.0) / (EARTH_RADIUS * PI);
let lat = (2.0 * f64::atan(f64::exp(y / EARTH_RADIUS)) - PI/2.0) * 180.0 / PI;
debug!("Transformed Web Mercator ({}, {}) to WGS84 ({}, {})",
x, y, lon, lat);
Point::new(lon, lat)
}
pub fn wgs84_bbox_to_web_mercator(min_x: f64, min_y: f64, max_x: f64, max_y: f64) -> (f64, f64, f64, f64) {
let sw = wgs84_to_web_mercator(min_x, min_y);
let ne = wgs84_to_web_mercator(max_x, max_y);
let min_mercator_x = sw.x.min(ne.x);
let min_mercator_y = sw.y.min(ne.y);
let max_mercator_x = sw.x.max(ne.x);
let max_mercator_y = sw.y.max(ne.y);
debug!("Transformed WGS84 bbox ({}, {}, {}, {}) to Web Mercator ({}, {}, {}, {})",
min_x, min_y, max_x, max_y, min_mercator_x, min_mercator_y, max_mercator_x, max_mercator_y);
(min_mercator_x, min_mercator_y, max_mercator_x, max_mercator_y)
}