///|
/// Scenario 2: field survey points (incl. Norway/Svalbard exceptions and a
/// polar UPS point) go WGS-84 -> UTM/UPS -> MGRS -> back, with residuals.
/// Run: `moon run src/examples/s2_utm_mgrs`
fn main {
let g = @geodesic.Geodesic::wgs84()
let pts : Array[(String, Double, Double)] = [
("Beijing", 39.9087, 116.3975),
("Sydney", -33.8688, 151.2093),
("Bergen (zone 32V exception)", 60.3913, 5.3221),
("Svalbard (zone 33X exception)", 78.2232, 15.6267),
("South Pole station (UPS)", -89.9978, 139.2729),
]
for p in pts {
let (name, lat, lon) = p
show(g, name, lat, lon) catch {
_ => println("\{name}: conversion failed")
}
}
}
///|
fn show(
g : @geodesic.Geodesic,
name : String,
lat : Double,
lon : Double,
) -> Unit raise {
let u = @utm.from_latlon(lat, lon)
let m = u.to_mgrs(lat, precision=5)
let d = @utm.from_mgrs(m, centered=false)
let back = @utm.to_latlon(u.zone, u.north, u.easting, u.northing)
let utm_rt = g.inverse(lat, lon, back.lat, back.lon).s12
// 1 m MGRS truncation: the SW corner must lie within sqrt(2) m.
let mgrs_off = g.inverse(lat, lon, d.lat, d.lon).s12
println(name)
println(" UTM/UPS \{u.to_string()} (k=\{u.k})")
println(" MGRS \{m}")
println(
" UTM round trip \{utm_rt} m; MGRS 1 m cell corner offset \{mgrs_off} m",
)
}