Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import PackageDescription

let package = Package(
name: "MGRS",
platforms: [.macOS(.v11), .iOS(.v13)],
platforms: [.macOS(.v11), .iOS(.v13), .watchOS(.v10)],
products: [
.library(
name: "MGRS",
targets: ["MGRS"])
],
dependencies: [
.package(url: "https://github.com/ngageoint/grid-ios", from: "2.0.0")
.package(url: "https://github.com/fawkeswei/grid-ios", from: "2.0.1")
],
targets: [
.target(
Expand Down
4 changes: 4 additions & 0 deletions mgrs-ios/tile/MGRSTileOverlay.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
// Created by Brian Osborn on 9/2/22.
//

#if !os(watchOS)

import MapKit
import Grid

Expand Down Expand Up @@ -352,3 +354,5 @@ public class MGRSTileOverlay: MKTileOverlay {
}

}

#endif
40 changes: 38 additions & 2 deletions mgrs-ios/utm/UTM.swift
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,47 @@ public class UTM {
north -= 10000000.0
}

var latitude = (north/6366197.724/0.9996+(1+0.006739496742*pow(cos(north/6366197.724/0.9996),2)-0.006739496742*sin(north/6366197.724/0.9996)*cos(north/6366197.724/0.9996)*(atan(cos(atan(( exp((easting - 500000) / (0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2))))*(1-0.006739496742*pow((easting - 500000) / (0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2)))),2)/2*pow(cos(north/6366197.724/0.9996),2)/3))-exp(-(easting-500000)/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2))))*( 1 - 0.006739496742*pow((easting - 500000) / (0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2)))),2)/2*pow(cos(north/6366197.724/0.9996),2)/3)))/2/cos((north-0.9996*6399593.625*(north/6366197.724/0.9996-0.006739496742*3/4*(north/6366197.724/0.9996+sin(2*north/6366197.724/0.9996)/2)+pow(0.006739496742*3/4,2)*5/3*(3*(north/6366197.724/0.9996+sin(2*north/6366197.724/0.9996 )/2)+sin(2*north/6366197.724/0.9996)*pow(cos(north/6366197.724/0.9996),2))/4-pow(0.006739496742*3/4,3)*35/27*(5*(3*(north/6366197.724/0.9996+sin(2*north/6366197.724/0.9996)/2)+sin(2*north/6366197.724/0.9996)*pow(cos(north/6366197.724/0.9996),2))/4+sin(2*north/6366197.724/0.9996)*pow(cos(north/6366197.724/0.9996),2)*pow(cos(north/6366197.724/0.9996),2))/3))/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2))))*(1-0.006739496742*pow((easting-500000)/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2)))),2)/2*pow(cos(north/6366197.724/0.9996),2))+north/6366197.724/0.9996)))*tan((north-0.9996*6399593.625*(north/6366197.724/0.9996 - 0.006739496742*3/4*(north/6366197.724/0.9996+sin(2*north/6366197.724/0.9996)/2)+pow(0.006739496742*3/4,2)*5/3*(3*(north/6366197.724/0.9996+sin(2*north/6366197.724/0.9996)/2)+sin(2*north/6366197.724/0.9996 )*pow(cos(north/6366197.724/0.9996),2))/4-pow(0.006739496742*3/4,3)*35/27*(5*(3*(north/6366197.724/0.9996+sin(2*north/6366197.724/0.9996)/2)+sin(2*north/6366197.724/0.9996)*pow(cos(north/6366197.724/0.9996),2))/4+sin(2*north/6366197.724/0.9996)*pow(cos(north/6366197.724/0.9996),2)*pow(cos(north/6366197.724/0.9996),2))/3))/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2))))*(1-0.006739496742*pow((easting-500000)/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2)))),2)/2*pow(cos(north/6366197.724/0.9996),2))+north/6366197.724/0.9996))-north/6366197.724/0.9996)*3/2)*(atan(cos(atan((exp((easting-500000)/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2))))*(1-0.006739496742*pow((easting-500000)/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2)))),2)/2*pow(cos(north/6366197.724/0.9996),2)/3))-exp(-(easting-500000)/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2))))*(1-0.006739496742*pow((easting-500000)/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2)))),2)/2*pow(cos(north/6366197.724/0.9996),2)/3)))/2/cos((north-0.9996*6399593.625*(north/6366197.724/0.9996-0.006739496742*3/4*(north/6366197.724/0.9996+sin(2*north/6366197.724/0.9996)/2)+pow(0.006739496742*3/4,2)*5/3*(3*(north/6366197.724/0.9996+sin(2*north/6366197.724/0.9996)/2)+sin(2*north/6366197.724/0.9996)*pow(cos(north/6366197.724/0.9996),2))/4-pow(0.006739496742*3/4,3)*35/27*(5*(3*(north/6366197.724/0.9996+sin(2*north/6366197.724/0.9996)/2)+sin(2*north/6366197.724/0.9996)*pow(cos(north/6366197.724/0.9996),2))/4+sin(2*north/6366197.724/0.9996)*pow(cos(north/6366197.724/0.9996),2)*pow(cos(north/6366197.724/0.9996),2))/3))/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2))))*(1-0.006739496742*pow((easting-500000)/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2)))),2)/2*pow(cos(north/6366197.724/0.9996),2))+north/6366197.724/0.9996)))*tan((north-0.9996*6399593.625*(north/6366197.724/0.9996-0.006739496742*3/4*(north/6366197.724/0.9996+sin(2*north/6366197.724/0.9996)/2)+pow(0.006739496742*3/4,2)*5/3*(3*(north/6366197.724/0.9996+sin(2*north/6366197.724/0.9996)/2)+sin(2*north/6366197.724/0.9996)*pow(cos(north/6366197.724/0.9996),2))/4-pow(0.006739496742*3/4,3)*35/27*(5*(3*(north/6366197.724/0.9996+sin(2*north/6366197.724/0.9996)/2)+sin(2*north/6366197.724/0.9996)*pow(cos(north/6366197.724/0.9996),2))/4+sin(2*north/6366197.724/0.9996)*pow(cos(north/6366197.724/0.9996),2)*pow(cos(north/6366197.724/0.9996),2))/3))/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2))))*(1-0.006739496742*pow((easting-500000)/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2)))),2)/2*pow(cos(north/6366197.724/0.9996),2))+north/6366197.724/0.9996))-north/6366197.724/0.9996))*180/Double.pi
// Second eccentricity squared
let ep2 = 0.006739496742
// Footpoint latitude (initial approximation)
let phi = north / 6366197.724 / 0.9996
let cosPhi = cos(phi)
let cosPhi2 = cosPhi * cosPhi
let sinPhi = sin(phi)
let sin2Phi = sin(2.0 * phi)
let ei = easting - 500000.0

// Radius of curvature in prime vertical
let primeVerticalRadius = 0.9996 * 6399593.625 / sqrt(1.0 + ep2 * cosPhi2)

// Meridional arc
let c = ep2 * 3.0 / 4.0
let ma1 = phi + sin2Phi / 2.0
let ma2 = 3.0 * ma1 + sin2Phi * cosPhi2
let ma3 = 5.0 * ma2 / 4.0 + sin2Phi * cosPhi2 * cosPhi2
let meridionalArc = 0.9996 * 6399593.625 * (phi - c * ma1 + c * c * 5.0 / 3.0 * ma2 / 4.0 - c * c * c * 35.0 / 27.0 * ma3 / 3.0)

// Easting correction
let eiOverN = ei / primeVerticalRadius
let eiCorr = ep2 * eiOverN * eiOverN / 2.0 * cosPhi2

// Footpoint latitude (refined)
let fp = (north - meridionalArc) / primeVerticalRadius * (1.0 - eiCorr) + phi

// Hyperbolic-like term for easting
let expArg = eiOverN * (1.0 - eiCorr / 3.0)
let sinhTerm = (exp(expArg) - exp(-expArg)) / 2.0
let cosFp = cos(fp)

// Latitude delta correction
let atanSinhOverCosFp = atan(sinhTerm / cosFp)
let delta = atan(cos(atanSinhOverCosFp) * tan(fp)) - phi

var latitude = (phi + (1.0 + ep2 * cosPhi2 - ep2 * sinPhi * cosPhi * delta * 3.0 / 2.0) * delta) * 180.0 / Double.pi
latitude = round(latitude * 10000000)
latitude = latitude / 10000000

var longitude = atan((exp((easting-500000)/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2))))*(1-0.006739496742*pow((easting-500000)/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2)))),2)/2*pow(cos(north/6366197.724/0.9996),2)/3))-exp(-(easting-500000)/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2))))*(1-0.006739496742*pow((easting-500000)/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2)))),2)/2*pow(cos(north/6366197.724/0.9996),2)/3)))/2/cos((north-0.9996*6399593.625*( north/6366197.724/0.9996-0.006739496742*3/4*(north/6366197.724/0.9996+sin(2*north/6366197.724/0.9996)/2)+pow(0.006739496742*3/4,2)*5/3*(3*(north/6366197.724/0.9996+sin(2*north/6366197.724/0.9996)/2)+sin(2*north/6366197.724/0.9996)*pow(cos(north/6366197.724/0.9996),2))/4-pow(0.006739496742*3/4,3)*35/27*(5*(3*(north/6366197.724/0.9996+sin(2*north/6366197.724/0.9996)/2)+sin(2*north/6366197.724/0.9996)*pow(cos(north/6366197.724/0.9996),2))/4+sin(2*north/6366197.724/0.9996)*pow(cos(north/6366197.724/0.9996),2)*pow(cos(north/6366197.724/0.9996),2))/3)) / (0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2))))*(1-0.006739496742*pow((easting-500000)/(0.9996*6399593.625/sqrt((1+0.006739496742*pow(cos(north/6366197.724/0.9996),2)))),2)/2*pow(cos(north/6366197.724/0.9996),2))+north/6366197.724/0.9996))*180/Double.pi+Double(zone)*6-183
var longitude = atanSinhOverCosFp * 180.0 / Double.pi + Double(zone) * 6.0 - 183.0
longitude = round(longitude * 10000000)
longitude = longitude / 10000000

Expand Down